OSDN Git Service

Fixed read buffer and draw buffers
authorAlexis Hetu <sugoi@google.com>
Wed, 10 Feb 2016 18:41:00 +0000 (13:41 -0500)
committerAlexis Hétu <sugoi@google.com>
Wed, 10 Feb 2016 20:48:29 +0000 (20:48 +0000)
Specifying a read buffer or draw buffers was set on the context
instead of being set on the Framebuffer object, which led to
multiple Framebuffer objects wrongly sharing this state.

Change-Id: I9d137c52f50e58a48b95f7ed9a44b4dad275e710
Reviewed-on: https://swiftshader-review.googlesource.com/4745
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/Framebuffer.cpp
src/OpenGL/libGLESv2/Framebuffer.h
src/OpenGL/libGLESv2/libGLESv3.cpp

index 3ef0c78..016b40f 100644 (file)
@@ -151,12 +151,6 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
     bindGenericUniformBuffer(0);\r
     bindTransformFeedback(0);\r
 \r
-       mState.readFramebufferColorIndex = 0;\r
-       for(int i = 0; i < MAX_COLOR_ATTACHMENTS; ++i)\r
-       {\r
-               mState.drawFramebufferColorIndices[i] = GL_NONE;\r
-       }\r
-\r
     mState.currentProgram = 0;\r
 \r
     mState.packAlignment = 4;\r
@@ -735,22 +729,32 @@ GLuint Context::getRenderbufferName() const
     return mState.renderbuffer.name();\r
 }\r
 \r
-void Context::setReadFramebufferColorIndex(GLuint index)\r
+void Context::setFramebufferReadBuffer(GLuint buf)\r
 {\r
-       mState.readFramebufferColorIndex = index;\r
+       getReadFramebuffer()->setReadBuffer(buf);\r
 }\r
 \r
-void Context::setDrawFramebufferColorIndices(GLsizei n, const GLenum *bufs)\r
+void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)\r
 {\r
+       Framebuffer* drawFramebuffer = getDrawFramebuffer();\r
        for(int i = 0; i < n; ++i)\r
        {\r
-               mState.drawFramebufferColorIndices[i] = ((bufs[i] == GL_BACK) || (bufs[i] == GL_NONE)) ? bufs[i] : i;\r
+               drawFramebuffer->setDrawBuffer(i, bufs[i]);\r
        }\r
 }\r
 \r
 GLuint Context::getReadFramebufferColorIndex() const\r
 {\r
-       return mState.readFramebufferColorIndex;\r
+       GLenum buf = getReadFramebuffer()->getReadBuffer();\r
+       switch(buf)\r
+       {\r
+       case GL_BACK:\r
+               return 0;\r
+       case GL_NONE:\r
+               return GL_INVALID_INDEX;\r
+       default:\r
+               return buf - GL_COLOR_ATTACHMENT0;\r
+}\r
 }\r
 \r
 GLuint Context::getArrayBufferName() const\r
@@ -2164,9 +2168,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                }\r
                break;\r
        case GL_DRAW_BUFFER0: // symbolic constant, initial value is GL_BACK​\r
-               UNIMPLEMENTED();\r
-               *params = GL_BACK;\r
-               break;\r
        case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE\r
        case GL_DRAW_BUFFER2:\r
        case GL_DRAW_BUFFER3:\r
@@ -2182,8 +2183,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_DRAW_BUFFER13:\r
        case GL_DRAW_BUFFER14:\r
        case GL_DRAW_BUFFER15:\r
-               UNIMPLEMENTED();\r
-               *params = GL_NONE;\r
+               *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);\r
                break;\r
        case GL_MAJOR_VERSION: // integer, at least 3\r
                if(clientVersion >= 3)\r
@@ -2338,8 +2338,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                *params = 0;\r
                break;\r
        case GL_READ_BUFFER: // symbolic constant,  initial value is GL_BACK​\r
-               UNIMPLEMENTED();\r
-               *params = GL_BACK;\r
+               *params = getReadFramebuffer()->getReadBuffer();\r
                break;\r
        case GL_SAMPLER_BINDING: // GLint, default 0\r
                *params = mState.sampler[mState.activeSampler].name();\r
index cbd6a80..b460d6f 100644 (file)
@@ -381,8 +381,6 @@ struct State
 \r
     GLuint readFramebuffer;\r
     GLuint drawFramebuffer;\r
