Reference count the TLS objects.
Bug 20045861
Change-Id: I4881187cb45b6c818ceca2d950977b3af43443ab
Reviewed-on: https://swiftshader-review.googlesource.com/2795
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libEGL/Context.hpp b/src/OpenGL/libEGL/Context.hpp
index 01078b4..b48789f 100644
--- a/src/OpenGL/libEGL/Context.hpp
+++ b/src/OpenGL/libEGL/Context.hpp
@@ -1,6 +1,8 @@
#ifndef egl_Context_hpp
#define egl_Context_hpp
+#include "common/Object.hpp"
+
#define EGLAPI
#include <EGL/egl.h>
#define GL_API
@@ -11,16 +13,17 @@
class Surface;
class Image;
-class Context
+class Context : public gl::Object
{
public:
- virtual ~Context() {};
- virtual void destroy() = 0;
virtual void makeCurrent(Surface *surface) = 0;
virtual void bindTexImage(Surface *surface) = 0;
virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual int getClientVersion() = 0;
+
+protected:
+ virtual ~Context() {};
};
}
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 097d913..cbd4d27 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -289,10 +289,11 @@
if(!surface->initialize())
{
- delete surface;
+ surface->release();
return EGL_NO_SURFACE;
}
+ surface->addRef();
mSurfaceSet.insert(surface);
return success(surface);
@@ -391,10 +392,11 @@
if(!surface->initialize())
{
- delete surface;
+ surface->release();
return EGL_NO_SURFACE;
}
+ surface->addRef();
mSurfaceSet.insert(surface);
return success(surface);
@@ -430,14 +432,15 @@
return error(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
}
+ context->addRef();
mContextSet.insert(context);
- return success(context);;
+ return success(context);
}
void Display::destroySurface(egl::Surface *surface)
{
- delete surface;
+ surface->release();
mSurfaceSet.erase(surface);
if(surface == getCurrentDrawSurface())
@@ -453,7 +456,7 @@
void Display::destroyContext(egl::Context *context)
{
- context->destroy();
+ context->release();
mContextSet.erase(context);
if(context == getCurrentContext())
diff --git a/src/OpenGL/libEGL/Surface.cpp b/src/OpenGL/libEGL/Surface.cpp
index 466f10f..0770848 100644
--- a/src/OpenGL/libEGL/Surface.cpp
+++ b/src/OpenGL/libEGL/Surface.cpp
@@ -71,7 +71,7 @@
Surface::~Surface()
{
- release();
+ deleteResources();
}
bool Surface::initialize()
@@ -81,7 +81,7 @@
return reset();
}
-void Surface::release()
+void Surface::deleteResources()
{
if(mDepthStencil)
{
@@ -130,7 +130,7 @@
bool Surface::reset(int backBufferWidth, int backBufferHeight)
{
- release();
+ deleteResources();
if(mWindow)
{
@@ -139,7 +139,7 @@
if(!frameBuffer)
{
ERR("Could not create frame buffer");
- release();
+ deleteResources();
return error(EGL_BAD_ALLOC, false);
}
}
@@ -149,7 +149,7 @@
if(!backBuffer)
{
ERR("Could not create back buffer");
- release();
+ deleteResources();
return error(EGL_BAD_ALLOC, false);
}
@@ -160,7 +160,7 @@
if(!mDepthStencil)
{
ERR("Could not create depth/stencil buffer for surface");
- release();
+ deleteResources();
return error(EGL_BAD_ALLOC, false);
}
}
diff --git a/src/OpenGL/libEGL/Surface.h b/src/OpenGL/libEGL/Surface.h
index 1db6fc1..2ddc54d 100644
--- a/src/OpenGL/libEGL/Surface.h
+++ b/src/OpenGL/libEGL/Surface.h
@@ -17,6 +17,7 @@
#define INCLUDE_SURFACE_H_
#include "Main/FrameBuffer.hpp"
+#include "common/Object.hpp"
#define EGLAPI
#include <EGL/egl.h>
@@ -28,14 +29,12 @@
class Texture;
class Image;
-class Surface
+class Surface : public gl::Object
{
public:
Surface(Display *display, const egl::Config *config, EGLNativeWindowType window);
Surface(Display *display, const egl::Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);
- virtual ~Surface();
-
bool initialize();
void swap();
@@ -65,7 +64,9 @@
bool checkForResize(); // Returns true if surface changed due to resize
private:
- void release();
+ virtual ~Surface();
+
+ void deleteResources();
bool reset();
Display *const mDisplay;
diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp
index 33facde..4f9c731 100644
--- a/src/OpenGL/libEGL/main.cpp
+++ b/src/OpenGL/libEGL/main.cpp
@@ -13,6 +13,9 @@
#include "main.h"
+#include "Context.hpp"
+#include "Surface.h"
+
#include "resource.h"
#include "Common/Thread.hpp"
#include "Common/SharedLibrary.hpp"
@@ -259,6 +262,16 @@
{
Current *current = eglGetCurrent();
+ if(ctx)
+ {
+ ctx->addRef();
+ }
+
+ if(current->context)
+ {
+ current->context->release();
+ }
+
current->context = ctx;
}
@@ -273,6 +286,16 @@
{
Current *current = eglGetCurrent();
+ if(surface)
+ {
+ surface->addRef();
+ }
+
+ if(current->drawSurface)
+ {
+ current->drawSurface->release();
+ }
+
current->drawSurface = surface;
}
@@ -287,6 +310,16 @@
{
Current *current = eglGetCurrent();
+ if(surface)
+ {
+ surface->addRef();
+ }
+
+ if(current->readSurface)
+ {
+ current->readSurface->release();
+ }
+
current->readSurface = surface;
}
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 7801633..0ca4654 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -255,11 +255,6 @@
markAllStateDirty();
}
-void Context::destroy()
-{
- delete this;
-}
-
int Context::getClientVersion()
{
return 1;
diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 84340b0..9d6c074 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -263,7 +263,6 @@
Context(const egl::Config *config, const Context *shareContext);
virtual void makeCurrent(egl::Surface *surface);
- virtual void destroy();
virtual int getClientVersion();
void markAllStateDirty();
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 1e9f84a..120035c 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -295,11 +295,6 @@
markAllStateDirty();
}
-void Context::destroy()
-{
- delete this;
-}
-
EGLint Context::getClientVersion()
{
return clientVersion;
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 1ec194b..2105cc4 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -275,7 +275,6 @@
Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion);
virtual void makeCurrent(egl::Surface *surface);
- virtual void destroy();
virtual EGLint getClientVersion();
void markAllStateDirty();