Sharing for buffer, texture and renderbuffer objects.
TRAC #12496
Derive Renderbuffer, Texture and Buffer from RefCountObject.
This class keeps a reference count for all objects that need cross-context
reference counting, and also the object id.
Restructure Renderbuffers to create a wrapper object and a storage object.
Use BindingPointer for all binding points instead of binding by object id.
Signed-off-by: Shannon Woods
Signed-off-by: Daniel Koch
git-svn-id: https://angleproject.googlecode.com/svn/trunk@364 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index e1c2300..d393041 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -854,8 +854,7 @@
return error(GL_INVALID_FRAMEBUFFER_OPERATION);
}
- gl::Renderbuffer *source = framebuffer->getColorbuffer();
-
+ gl::Colorbuffer *source = framebuffer->getColorbuffer();
if (target == GL_TEXTURE_2D)
{
gl::Texture2D *texture = context->getTexture2D();
@@ -928,8 +927,7 @@
return error(GL_INVALID_FRAMEBUFFER_OPERATION);
}
- gl::Renderbuffer *source = framebuffer->getColorbuffer();
-
+ gl::Colorbuffer *source = framebuffer->getColorbuffer();
if (target == GL_TEXTURE_2D)
{
gl::Texture2D *texture = context->getTexture2D();
@@ -2520,7 +2518,7 @@
case GL_RENDERBUFFER_RED_SIZE:
if (renderbuffer->isColorbuffer())
{
- *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getRedSize();
+ *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getRedSize();
}
else
{
@@ -2530,7 +2528,7 @@
case GL_RENDERBUFFER_GREEN_SIZE:
if (renderbuffer->isColorbuffer())
{
- *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getGreenSize();
+ *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getGreenSize();
}
else
{
@@ -2540,7 +2538,7 @@
case GL_RENDERBUFFER_BLUE_SIZE:
if (renderbuffer->isColorbuffer())
{
- *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getBlueSize();
+ *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getBlueSize();
}
else
{
@@ -2550,7 +2548,7 @@
case GL_RENDERBUFFER_ALPHA_SIZE:
if (renderbuffer->isColorbuffer())
{
- *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getAlphaSize();
+ *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getAlphaSize();
}
else
{
@@ -2560,7 +2558,7 @@
case GL_RENDERBUFFER_DEPTH_SIZE:
if (renderbuffer->isDepthbuffer())
{
- *params = static_cast<gl::Depthbuffer*>(renderbuffer)->getDepthSize();
+ *params = static_cast<gl::Depthbuffer*>(renderbuffer->getStorage())->getDepthSize();
}
else
{
@@ -2570,7 +2568,7 @@
case GL_RENDERBUFFER_STENCIL_SIZE:
if (renderbuffer->isStencilbuffer())
{
- *params = static_cast<gl::Stencilbuffer*>(renderbuffer)->getStencilSize();
+ *params = static_cast<gl::Stencilbuffer*>(renderbuffer->getStorage())->getStencilSize();
}
else
{
@@ -3005,7 +3003,7 @@
return error(GL_INVALID_VALUE);
}
- gl::AttributeState attribState = context->getVertexAttribState(index);
+ const gl::AttributeState &attribState = context->getVertexAttribState(index);
switch (pname)
{
@@ -3025,7 +3023,7 @@
*params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- *params = (GLfloat)attribState.mBoundBuffer;
+ *params = (GLfloat)attribState.mBoundBuffer.id();
break;
case GL_CURRENT_VERTEX_ATTRIB:
for (int i = 0; i < 4; ++i)
@@ -3058,7 +3056,7 @@
return error(GL_INVALID_VALUE);
}
- gl::AttributeState attribState = context->getVertexAttribState(index);
+ const gl::AttributeState &attribState = context->getVertexAttribState(index);
switch (pname)
{
@@ -3078,7 +3076,7 @@
*params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
break;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- *params = attribState.mBoundBuffer;
+ *params = attribState.mBoundBuffer.id();
break;
case GL_CURRENT_VERTEX_ATTRIB:
for (int i = 0; i < 4; ++i)
@@ -3570,7 +3568,8 @@
if (context)
{
- if (context->getRenderbufferHandle() == 0)
+ GLuint handle = context->getRenderbufferHandle();
+ if (handle == 0)
{
return error(GL_INVALID_OPERATION);
}
@@ -3578,18 +3577,18 @@
switch (internalformat)
{
case GL_DEPTH_COMPONENT16:
- context->setRenderbuffer(new gl::Depthbuffer(width, height));
+ context->setRenderbufferStorage(new gl::Depthbuffer(width, height));
break;
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGB565:
- context->setRenderbuffer(new gl::Colorbuffer(width, height, internalformat));
+ context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat));
break;
case GL_STENCIL_INDEX8:
- context->setRenderbuffer(new gl::Stencilbuffer(width, height));
+ context->setRenderbufferStorage(new gl::Stencilbuffer(width, height));
break;
case GL_DEPTH24_STENCIL8_OES:
- context->setRenderbuffer(new gl::DepthStencilbuffer(width, height));
+ context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height));
break;
default:
return error(GL_INVALID_ENUM);
@@ -4981,7 +4980,7 @@
if (context)
{
- context->setVertexAttribState(index, context->getArrayBufferHandle(), size, type, (normalized == GL_TRUE), stride, ptr);
+ context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
}
}
catch(std::bad_alloc&)