Commit fa0cc04a by Nicolas Capens Committed by Nicolas Capens

Fix an image destruction deadlock.

The EGL image extension allows a texture image to be shared with another texture. We previously prevented destroying them as long as they are shared but the parent texture (which owns the resource lock for all its images) could be destroyed before the EGL image is destroyed, causing a deadlock when trying to acquire the resource lock. The situation was aggravated by increasing the parent texture's reference count with the image reference count (i.e. not the 'owning' texture's reference count). This fix ensures that the parent texture can only destroy the images it owns. Bug 18680652 Change-Id: I7fa09d181e695cbc287e77874bdb88f24c22cbd8 Reviewed-on: https://swiftshader-review.googlesource.com/1601Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 4cadfe33
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
// that need to be reference counted for correct cross-context deletion. // that need to be reference counted for correct cross-context deletion.
// (Concretely, textures, buffers and renderbuffers.) // (Concretely, textures, buffers and renderbuffers.)
#include "RefCountObject.h" #include "Object.hpp"
#include "Common/Thread.hpp" #include "Common/Thread.hpp"
namespace es1 namespace gl
{ {
RefCountObject::RefCountObject(GLuint id) RefCountObject::RefCountObject(GLuint id)
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
// or implied, including but not limited to any patent rights, are granted to you. // or implied, including but not limited to any patent rights, are granted to you.
// //
// RefCountObject.h: Defines the RefCountObject base class that provides // Object.hpp: Defines the RefCountObject base class that provides
// lifecycle support for GL objects using the traditional BindObject scheme, but // lifecycle support for GL objects using the traditional BindObject scheme, but
// that need to be reference counted for correct cross-context deletion. // that need to be reference counted for correct cross-context deletion.
// (Concretely, textures, buffers and renderbuffers.) // (Concretely, textures, buffers and renderbuffers.)
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <cstddef> #include <cstddef>
namespace es2 namespace gl
{ {
class RefCountObject class RefCountObject
......
...@@ -13,6 +13,8 @@ typedef unsigned int GLenum; ...@@ -13,6 +13,8 @@ typedef unsigned int GLenum;
typedef int GLint; typedef int GLint;
typedef int GLsizei; typedef int GLsizei;
class Texture;
class Image : public sw::Surface class Image : public sw::Surface
{ {
public: public:
...@@ -87,7 +89,7 @@ public: ...@@ -87,7 +89,7 @@ public:
virtual void addRef() = 0; virtual void addRef() = 0;
virtual void release() = 0; virtual void release() = 0;
virtual void unbind() = 0; // Break parent ownership and release virtual void unbind(const Texture *parent) = 0; // Break parent ownership and release
void destroyShared() // Release a shared image void destroyShared() // Release a shared image
{ {
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "main.h" #include "main.h"
#include "Display.h" #include "Display.h"
#include "Texture2D.hpp" #include "Texture.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "Context.hpp" #include "Context.hpp"
#include "common/debug.h" #include "common/debug.h"
...@@ -262,12 +262,12 @@ EGLenum Surface::getTextureTarget() const ...@@ -262,12 +262,12 @@ EGLenum Surface::getTextureTarget() const
return mTextureTarget; return mTextureTarget;
} }
void Surface::setBoundTexture(egl::Texture2D *texture) void Surface::setBoundTexture(egl::Texture *texture)
{ {
mTexture = texture; mTexture = texture;
} }
egl::Texture2D *Surface::getBoundTexture() const egl::Texture *Surface::getBoundTexture() const
{ {
return mTexture; return mTexture;
} }
......
...@@ -25,7 +25,7 @@ namespace egl ...@@ -25,7 +25,7 @@ namespace egl
{ {
class Display; class Display;
class Config; class Config;
class Texture2D; class Texture;
class Image; class Image;
class Surface class Surface
...@@ -56,8 +56,8 @@ public: ...@@ -56,8 +56,8 @@ public:
virtual EGLenum getTextureTarget() const; virtual EGLenum getTextureTarget() const;
virtual sw::Format getInternalFormat() const; virtual sw::Format getInternalFormat() const;
virtual void setBoundTexture(egl::Texture2D *texture); virtual void setBoundTexture(egl::Texture *texture);
virtual egl::Texture2D *getBoundTexture() const; virtual egl::Texture *getBoundTexture() const;
bool checkForResize(); // Returns true if surface changed due to resize bool checkForResize(); // Returns true if surface changed due to resize
...@@ -69,7 +69,7 @@ private: ...@@ -69,7 +69,7 @@ private:
egl::Image *mDepthStencil; egl::Image *mDepthStencil;
sw::FrameBuffer *frameBuffer; sw::FrameBuffer *frameBuffer;
egl::Image *backBuffer; egl::Image *backBuffer;
egl::Texture2D *mTexture; egl::Texture *mTexture;
bool reset(int backbufferWidth, int backbufferHeight); bool reset(int backbufferWidth, int backbufferHeight);
......
#ifndef egl_Texture2D_hpp #ifndef egl_Texture_hpp
#define egl_Texture2D_hpp #define egl_Texture_hpp
#include "common/Object.hpp"
namespace egl namespace egl
{ {
class Texture2D class Texture : public gl::RefCountObject
{ {
public: public:
Texture(GLuint id) : RefCountObject(id) {};
virtual void releaseTexImage() = 0; virtual void releaseTexImage() = 0;
}; };
} }
#endif // egl_Texture2D_hpp #endif // egl_Texture_hpp
...@@ -111,6 +111,8 @@ ...@@ -111,6 +111,8 @@
<Add library="X11" /> <Add library="X11" />
</Linker> </Linker>
<Unit filename="../../Common/SharedLibrary.hpp" /> <Unit filename="../../Common/SharedLibrary.hpp" />
<Unit filename="../common/Object.cpp" />
<Unit filename="../common/Object.hpp" />
<Unit filename="../common/debug.cpp" /> <Unit filename="../common/debug.cpp" />
<Unit filename="Config.cpp" /> <Unit filename="Config.cpp" />
<Unit filename="Config.h" /> <Unit filename="Config.h" />
...@@ -119,6 +121,7 @@ ...@@ -119,6 +121,7 @@
<Unit filename="Image.hpp" /> <Unit filename="Image.hpp" />
<Unit filename="Surface.cpp" /> <Unit filename="Surface.cpp" />
<Unit filename="Surface.h" /> <Unit filename="Surface.h" />
<Unit filename="exports.map" />
<Unit filename="libEGL.cpp" /> <Unit filename="libEGL.cpp" />
<Unit filename="main.cpp" /> <Unit filename="main.cpp" />
<Unit filename="main.h" /> <Unit filename="main.h" />
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "main.h" #include "main.h"
#include "Display.h" #include "Display.h"
#include "Surface.h" #include "Surface.h"
#include "Texture2D.hpp" #include "Texture.hpp"
#include "Context.hpp" #include "Context.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "common/debug.h" #include "common/debug.h"
...@@ -554,7 +554,7 @@ EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EG ...@@ -554,7 +554,7 @@ EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EG
return error(EGL_BAD_MATCH, EGL_FALSE); return error(EGL_BAD_MATCH, EGL_FALSE);
} }
egl::Texture2D *texture = eglSurface->getBoundTexture(); egl::Texture *texture = eglSurface->getBoundTexture();
if(texture) if(texture)
{ {
......
...@@ -288,6 +288,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor ...@@ -288,6 +288,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\common\Object.cpp" />
<ClCompile Include="Config.cpp" /> <ClCompile Include="Config.cpp" />
<ClCompile Include="..\Common\debug.cpp" /> <ClCompile Include="..\Common\debug.cpp" />
<ClCompile Include="Display.cpp" /> <ClCompile Include="Display.cpp" />
...@@ -297,6 +298,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor ...@@ -297,6 +298,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\common\debug.h" /> <ClInclude Include="..\common\debug.h" />
<ClInclude Include="..\common\Object.hpp" />
<ClInclude Include="..\include\EGL\egl.h" /> <ClInclude Include="..\include\EGL\egl.h" />
<ClInclude Include="..\include\EGL\eglext.h" /> <ClInclude Include="..\include\EGL\eglext.h" />
<ClInclude Include="..\include\EGL\eglplatform.h" /> <ClInclude Include="..\include\EGL\eglplatform.h" />
...@@ -307,7 +309,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor ...@@ -307,7 +309,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
<ClInclude Include="main.h" /> <ClInclude Include="main.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="Surface.h" /> <ClInclude Include="Surface.h" />
<ClInclude Include="Texture2D.hpp" /> <ClInclude Include="Texture.hpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="libEGL.def" /> <None Include="libEGL.def" />
......
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
<ClCompile Include="Surface.cpp"> <ClCompile Include="Surface.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\common\Object.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Config.h"> <ClInclude Include="Config.h">
...@@ -61,10 +64,13 @@ ...@@ -61,10 +64,13 @@
<ClInclude Include="Context.hpp"> <ClInclude Include="Context.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Texture2D.hpp"> <ClInclude Include="Image.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Texture.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Image.hpp"> <ClInclude Include="..\common\Object.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#ifndef LIBGLES_CM_BUFFER_H_ #ifndef LIBGLES_CM_BUFFER_H_
#define LIBGLES_CM_BUFFER_H_ #define LIBGLES_CM_BUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Common/Resource.hpp" #include "Common/Resource.hpp"
#define GL_API #define GL_API
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
namespace es1 namespace es1
{ {
class Buffer : public RefCountObject class Buffer : public gl::RefCountObject
{ {
public: public:
explicit Buffer(GLuint id); explicit Buffer(GLuint id);
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "libEGL/Context.hpp" #include "libEGL/Context.hpp"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "HandleAllocator.h" #include "HandleAllocator.h"
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "Renderer/Sampler.hpp" #include "Renderer/Sampler.hpp"
#include "MatrixStack.hpp" #include "MatrixStack.hpp"
...@@ -177,7 +177,7 @@ class VertexAttribute ...@@ -177,7 +177,7 @@ class VertexAttribute
intptr_t mOffset; intptr_t mOffset;
}; };
BindingPointer<Buffer> mBoundBuffer; // Captured when glVertexAttribPointer is called. gl::BindingPointer<Buffer> mBoundBuffer; // Captured when glVertexAttribPointer is called.
bool mArrayEnabled; // From glEnable/DisableVertexAttribArray bool mArrayEnabled; // From glEnable/DisableVertexAttribArray
float mCurrentValue[4]; // From glVertexAttrib float mCurrentValue[4]; // From glVertexAttrib
...@@ -245,13 +245,13 @@ struct State ...@@ -245,13 +245,13 @@ struct State
bool depthMask; bool depthMask;
unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0 unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0
BindingPointer<Buffer> arrayBuffer; gl::BindingPointer<Buffer> arrayBuffer;
BindingPointer<Buffer> elementArrayBuffer; gl::BindingPointer<Buffer> elementArrayBuffer;
GLuint framebuffer; GLuint framebuffer;
BindingPointer<Renderbuffer> renderbuffer; gl::BindingPointer<Renderbuffer> renderbuffer;
VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS]; VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];
BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_TEXTURE_UNITS]; gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_TEXTURE_UNITS];
GLint unpackAlignment; GLint unpackAlignment;
GLint packAlignment; GLint packAlignment;
...@@ -458,8 +458,8 @@ private: ...@@ -458,8 +458,8 @@ private:
State mState; State mState;
BindingPointer<Texture2D> mTexture2DZero; gl::BindingPointer<Texture2D> mTexture2DZero;
BindingPointer<TextureExternal> mTextureExternalZero; gl::BindingPointer<TextureExternal> mTextureExternalZero;
typedef std::map<GLint, Framebuffer*> FramebufferMap; typedef std::map<GLint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap; FramebufferMap mFramebufferMap;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#ifndef LIBGLES_CM_FRAMEBUFFER_H_ #ifndef LIBGLES_CM_FRAMEBUFFER_H_
#define LIBGLES_CM_FRAMEBUFFER_H_ #define LIBGLES_CM_FRAMEBUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#define GL_API #define GL_API
...@@ -65,13 +65,13 @@ public: ...@@ -65,13 +65,13 @@ public:
protected: protected:
GLenum mColorbufferType; GLenum mColorbufferType;
BindingPointer<Renderbuffer> mColorbufferPointer; gl::BindingPointer<Renderbuffer> mColorbufferPointer;
GLenum mDepthbufferType; GLenum mDepthbufferType;
BindingPointer<Renderbuffer> mDepthbufferPointer; gl::BindingPointer<Renderbuffer> mDepthbufferPointer;
GLenum mStencilbufferType; GLenum mStencilbufferType;
BindingPointer<Renderbuffer> mStencilbufferPointer; gl::BindingPointer<Renderbuffer> mStencilbufferPointer;
private: private:
Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle) const; Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle) const;
......
...@@ -54,7 +54,7 @@ namespace es1 ...@@ -54,7 +54,7 @@ namespace es1
{ {
if(parentTexture) if(parentTexture)
{ {
parentTexture->addRef(); return parentTexture->addRef();
} }
sw::atomicIncrement(&referenceCount); sw::atomicIncrement(&referenceCount);
...@@ -64,7 +64,7 @@ namespace es1 ...@@ -64,7 +64,7 @@ namespace es1
{ {
if(parentTexture) if(parentTexture)
{ {
parentTexture->release(); return parentTexture->release();
} }
if(referenceCount > 0) if(referenceCount > 0)
...@@ -72,15 +72,19 @@ namespace es1 ...@@ -72,15 +72,19 @@ namespace es1
sw::atomicDecrement(&referenceCount); sw::atomicDecrement(&referenceCount);
} }
if(referenceCount == 0 && !shared) if(referenceCount == 0)
{ {
ASSERT(!shared); // Should still hold a reference if eglDestroyImage hasn't been called
delete this; delete this;
} }
} }
void Image::unbind() void Image::unbind(const egl::Texture *parent)
{ {
parentTexture = 0; if(parentTexture == parent)
{
parentTexture = 0;
}
release(); release();
} }
......
...@@ -33,7 +33,7 @@ namespace es1 ...@@ -33,7 +33,7 @@ namespace es1
virtual void addRef(); virtual void addRef();
virtual void release(); virtual void release();
void unbind(); // Break parent ownership and release virtual void unbind(const egl::Texture *parent); // Break parent ownership and release
static sw::Format selectInternalFormat(GLenum format, GLenum type); static sw::Format selectInternalFormat(GLenum format, GLenum type);
...@@ -58,7 +58,7 @@ namespace es1 ...@@ -58,7 +58,7 @@ namespace es1
void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer); void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer);
Texture *parentTexture; egl::Texture *parentTexture;
volatile int referenceCount; volatile int referenceCount;
}; };
......
// SwiftShader Software Renderer
//
// Copyright(c) 2005-2012 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// RefCountObject.h: Defines the RefCountObject base class that provides
// lifecycle support for GL objects using the traditional BindObject scheme, but
// that need to be reference counted for correct cross-context deletion.
// (Concretely, textures, buffers and renderbuffers.)
#ifndef LIBGLES_CM_REFCOUNTOBJECT_H_
#define LIBGLES_CM_REFCOUNTOBJECT_H_
#include "common/debug.h"
#define GL_APIL
#include <GLES/gl.h>
#include <cstddef>
namespace es1
{
class RefCountObject
{
public:
explicit RefCountObject(GLuint id);
virtual ~RefCountObject();
virtual void addRef();
virtual void release();
GLuint id() const {return mId;}
private:
GLuint mId;
volatile int referenceCount;
};
class RefCountObjectBindingPointer
{
protected:
RefCountObjectBindingPointer() : mObject(NULL) { }
~RefCountObjectBindingPointer() { ASSERT(mObject == NULL); } // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up.
void set(RefCountObject *newObject);
RefCountObject *get() const { return mObject; }
public:
GLuint id() const { return (mObject != NULL) ? mObject->id() : 0; }
bool operator ! () const { return (get() == NULL); }
private:
RefCountObject *mObject;
};
template<class ObjectType>
class BindingPointer : public RefCountObjectBindingPointer
{
public:
void set(ObjectType *newObject) { RefCountObjectBindingPointer::set(newObject); }
ObjectType *get() const { return static_cast<ObjectType*>(RefCountObjectBindingPointer::get()); }
ObjectType *operator -> () const { return get(); }
};
}
#endif // LIBGLES_CM_REFCOUNTOBJECT_H_
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#ifndef LIBGLES_CM_RENDERBUFFER_H_ #ifndef LIBGLES_CM_RENDERBUFFER_H_
#define LIBGLES_CM_RENDERBUFFER_H_ #define LIBGLES_CM_RENDERBUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#define GL_API #define GL_API
...@@ -79,7 +79,7 @@ public: ...@@ -79,7 +79,7 @@ public:
virtual GLsizei getSamples() const; virtual GLsizei getSamples() const;
private: private:
BindingPointer<Texture2D> mTexture2D; gl::BindingPointer<Texture2D> mTexture2D;
}; };
// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
...@@ -113,7 +113,7 @@ protected: ...@@ -113,7 +113,7 @@ protected:
// Renderbuffer implements the GL renderbuffer object. // Renderbuffer implements the GL renderbuffer object.
// It's only a proxy for a RenderbufferInterface instance; the internal object // It's only a proxy for a RenderbufferInterface instance; the internal object
// can change whenever glRenderbufferStorage is called. // can change whenever glRenderbufferStorage is called.
class Renderbuffer : public RefCountObject class Renderbuffer : public gl::RefCountObject
{ {
public: public:
Renderbuffer(GLuint id, RenderbufferInterface *storage); Renderbuffer(GLuint id, RenderbufferInterface *storage);
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
namespace es1 namespace es1
{ {
Texture::Texture(GLuint id) : RefCountObject(id) Texture::Texture(GLuint id) : egl::Texture(id)
{ {
mMinFilter = GL_NEAREST_MIPMAP_LINEAR; mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR; mMagFilter = GL_LINEAR;
...@@ -302,7 +302,7 @@ Texture2D::~Texture2D() ...@@ -302,7 +302,7 @@ Texture2D::~Texture2D()
{ {
if(image[i]) if(image[i])
{ {
image[i]->unbind(); image[i]->unbind(this);
image[i] = 0; image[i] = 0;
} }
} }
...@@ -391,7 +391,7 @@ void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum form ...@@ -391,7 +391,7 @@ void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum form
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, type); image[level] = new Image(this, width, height, format, type);
...@@ -425,7 +425,7 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -425,7 +425,7 @@ void Texture2D::bindTexImage(egl::Surface *surface)
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
image[level] = 0; image[level] = 0;
} }
} }
...@@ -442,7 +442,7 @@ void Texture2D::releaseTexImage() ...@@ -442,7 +442,7 @@ void Texture2D::releaseTexImage()
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
image[level] = 0; image[level] = 0;
} }
} }
...@@ -452,7 +452,7 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL ...@@ -452,7 +452,7 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -487,7 +487,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -487,7 +487,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -542,7 +542,7 @@ void Texture2D::setImage(egl::Image *sharedImage) ...@@ -542,7 +542,7 @@ void Texture2D::setImage(egl::Image *sharedImage)
if(image[0]) if(image[0])
{ {
image[0]->unbind(); image[0]->unbind(this);
} }
image[0] = sharedImage; image[0] = sharedImage;
...@@ -637,7 +637,7 @@ void Texture2D::generateMipmaps() ...@@ -637,7 +637,7 @@ void Texture2D::generateMipmaps()
{ {
if(image[i]) if(image[i])
{ {
image[i]->unbind(); image[i]->unbind(this);
} }
image[i] = new Image(this, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType()); image[i] = new Image(this, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType());
......
...@@ -17,9 +17,9 @@ ...@@ -17,9 +17,9 @@
#define LIBGLES_CM_TEXTURE_H_ #define LIBGLES_CM_TEXTURE_H_
#include "Renderbuffer.h" #include "Renderbuffer.h"
#include "RefCountObject.h" #include "common/Object.hpp"
#include "utilities.h" #include "utilities.h"
#include "libEGL/Texture2D.hpp" #include "libEGL/Texture.hpp"
#include "common/debug.h" #include "common/debug.h"
#define GL_API #define GL_API
...@@ -46,7 +46,7 @@ enum ...@@ -46,7 +46,7 @@ enum
IMPLEMENTATION_MAX_SAMPLES = 4 IMPLEMENTATION_MAX_SAMPLES = 4
}; };
class Texture : public RefCountObject class Texture : public egl::Texture
{ {
public: public:
explicit Texture(GLuint id); explicit Texture(GLuint id);
...@@ -110,7 +110,7 @@ protected: ...@@ -110,7 +110,7 @@ protected:
sw::Resource *resource; sw::Resource *resource;
}; };
class Texture2D : public Texture, public egl::Texture2D class Texture2D : public Texture
{ {
public: public:
explicit Texture2D(GLuint id); explicit Texture2D(GLuint id);
......
...@@ -247,6 +247,8 @@ ...@@ -247,6 +247,8 @@
<Unit filename="../../Shader/VertexRoutine.hpp" /> <Unit filename="../../Shader/VertexRoutine.hpp" />
<Unit filename="../../Shader/VertexShader.cpp" /> <Unit filename="../../Shader/VertexShader.cpp" />
<Unit filename="../../Shader/VertexShader.hpp" /> <Unit filename="../../Shader/VertexShader.hpp" />
<Unit filename="../common/Object.cpp" />
<Unit filename="../common/Object.hpp" />
<Unit filename="../common/debug.cpp" /> <Unit filename="../common/debug.cpp" />
<Unit filename="../common/debug.h" /> <Unit filename="../common/debug.h" />
<Unit filename="../include/EGL/egl.h" /> <Unit filename="../include/EGL/egl.h" />
...@@ -273,8 +275,6 @@ ...@@ -273,8 +275,6 @@
<Unit filename="IndexDataManager.h" /> <Unit filename="IndexDataManager.h" />
<Unit filename="MatrixStack.cpp" /> <Unit filename="MatrixStack.cpp" />
<Unit filename="MatrixStack.hpp" /> <Unit filename="MatrixStack.hpp" />
<Unit filename="RefCountObject.cpp" />
<Unit filename="RefCountObject.h" />
<Unit filename="Renderbuffer.cpp" /> <Unit filename="Renderbuffer.cpp" />
<Unit filename="Renderbuffer.h" /> <Unit filename="Renderbuffer.h" />
<Unit filename="ResourceManager.cpp" /> <Unit filename="ResourceManager.cpp" />
...@@ -283,6 +283,7 @@ ...@@ -283,6 +283,7 @@
<Unit filename="Texture.h" /> <Unit filename="Texture.h" />
<Unit filename="VertexDataManager.cpp" /> <Unit filename="VertexDataManager.cpp" />
<Unit filename="VertexDataManager.h" /> <Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLES_CM.cpp" /> <Unit filename="libGLES_CM.cpp" />
<Unit filename="main.cpp" /> <Unit filename="main.cpp" />
<Unit filename="main.h" /> <Unit filename="main.h" />
......
...@@ -312,6 +312,7 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla ...@@ -312,6 +312,7 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\common\Object.cpp" />
<ClCompile Include="Buffer.cpp" /> <ClCompile Include="Buffer.cpp" />
<ClCompile Include="Context.cpp" /> <ClCompile Include="Context.cpp" />
<ClCompile Include="..\common\debug.cpp" /> <ClCompile Include="..\common\debug.cpp" />
...@@ -323,7 +324,6 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla ...@@ -323,7 +324,6 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla
<ClCompile Include="libGLES_CM.cpp" /> <ClCompile Include="libGLES_CM.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="MatrixStack.cpp" /> <ClCompile Include="MatrixStack.cpp" />
<ClCompile Include="RefCountObject.cpp" />
<ClCompile Include="Renderbuffer.cpp" /> <ClCompile Include="Renderbuffer.cpp" />
<ClCompile Include="ResourceManager.cpp" /> <ClCompile Include="ResourceManager.cpp" />
<ClCompile Include="Texture.cpp" /> <ClCompile Include="Texture.cpp" />
...@@ -332,6 +332,7 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla ...@@ -332,6 +332,7 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\common\debug.h" /> <ClInclude Include="..\common\debug.h" />
<ClInclude Include="..\common\Object.hpp" />
<ClInclude Include="..\include\GLES\egl.h" /> <ClInclude Include="..\include\GLES\egl.h" />
<ClInclude Include="..\include\GLES\gl.h" /> <ClInclude Include="..\include\GLES\gl.h" />
<ClInclude Include="..\include\GLES\glext.h" /> <ClInclude Include="..\include\GLES\glext.h" />
...@@ -346,7 +347,6 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla ...@@ -346,7 +347,6 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla
<ClInclude Include="main.h" /> <ClInclude Include="main.h" />
<ClInclude Include="mathutil.h" /> <ClInclude Include="mathutil.h" />
<ClInclude Include="MatrixStack.hpp" /> <ClInclude Include="MatrixStack.hpp" />
<ClInclude Include="RefCountObject.h" />
<ClInclude Include="Renderbuffer.h" /> <ClInclude Include="Renderbuffer.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" /> <ClInclude Include="ResourceManager.h" />
......
...@@ -32,9 +32,6 @@ ...@@ -32,9 +32,6 @@
<ClCompile Include="main.cpp"> <ClCompile Include="main.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="RefCountObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Renderbuffer.cpp"> <ClCompile Include="Renderbuffer.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
...@@ -62,6 +59,9 @@ ...@@ -62,6 +59,9 @@
<ClCompile Include="MatrixStack.cpp"> <ClCompile Include="MatrixStack.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\common\Object.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Buffer.h"> <ClInclude Include="Buffer.h">
...@@ -85,9 +85,6 @@ ...@@ -85,9 +85,6 @@
<ClInclude Include="mathutil.h"> <ClInclude Include="mathutil.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="RefCountObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Renderbuffer.h"> <ClInclude Include="Renderbuffer.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
...@@ -130,6 +127,9 @@ ...@@ -130,6 +127,9 @@
<ClInclude Include="MatrixStack.hpp"> <ClInclude Include="MatrixStack.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\common\Object.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="libGLES_CM.rc" /> <ResourceCompile Include="libGLES_CM.rc" />
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#ifndef LIBGLESV2_BUFFER_H_ #ifndef LIBGLESV2_BUFFER_H_
#define LIBGLESV2_BUFFER_H_ #define LIBGLESV2_BUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Common/Resource.hpp" #include "Common/Resource.hpp"
#define GL_APICALL #define GL_APICALL
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
namespace es2 namespace es2
{ {
class Buffer : public RefCountObject class Buffer : public gl::RefCountObject
{ {
public: public:
explicit Buffer(GLuint id); explicit Buffer(GLuint id);
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "libEGL/Context.hpp" #include "libEGL/Context.hpp"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "HandleAllocator.h" #include "HandleAllocator.h"
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "Renderer/Sampler.hpp" #include "Renderer/Sampler.hpp"
...@@ -158,7 +158,7 @@ class VertexAttribute ...@@ -158,7 +158,7 @@ class VertexAttribute
intptr_t mOffset; intptr_t mOffset;
}; };
BindingPointer<Buffer> mBoundBuffer; // Captured when glVertexAttribPointer is called. gl::BindingPointer<Buffer> mBoundBuffer; // Captured when glVertexAttribPointer is called.
bool mArrayEnabled; // From glEnable/DisableVertexAttribArray bool mArrayEnabled; // From glEnable/DisableVertexAttribArray
float mCurrentValue[4]; // From glVertexAttrib float mCurrentValue[4]; // From glVertexAttrib
...@@ -235,16 +235,16 @@ struct State ...@@ -235,16 +235,16 @@ struct State
bool depthMask; bool depthMask;
unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0 unsigned int activeSampler; // Active texture unit selector - GL_TEXTURE0
BindingPointer<Buffer> arrayBuffer; gl::BindingPointer<Buffer> arrayBuffer;
BindingPointer<Buffer> elementArrayBuffer; gl::BindingPointer<Buffer> elementArrayBuffer;
GLuint readFramebuffer; GLuint readFramebuffer;
GLuint drawFramebuffer; GLuint drawFramebuffer;
BindingPointer<Renderbuffer> renderbuffer; gl::BindingPointer<Renderbuffer> renderbuffer;
GLuint currentProgram; GLuint currentProgram;
VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS]; VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];
BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS]; gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];
BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT]; gl::BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT];
GLint unpackAlignment; GLint unpackAlignment;
GLint packAlignment; GLint packAlignment;
...@@ -463,9 +463,9 @@ private: ...@@ -463,9 +463,9 @@ private:
State mState; State mState;
BindingPointer<Texture2D> mTexture2DZero; gl::BindingPointer<Texture2D> mTexture2DZero;
BindingPointer<TextureCubeMap> mTextureCubeMapZero; gl::BindingPointer<TextureCubeMap> mTextureCubeMapZero;
BindingPointer<TextureExternal> mTextureExternalZero; gl::BindingPointer<TextureExternal> mTextureExternalZero;
typedef std::map<GLint, Framebuffer*> FramebufferMap; typedef std::map<GLint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap; FramebufferMap mFramebufferMap;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#ifndef LIBGLESV2_FRAMEBUFFER_H_ #ifndef LIBGLESV2_FRAMEBUFFER_H_
#define LIBGLESV2_FRAMEBUFFER_H_ #define LIBGLESV2_FRAMEBUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#define GL_APICALL #define GL_APICALL
...@@ -65,13 +65,13 @@ public: ...@@ -65,13 +65,13 @@ public:
protected: protected:
GLenum mColorbufferType; GLenum mColorbufferType;
BindingPointer<Renderbuffer> mColorbufferPointer; gl::BindingPointer<Renderbuffer> mColorbufferPointer;
GLenum mDepthbufferType; GLenum mDepthbufferType;
BindingPointer<Renderbuffer> mDepthbufferPointer; gl::BindingPointer<Renderbuffer> mDepthbufferPointer;
GLenum mStencilbufferType; GLenum mStencilbufferType;
BindingPointer<Renderbuffer> mStencilbufferPointer; gl::BindingPointer<Renderbuffer> mStencilbufferPointer;
private: private:
Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle) const; Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle) const;
......
...@@ -53,7 +53,7 @@ namespace es2 ...@@ -53,7 +53,7 @@ namespace es2
{ {
if(parentTexture) if(parentTexture)
{ {
parentTexture->addRef(); return parentTexture->addRef();
} }
sw::atomicIncrement(&referenceCount); sw::atomicIncrement(&referenceCount);
...@@ -63,7 +63,7 @@ namespace es2 ...@@ -63,7 +63,7 @@ namespace es2
{ {
if(parentTexture) if(parentTexture)
{ {
parentTexture->release(); return parentTexture->release();
} }
if(referenceCount > 0) if(referenceCount > 0)
...@@ -71,15 +71,19 @@ namespace es2 ...@@ -71,15 +71,19 @@ namespace es2
sw::atomicDecrement(&referenceCount); sw::atomicDecrement(&referenceCount);
} }
if(referenceCount == 0 && !shared) if(referenceCount == 0)
{ {
ASSERT(!shared); // Should still hold a reference if eglDestroyImage hasn't been called
delete this; delete this;
} }
} }
void Image::unbind() void Image::unbind(const egl::Texture *parent)
{ {
parentTexture = 0; if(parentTexture == parent)
{
parentTexture = 0;
}
release(); release();
} }
......
...@@ -33,7 +33,7 @@ namespace es2 ...@@ -33,7 +33,7 @@ namespace es2
virtual void addRef(); virtual void addRef();
virtual void release(); virtual void release();
void unbind(); // Break parent ownership and release virtual void unbind(const egl::Texture *parent); // Break parent ownership and release
static sw::Format selectInternalFormat(GLenum format, GLenum type); static sw::Format selectInternalFormat(GLenum format, GLenum type);
...@@ -63,7 +63,7 @@ namespace es2 ...@@ -63,7 +63,7 @@ namespace es2
void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer); void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer);
Texture *parentTexture; egl::Texture *parentTexture;
volatile int referenceCount; volatile int referenceCount;
}; };
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#ifndef LIBGLESV2_QUERY_H_ #ifndef LIBGLESV2_QUERY_H_
#define LIBGLESV2_QUERY_H_ #define LIBGLESV2_QUERY_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Renderer/Renderer.hpp" #include "Renderer/Renderer.hpp"
#define GL_APICALL #define GL_APICALL
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
namespace es2 namespace es2
{ {
class Query : public RefCountObject class Query : public gl::RefCountObject
{ {
public: public:
Query(GLuint id, GLenum type); Query(GLuint id, GLenum type);
......
// SwiftShader Software Renderer
//
// Copyright(c) 2005-2012 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
// RefCountObject.cpp: Defines the RefCountObject base class that provides
// lifecycle support for GL objects using the traditional BindObject scheme, but
// that need to be reference counted for correct cross-context deletion.
// (Concretely, textures, buffers and renderbuffers.)
#include "RefCountObject.h"
#include "Common/Thread.hpp"
namespace es2
{
RefCountObject::RefCountObject(GLuint id)
{
mId = id;
referenceCount = 0;
}
RefCountObject::~RefCountObject()
{
ASSERT(referenceCount == 0);
}
void RefCountObject::addRef()
{
sw::atomicIncrement(&referenceCount);
}
void RefCountObject::release()
{
ASSERT(referenceCount > 0);
if(referenceCount > 0)
{
sw::atomicDecrement(&referenceCount);
}
if(referenceCount == 0)
{
delete this;
}
}
void RefCountObjectBindingPointer::set(RefCountObject *newObject)
{
// addRef first in case newObject == mObject and this is the last reference to it.
if(newObject != NULL) newObject->addRef();
if(mObject != NULL) mObject->release();
mObject = newObject;
}
}
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#ifndef LIBGLESV2_RENDERBUFFER_H_ #ifndef LIBGLESV2_RENDERBUFFER_H_
#define LIBGLESV2_RENDERBUFFER_H_ #define LIBGLESV2_RENDERBUFFER_H_
#include "RefCountObject.h" #include "common/Object.hpp"
#include "Image.hpp" #include "Image.hpp"
#define GL_APICALL #define GL_APICALL
...@@ -80,7 +80,7 @@ public: ...@@ -80,7 +80,7 @@ public:
virtual GLsizei getSamples() const; virtual GLsizei getSamples() const;
private: private:
BindingPointer<Texture2D> mTexture2D; gl::BindingPointer<Texture2D> mTexture2D;
}; };
class RenderbufferTextureCubeMap : public RenderbufferInterface class RenderbufferTextureCubeMap : public RenderbufferInterface
...@@ -104,7 +104,7 @@ public: ...@@ -104,7 +104,7 @@ public:
virtual GLsizei getSamples() const; virtual GLsizei getSamples() const;
private: private:
BindingPointer<TextureCubeMap> mTextureCubeMap; gl::BindingPointer<TextureCubeMap> mTextureCubeMap;
GLenum mTarget; GLenum mTarget;
}; };
...@@ -139,7 +139,7 @@ protected: ...@@ -139,7 +139,7 @@ protected:
// Renderbuffer implements the GL renderbuffer object. // Renderbuffer implements the GL renderbuffer object.
// It's only a proxy for a RenderbufferInterface instance; the internal object // It's only a proxy for a RenderbufferInterface instance; the internal object
// can change whenever glRenderbufferStorage is called. // can change whenever glRenderbufferStorage is called.
class Renderbuffer : public RefCountObject class Renderbuffer : public gl::RefCountObject
{ {
public: public:
Renderbuffer(GLuint id, RenderbufferInterface *storage); Renderbuffer(GLuint id, RenderbufferInterface *storage);
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
namespace es2 namespace es2
{ {
Texture::Texture(GLuint id) : RefCountObject(id) Texture::Texture(GLuint id) : egl::Texture(id)
{ {
mMinFilter = GL_NEAREST_MIPMAP_LINEAR; mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR; mMagFilter = GL_LINEAR;
...@@ -302,7 +302,7 @@ Texture2D::~Texture2D() ...@@ -302,7 +302,7 @@ Texture2D::~Texture2D()
{ {
if(image[i]) if(image[i])
{ {
image[i]->unbind(); image[i]->unbind(this);
image[i] = 0; image[i] = 0;
} }
} }
...@@ -391,7 +391,7 @@ void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum form ...@@ -391,7 +391,7 @@ void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum form
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, type); image[level] = new Image(this, width, height, format, type);
...@@ -425,7 +425,7 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -425,7 +425,7 @@ void Texture2D::bindTexImage(egl::Surface *surface)
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
image[level] = 0; image[level] = 0;
} }
} }
...@@ -442,7 +442,7 @@ void Texture2D::releaseTexImage() ...@@ -442,7 +442,7 @@ void Texture2D::releaseTexImage()
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
image[level] = 0; image[level] = 0;
} }
} }
...@@ -452,7 +452,7 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL ...@@ -452,7 +452,7 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
{ {
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -487,7 +487,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -487,7 +487,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
if(image[level]) if(image[level])
{ {
image[level]->unbind(); image[level]->unbind(this);
} }
image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -542,7 +542,7 @@ void Texture2D::setImage(egl::Image *sharedImage) ...@@ -542,7 +542,7 @@ void Texture2D::setImage(egl::Image *sharedImage)
if(image[0]) if(image[0])
{ {
image[0]->unbind(); image[0]->unbind(this);
} }
image[0] = sharedImage; image[0] = sharedImage;
...@@ -637,7 +637,7 @@ void Texture2D::generateMipmaps() ...@@ -637,7 +637,7 @@ void Texture2D::generateMipmaps()
{ {
if(image[i]) if(image[i])
{ {
image[i]->unbind(); image[i]->unbind(this);
} }
image[i] = new Image(this, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType()); image[i] = new Image(this, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType());
...@@ -729,7 +729,7 @@ TextureCubeMap::~TextureCubeMap() ...@@ -729,7 +729,7 @@ TextureCubeMap::~TextureCubeMap()
{ {
if(image[f][i]) if(image[f][i])
{ {
image[f][i]->unbind(); image[f][i]->unbind(this);
image[f][i] = 0; image[f][i] = 0;
} }
} }
...@@ -832,7 +832,7 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma ...@@ -832,7 +832,7 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma
if(image[face][level]) if(image[face][level])
{ {
image[face][level]->unbind(); image[face][level]->unbind(this);
} }
image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -962,13 +962,18 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const ...@@ -962,13 +962,18 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const
return IsDepthTexture(getFormat(target, level)); return IsDepthTexture(getFormat(target, level));
} }
void TextureCubeMap::releaseTexImage()
{
UNREACHABLE(); // Cube maps cannot have an EGL surface bound as an image
}
void TextureCubeMap::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) void TextureCubeMap::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
{ {
int face = CubeFaceIndex(target); int face = CubeFaceIndex(target);
if(image[face][level]) if(image[face][level])
{ {
image[face][level]->unbind(); image[face][level]->unbind(this);
} }
image[face][level] = new Image(this, width, height, format, type); image[face][level] = new Image(this, width, height, format, type);
...@@ -995,7 +1000,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -995,7 +1000,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
if(image[face][level]) if(image[face][level])
{ {
image[face][level]->unbind(); image[face][level]->unbind(this);
} }
image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE);
...@@ -1073,7 +1078,7 @@ void TextureCubeMap::generateMipmaps() ...@@ -1073,7 +1078,7 @@ void TextureCubeMap::generateMipmaps()
{ {
if(image[f][i]) if(image[f][i])
{ {
image[f][i]->unbind(); image[f][i]->unbind(this);
} }
image[f][i] = new Image(this, std::max(image[0][0]->getWidth() >> i, 1), std::max(image[0][0]->getHeight() >> i, 1), image[0][0]->getFormat(), image[0][0]->getType()); image[f][i] = new Image(this, std::max(image[0][0]->getWidth() >> i, 1), std::max(image[0][0]->getHeight() >> i, 1), image[0][0]->getFormat(), image[0][0]->getType());
......
...@@ -17,9 +17,9 @@ ...@@ -17,9 +17,9 @@
#define LIBGLESV2_TEXTURE_H_ #define LIBGLESV2_TEXTURE_H_
#include "Renderbuffer.h" #include "Renderbuffer.h"
#include "RefCountObject.h" #include "common/Object.hpp"
#include "utilities.h" #include "utilities.h"
#include "libEGL/Texture2D.hpp" #include "libEGL/Texture.hpp"
#include "common/debug.h" #include "common/debug.h"
#define GL_APICALL #define GL_APICALL
...@@ -46,7 +46,7 @@ enum ...@@ -46,7 +46,7 @@ enum
IMPLEMENTATION_MAX_SAMPLES = 4 IMPLEMENTATION_MAX_SAMPLES = 4
}; };
class Texture : public RefCountObject class Texture : public egl::Texture
{ {
public: public:
explicit Texture(GLuint id); explicit Texture(GLuint id);
...@@ -110,7 +110,7 @@ protected: ...@@ -110,7 +110,7 @@ protected:
sw::Resource *resource; sw::Resource *resource;
}; };
class Texture2D : public Texture, public egl::Texture2D class Texture2D : public Texture
{ {
public: public:
explicit Texture2D(GLuint id); explicit Texture2D(GLuint id);
...@@ -198,6 +198,7 @@ public: ...@@ -198,6 +198,7 @@ public:
virtual bool isSamplerComplete() const; virtual bool isSamplerComplete() const;
virtual bool isCompressed(GLenum target, GLint level) const; virtual bool isCompressed(GLenum target, GLint level) const;
virtual bool isDepth(GLenum target, GLint level) const; virtual bool isDepth(GLenum target, GLint level) const;
virtual void releaseTexImage();
virtual void generateMipmaps(); virtual void generateMipmaps();
......
...@@ -247,6 +247,8 @@ ...@@ -247,6 +247,8 @@
<Unit filename="../../Shader/VertexRoutine.hpp" /> <Unit filename="../../Shader/VertexRoutine.hpp" />
<Unit filename="../../Shader/VertexShader.cpp" /> <Unit filename="../../Shader/VertexShader.cpp" />
<Unit filename="../../Shader/VertexShader.hpp" /> <Unit filename="../../Shader/VertexShader.hpp" />
<Unit filename="../common/Object.cpp" />
<Unit filename="../common/Object.hpp" />
<Unit filename="../common/debug.cpp" /> <Unit filename="../common/debug.cpp" />
<Unit filename="../common/debug.h" /> <Unit filename="../common/debug.h" />
<Unit filename="../compiler/AnalyzeCallDepth.cpp" /> <Unit filename="../compiler/AnalyzeCallDepth.cpp" />
...@@ -356,8 +358,6 @@ ...@@ -356,8 +358,6 @@
<Unit filename="Program.h" /> <Unit filename="Program.h" />
<Unit filename="Query.cpp" /> <Unit filename="Query.cpp" />
<Unit filename="Query.h" /> <Unit filename="Query.h" />
<Unit filename="RefCountObject.cpp" />
<Unit filename="RefCountObject.h" />
<Unit filename="Renderbuffer.cpp" /> <Unit filename="Renderbuffer.cpp" />
<Unit filename="Renderbuffer.h" /> <Unit filename="Renderbuffer.h" />
<Unit filename="ResourceManager.cpp" /> <Unit filename="ResourceManager.cpp" />
...@@ -366,9 +366,9 @@ ...@@ -366,9 +366,9 @@
<Unit filename="Shader.h" /> <Unit filename="Shader.h" />
<Unit filename="Texture.cpp" /> <Unit filename="Texture.cpp" />
<Unit filename="Texture.h" /> <Unit filename="Texture.h" />
<Unit filename="Unknown.hpp" />
<Unit filename="VertexDataManager.cpp" /> <Unit filename="VertexDataManager.cpp" />
<Unit filename="VertexDataManager.h" /> <Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLESv2.cpp" /> <Unit filename="libGLESv2.cpp" />
<Unit filename="main.cpp" /> <Unit filename="main.cpp" />
<Unit filename="main.h" /> <Unit filename="main.h" />
...@@ -376,7 +376,6 @@ ...@@ -376,7 +376,6 @@
<Unit filename="resource.h" /> <Unit filename="resource.h" />
<Unit filename="utilities.cpp" /> <Unit filename="utilities.cpp" />
<Unit filename="utilities.h" /> <Unit filename="utilities.h" />
<Unit filename="vertexconversion.h" />
<Extensions> <Extensions>
<code_completion /> <code_completion />
<debugger /> <debugger />
......
...@@ -312,6 +312,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat ...@@ -312,6 +312,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\common\Object.cpp" />
<ClCompile Include="Buffer.cpp" /> <ClCompile Include="Buffer.cpp" />
<ClCompile Include="Context.cpp" /> <ClCompile Include="Context.cpp" />
<ClCompile Include="..\common\debug.cpp" /> <ClCompile Include="..\common\debug.cpp" />
...@@ -325,7 +326,6 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat ...@@ -325,7 +326,6 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="Program.cpp" /> <ClCompile Include="Program.cpp" />
<ClCompile Include="Query.cpp" /> <ClCompile Include="Query.cpp" />
<ClCompile Include="RefCountObject.cpp" />
<ClCompile Include="Renderbuffer.cpp" /> <ClCompile Include="Renderbuffer.cpp" />
<ClCompile Include="ResourceManager.cpp" /> <ClCompile Include="ResourceManager.cpp" />
<ClCompile Include="Shader.cpp" /> <ClCompile Include="Shader.cpp" />
...@@ -335,6 +335,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat ...@@ -335,6 +335,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\common\debug.h" /> <ClInclude Include="..\common\debug.h" />
<ClInclude Include="..\common\Object.hpp" />
<ClInclude Include="..\include\GLES2\gl2.h" /> <ClInclude Include="..\include\GLES2\gl2.h" />
<ClInclude Include="..\include\GLES2\gl2ext.h" /> <ClInclude Include="..\include\GLES2\gl2ext.h" />
<ClInclude Include="..\include\GLES2\gl2platform.h" /> <ClInclude Include="..\include\GLES2\gl2platform.h" />
...@@ -350,7 +351,6 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat ...@@ -350,7 +351,6 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
<ClInclude Include="mathutil.h" /> <ClInclude Include="mathutil.h" />
<ClInclude Include="Program.h" /> <ClInclude Include="Program.h" />
<ClInclude Include="Query.h" /> <ClInclude Include="Query.h" />
<ClInclude Include="RefCountObject.h" />
<ClInclude Include="Renderbuffer.h" /> <ClInclude Include="Renderbuffer.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" /> <ClInclude Include="ResourceManager.h" />
......
...@@ -41,9 +41,6 @@ ...@@ -41,9 +41,6 @@
<ClCompile Include="Program.cpp"> <ClCompile Include="Program.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="RefCountObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Renderbuffer.cpp"> <ClCompile Include="Renderbuffer.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
...@@ -71,6 +68,9 @@ ...@@ -71,6 +68,9 @@
<ClCompile Include="Query.cpp"> <ClCompile Include="Query.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\common\Object.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Buffer.h"> <ClInclude Include="Buffer.h">
...@@ -100,9 +100,6 @@ ...@@ -100,9 +100,6 @@
<ClInclude Include="Program.h"> <ClInclude Include="Program.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="RefCountObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Renderbuffer.h"> <ClInclude Include="Renderbuffer.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
...@@ -145,6 +142,9 @@ ...@@ -145,6 +142,9 @@
<ClInclude Include="..\common\debug.h"> <ClInclude Include="..\common\debug.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\common\Object.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="libGLESv2.rc" /> <ResourceCompile Include="libGLESv2.rc" />
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "main.h" #include "main.h"
#include "Display.h" #include "Display.h"
#include "Texture2D.hpp" #include "TextureEGL.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "Context.hpp" #include "Context.hpp"
#include "common/debug.h" #include "common/debug.h"
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#define LIBGLESV2_TEXTURE_H_ #define LIBGLESV2_TEXTURE_H_
#include "utilities.h" #include "utilities.h"
#include "Texture2D.hpp" #include "TextureEGL.hpp"
#include "common/debug.h" #include "common/debug.h"
#define GL_APICALL #define GL_APICALL
...@@ -44,7 +44,7 @@ enum ...@@ -44,7 +44,7 @@ enum
IMPLEMENTATION_MAX_SAMPLES = 4 IMPLEMENTATION_MAX_SAMPLES = 4
}; };
class Texture class Texture : public egl::Texture
{ {
public: public:
explicit Texture(); explicit Texture();
...@@ -107,7 +107,7 @@ protected: ...@@ -107,7 +107,7 @@ protected:
volatile int referenceCount; volatile int referenceCount;
}; };
class Texture2D : public Texture, public egl::Texture2D class Texture2D : public Texture
{ {
public: public:
explicit Texture2D(); explicit Texture2D();
......
#ifndef egl_Texture2D_hpp #ifndef egl_TextureEGL_hpp
#define egl_Texture2D_hpp #define egl_TextureEGL_hpp
namespace egl namespace egl
{ {
class Texture2D class Texture
{ {
public: public:
}; };
} }
#endif // egl_Texture2D_hpp #endif // egl_TextureEGL_hpp
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "main.h" #include "main.h"
#include "Display.h" #include "Display.h"
#include "Surface.h" #include "Surface.h"
#include "Texture2D.hpp" #include "TextureEGL.hpp"
#include "Context.hpp" #include "Context.hpp"
#include "Image.hpp" #include "Image.hpp"
#include "common/debug.h" #include "common/debug.h"
......
...@@ -341,7 +341,7 @@ ...@@ -341,7 +341,7 @@
<Unit filename="Surface.h" /> <Unit filename="Surface.h" />
<Unit filename="Texture.cpp" /> <Unit filename="Texture.cpp" />
<Unit filename="Texture.h" /> <Unit filename="Texture.h" />
<Unit filename="Texture2D.hpp" /> <Unit filename="TextureEGL.hpp" />
<Unit filename="exports.map" /> <Unit filename="exports.map" />
<Unit filename="libEGL.cpp" /> <Unit filename="libEGL.cpp" />
<Unit filename="libRAD.cpp" /> <Unit filename="libRAD.cpp" />
......
...@@ -197,7 +197,7 @@ copy "$(OutDir)libRAD.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Comman ...@@ -197,7 +197,7 @@ copy "$(OutDir)libRAD.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Comman
<ClInclude Include="Shader.h" /> <ClInclude Include="Shader.h" />
<ClInclude Include="Surface.h" /> <ClInclude Include="Surface.h" />
<ClInclude Include="Texture.h" /> <ClInclude Include="Texture.h" />
<ClInclude Include="Texture2D.hpp" /> <ClInclude Include="TextureEGL.hpp" />
<ClInclude Include="utilities.h" /> <ClInclude Include="utilities.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
......
...@@ -121,7 +121,7 @@ ...@@ -121,7 +121,7 @@
<ClInclude Include="Surface.h"> <ClInclude Include="Surface.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Texture2D.hpp"> <ClInclude Include="TextureEGL.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment