OSDN Git Service

Delete EGL images only after eglDestroyImageKHR.
authorNicolas Capens <capn@google.com>
Mon, 10 Nov 2014 21:22:07 +0000 (16:22 -0500)
committerNicolas Capens <nicolascapens@google.com>
Mon, 10 Nov 2014 22:04:47 +0000 (22:04 +0000)
BUG=18316605

Change-Id: I85944b87642664c6202bacdfc852e9cedabc79a9
Reviewed-on: https://swiftshader-review.googlesource.com/1357
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
src/OpenGL/libEGL/Image.hpp
src/OpenGL/libEGL/libEGL.cpp
src/OpenGL/libGLES_CM/Image.cpp
src/OpenGL/libGLESv2/Image.cpp

index 2ca4525..9a5c4f2 100644 (file)
@@ -3,6 +3,8 @@
 \r
 #include "Renderer/Surface.hpp"\r
 \r
+#include <assert.h>\r
+\r
 namespace egl\r
 {\r
 // Types common between gl.h and gl2.h\r
@@ -58,27 +60,27 @@ public:
                return multiSampleDepth;\r
        }\r
 \r
-       bool Image::isShared() const\r
+       bool isShared() const\r
     {\r
         return shared;\r
     }\r
 \r
-    void Image::markShared()\r
+    void markShared()\r
     {\r
         shared = true;\r
     }\r
 \r
-       void *Image::lock(unsigned int left, unsigned int top, sw::Lock lock)\r
+       void *lock(unsigned int left, unsigned int top, sw::Lock lock)\r
        {\r
                return lockExternal(left, top, 0, lock, sw::PUBLIC);\r
        }\r
 \r
-       unsigned int Image::getPitch() const\r
+       unsigned int getPitch() const\r
        {\r
                return getExternalPitchB();\r
        }\r
 \r
-       void Image::unlock()\r
+       void unlock()\r
        {\r
                unlockExternal();\r
        }\r
@@ -87,10 +89,21 @@ public:
        virtual void release() = 0;\r
        virtual void unbind() = 0;   // Break parent ownership and release\r
 \r
+       void destroyShared()   // Release a shared image\r
+    {\r
+               assert(shared);\r
+        shared = false;\r
+               release();\r
+    }\r
+\r
        virtual void loadImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *input) = 0;\r
        virtual void loadCompressedData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) = 0;\r
 \r
 protected:\r
+       virtual ~Image() = 0\r
+       {\r
+       }\r
+\r
        const GLsizei width;\r
        const GLsizei height;\r
        const GLenum format;\r
@@ -98,7 +111,6 @@ protected:
        const sw::Format internalFormat;\r
        const int multiSampleDepth;\r
 \r
-private:\r
        bool shared;   // Used as an EGLImage\r
 };\r
 }\r
index 7a6d56d..ef0b570 100644 (file)
@@ -1080,6 +1080,8 @@ EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNat
 \r
 EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)\r
 {\r
+       TRACE("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLenum target = 0x%X, buffer = 0x%0.8p, const EGLint attrib_list = 0x%0.8p)", dpy, ctx, target, buffer, attrib_list);\r
+\r
     try\r
     {\r
         egl::Display *display = static_cast<egl::Display*>(dpy);\r
@@ -1154,6 +1156,8 @@ EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenu
 \r
 EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)\r
 {\r
+       TRACE("(EGLDisplay dpy = 0x%0.8p, EGLImageKHR image = 0x%0.8p)", dpy, image);\r
+\r
     try\r
     {\r
         egl::Display *display = static_cast<egl::Display*>(dpy);\r
@@ -1169,7 +1173,7 @@ EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
         }\r
 \r
         egl::Image *glImage = static_cast<egl::Image*>(image);\r
-        glImage->release();\r
+        glImage->destroyShared();\r
 \r
         return success(EGL_TRUE);\r
     }\r
index 5268845..981cfc9 100644 (file)
@@ -72,7 +72,7 @@ namespace es1
                        sw::atomicDecrement(&referenceCount);
                }
 
-               if(referenceCount == 0)
+               if(referenceCount == 0 && !shared)
                {
                        delete this;
                }
index 541923f..2c5dcda 100644 (file)
@@ -71,7 +71,7 @@ namespace es2
                        sw::atomicDecrement(&referenceCount);
                }
 
-               if(referenceCount == 0)
+               if(referenceCount == 0 && !shared)
                {
                        delete this;
                }