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