Refactor read buffer access.

The read buffer state is part of the framebuffer object, so determining
the index is moved to the Framebuffer class. Also make sure GL_NONE is
handled without causing invalid access by using GL_INVALID_INDEX.

Change-Id: I26476024cd8dd820b0e3f53d9c3dd5a7d46c082e
Reviewed-on: https://swiftshader-review.googlesource.com/14748
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index cdeabbd..15129d7 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -769,20 +769,6 @@
 	}
 }
 
-GLuint Context::getReadFramebufferColorIndex() const
-{
-	GLenum buf = getReadFramebuffer()->getReadBuffer();
-	switch(buf)
-	{
-	case GL_BACK:
-		return 0;
-	case GL_NONE:
-		return GL_INVALID_INDEX;
-	default:
-		return buf - GL_COLOR_ATTACHMENT0;
-}
-}
-
 GLuint Context::getArrayBufferName() const
 {
 	return mState.arrayBuffer.name();
@@ -4118,7 +4104,7 @@
 
 	if(mask & GL_COLOR_BUFFER_BIT)
 	{
-		GLenum readColorbufferType = readFramebuffer->getColorbufferType(getReadFramebufferColorIndex());
+		GLenum readColorbufferType = readFramebuffer->getReadBufferType();
 		GLenum drawColorbufferType = drawFramebuffer->getColorbufferType(0);
 		const bool validReadType = readColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(readColorbufferType);
 		const bool validDrawType = drawColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(drawColorbufferType);
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 1b1f807..27147a5 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -515,7 +515,6 @@
 
 	void setFramebufferReadBuffer(GLenum buf);
 	void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs);
-	GLuint getReadFramebufferColorIndex() const;
 
 	GLuint getActiveQuery(GLenum target) const;
 
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 9b9c78b..c02725e 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -169,11 +169,14 @@
 // caller must Release() the returned surface
 egl::Image *Framebuffer::getRenderTarget(GLuint index)
 {
-	Renderbuffer *colorbuffer = mColorbufferPointer[index];
-
-	if(colorbuffer)
+	if(index < MAX_COLOR_ATTACHMENTS)
 	{
-		return colorbuffer->getRenderTarget();
+		Renderbuffer *colorbuffer = mColorbufferPointer[index];
+
+		if(colorbuffer)
+		{
+			return colorbuffer->getRenderTarget();
+		}
 	}
 
 	return nullptr;
@@ -181,8 +184,7 @@
 
 egl::Image *Framebuffer::getReadRenderTarget()
 {
-	Context *context = getContext();
-	return getRenderTarget(context->getReadFramebufferColorIndex());
+	return getRenderTarget(getReadBufferIndex());
 }
 
 // Increments refcount on surface.
@@ -220,8 +222,7 @@
 
 Renderbuffer *Framebuffer::getReadColorbuffer() const
 {
-	Context *context = getContext();
-	return getColorbuffer(context->getReadFramebufferColorIndex());
+	return getColorbuffer(getReadBufferIndex());
 }
 
 Renderbuffer *Framebuffer::getDepthbuffer() const
@@ -234,6 +235,16 @@
 	return mStencilbufferPointer;
 }
 
+GLenum Framebuffer::getReadBufferType()
+{
+	if(readBuffer == GL_NONE)
+	{
+		return GL_NONE;
+	}
+
+	return mColorbufferType[getReadBufferIndex()];
+}
+
 GLenum Framebuffer::getColorbufferType(GLuint index)
 {
 	return mColorbufferType[index];
@@ -654,6 +665,19 @@
 	return GL_NONE;
 }
 
+GLuint Framebuffer::getReadBufferIndex() const
+{
+	switch(readBuffer)
+	{
+	case GL_BACK:
+		return 0;
+	case GL_NONE:
+		return GL_INVALID_INDEX;
+	default:
+		return readBuffer - GL_COLOR_ATTACHMENT0;
+	}
+}
+
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
 	GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT;
diff --git a/src/OpenGL/libGLESv2/Framebuffer.h b/src/OpenGL/libGLESv2/Framebuffer.h
index 1405031..8f1251d 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.h
+++ b/src/OpenGL/libGLESv2/Framebuffer.h
@@ -61,6 +61,7 @@
 	Renderbuffer *getDepthbuffer() const;
 	Renderbuffer *getStencilbuffer() const;
 
+	GLenum getReadBufferType();
 	GLenum getColorbufferType(GLuint index);
 	GLenum getDepthbufferType();
 	GLenum getStencilbufferType();
@@ -88,11 +89,14 @@
 	static bool IsRenderbuffer(GLenum type);
 
 protected:
-	GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
-	gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
+	GLuint getReadBufferIndex() const;
+
 	GLenum readBuffer;
 	GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];
 
+	GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
+	gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
+
 	GLenum mDepthbufferType;
 	gl::BindingPointer<Renderbuffer> mDepthbufferPointer;