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;