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();