Renderbuffer allocation fix for GLES3
According to the ES3 spec, there's no requirement for a
renderbuffer to be allocated until it is bound and any
non-zero renderbuffer bound must be allocated.
Change-Id: Id47083c7ec6e3b3698e176d6feff31121983e446
Reviewed-on: https://swiftshader-review.googlesource.com/4331
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 49ed039..d95240e 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1266,6 +1266,8 @@
void Context::bindRenderbuffer(GLuint renderbuffer)
{
+ mResourceManager->checkRenderbufferAllocation(renderbuffer);
+
mState.renderbuffer = getRenderbuffer(renderbuffer);
}
diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index 0964446..3476a42 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -324,12 +324,6 @@
}
else
{
- if (!renderbuffer->second)
- {
- Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
- mRenderbufferMap[handle] = renderbufferObject;
- renderbufferObject->addRef();
- }
return renderbuffer->second;
}
}
@@ -414,6 +408,16 @@
}
}
+void ResourceManager::checkRenderbufferAllocation(GLuint handle)
+{
+ if(handle != 0 && !getRenderbuffer(handle))
+ {
+ Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
+ mRenderbufferMap[handle] = renderbufferObject;
+ renderbufferObject->addRef();
+ }
+}
+
void ResourceManager::checkSamplerAllocation(GLuint sampler)
{
if(sampler != 0 && !getSampler(sampler))
diff --git a/src/OpenGL/libGLESv2/ResourceManager.h b/src/OpenGL/libGLESv2/ResourceManager.h
index 0cc2656..230a247 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.h
+++ b/src/OpenGL/libGLESv2/ResourceManager.h
@@ -80,6 +80,7 @@
void checkBufferAllocation(unsigned int buffer);
void checkTextureAllocation(GLuint texture, TextureType type);
+ void checkRenderbufferAllocation(GLuint handle);
void checkSamplerAllocation(GLuint sampler);
bool isSampler(GLuint sampler);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index e230759..d01ac8d 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -509,10 +509,12 @@
if(context)
{
- if(renderbuffer != 0 && !context->getRenderbuffer(renderbuffer))
+ // [OpenGL ES 3.0.4] Section 4.4.2 page 204
+ // If renderbuffer is not zero, then the resulting renderbuffer object
+ // is a new state vector, initialized with a zero-sized memory buffer.
+ if(renderbuffer != 0 && !context->getRenderbuffer(renderbuffer) && (context->getClientVersion() < 3))
{
// [OpenGL ES 2.0.25] Section 4.4.3 page 112
- // [OpenGL ES 3.0.2] Section 4.4.2 page 201
// 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
// type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
return error(GL_INVALID_OPERATION);