-    GLuint readFramebufferColorIndex;\r
-    GLuint drawFramebufferColorIndices[MAX_COLOR_ATTACHMENTS];\r
     gl::BindingPointer<Renderbuffer> renderbuffer;\r
     GLuint currentProgram;\r
        GLuint vertexArray;\r
@@ -482,8 +480,8 @@ public:
     GLuint getDrawFramebufferName() const;\r
     GLuint getRenderbufferName() const;\r
 \r
-       void setReadFramebufferColorIndex(GLuint index);\r
-       void setDrawFramebufferColorIndices(GLsizei n, const GLenum *bufs);\r
+       void setFramebufferReadBuffer(GLenum buf);\r
+       void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs);\r
        GLuint getReadFramebufferColorIndex() const;\r
 \r
        GLuint getActiveQuery(GLenum target) const;\r
index a97ec2c..4109632 100644 (file)
@@ -30,6 +30,13 @@ Framebuffer::Framebuffer()
        }
        mDepthbufferType = GL_NONE;
        mStencilbufferType = GL_NONE;
+
+       readBuffer = GL_BACK;
+       drawBuffer[0] = GL_BACK;
+       for(int i = 1; i < MAX_COLOR_ATTACHMENTS; ++i)
+       {
+               drawBuffer[i] = GL_NONE;
+       }
 }
 
 Framebuffer::~Framebuffer()
@@ -68,6 +75,11 @@ void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index,
 {
        mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE;
        mColorbufferPointer[index] = lookupRenderbuffer(type, colorbuffer, level, layer);
+       drawBuffer[index] = (colorbuffer != 0) ? GL_COLOR_ATTACHMENT0 + index : GL_NONE;
+       if(index == 0)
+       {
+               readBuffer = drawBuffer[0];
+       }
 }
 
 void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
@@ -82,6 +94,26 @@ void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint leve
        mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer, level, layer);
 }
 
+void Framebuffer::setReadBuffer(GLenum buf)
+{
+       readBuffer = buf;
+}
+
+void Framebuffer::setDrawBuffer(GLuint index, GLenum buf)
+{
+       drawBuffer[index] = buf;
+}
+
+GLenum Framebuffer::getReadBuffer() const
+{
+       return readBuffer;
+}
+
+GLenum Framebuffer::getDrawBuffer(GLuint index) const
+{
+       return drawBuffer[index];
+}
+
 void Framebuffer::detachTexture(GLuint texture)
 {
        for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
index ed3f5f2..6a38b83 100644 (file)
@@ -39,6 +39,11 @@ public:
     void setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level = 0, GLint layer = 0);\r
     void setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level = 0, GLint layer = 0);\r
 \r
+       void setReadBuffer(GLenum buf);\r
+       void setDrawBuffer(GLuint index, GLenum buf);\r
+       GLenum getReadBuffer() const;\r
+       GLenum getDrawBuffer(GLuint index) const;\r
+\r
     void detachTexture(GLuint texture);\r
     void detachRenderbuffer(GLuint renderbuffer);\r
 \r
@@ -76,6 +81,8 @@ public:
 protected:\r
     GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];\r
     gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];\r
+       GLenum readBuffer;\r
+       GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];\r
 \r
     GLenum mDepthbufferType;\r
     gl::BindingPointer<Renderbuffer> mDepthbufferPointer;\r
index d9d9742..31ec793 100644 (file)
@@ -513,10 +513,10 @@ GL_APICALL void GL_APIENTRY glReadBuffer(GLenum src)
                        {\r
                                return error(GL_INVALID_OPERATION);\r
                        }\r
-                       context->setReadFramebufferColorIndex(0);\r
+                       context->setFramebufferReadBuffer(src);\r
                        break;\r
                case GL_NONE:\r
-                       context->setReadFramebufferColorIndex(GL_INVALID_INDEX);\r
+                       context->setFramebufferReadBuffer(src);\r
                        break;\r
                case GL_COLOR_ATTACHMENT0:\r
                case GL_COLOR_ATTACHMENT1:\r
@@ -560,7 +560,7 @@ GL_APICALL void GL_APIENTRY glReadBuffer(GLenum src)
                        {\r
                                return error(GL_INVALID_OPERATION);\r
                        }\r
-                       context->setReadFramebufferColorIndex(index);\r
+                       context->setFramebufferReadBuffer(src);\r
                }\r
                        break;\r
                default:\r
@@ -1211,7 +1211,7 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
                        }\r
                }\r
 \r
-               context->setDrawFramebufferColorIndices(n, bufs);\r
+               context->setFramebufferDrawBuffers(n, bufs);\r
        }\r
 }\r
 \r