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