OSDN Git Service

Fix draw buffers support.
authorNicolas Capens <capn@google.com>
Mon, 18 Apr 2016 18:32:22 +0000 (14:32 -0400)
committerNicolas Capens <capn@google.com>
Mon, 18 Apr 2016 21:48:05 +0000 (21:48 +0000)
Bug 19353282

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

index af7a884..e20f275 100644 (file)
@@ -733,10 +733,11 @@ void Context::setFramebufferReadBuffer(GLuint buf)
 \r
 void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)\r
 {\r
-       Framebuffer* drawFramebuffer = getDrawFramebuffer();\r
-       for(int i = 0; i < n; ++i)\r
+       Framebuffer *drawFramebuffer = getDrawFramebuffer();\r
+\r
+       for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)\r
        {\r
-               drawFramebuffer->setDrawBuffer(i, bufs[i]);\r
+               drawFramebuffer->setDrawBuffer(i, (i < n) ? bufs[i] : GL_NONE);\r
        }\r
 }\r
 \r
@@ -2082,8 +2083,8 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                        return false;\r
                }\r
                break;\r
-       case GL_DRAW_BUFFER0: // symbolic constant, initial value is GL_BACK​\r
-       case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE\r
+       case GL_DRAW_BUFFER0:\r
+       case GL_DRAW_BUFFER1:\r
        case GL_DRAW_BUFFER2:\r
        case GL_DRAW_BUFFER3:\r
        case GL_DRAW_BUFFER4:\r
@@ -2100,7 +2101,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_DRAW_BUFFER15:\r
                *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);\r
                break;\r
-       case GL_MAJOR_VERSION: // integer, at least 3\r
+       case GL_MAJOR_VERSION:\r
                if(clientVersion >= 3)\r
                {\r
                        *params = clientVersion;\r
@@ -2116,7 +2117,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_MAX_ARRAY_TEXTURE_LAYERS: // GLint, at least 2048\r
                *params = IMPLEMENTATION_MAX_TEXTURE_SIZE;\r
                break;\r
-       case GL_MAX_COLOR_ATTACHMENTS: // integer, at least 8\r
+       case GL_MAX_COLOR_ATTACHMENTS:\r
                *params = MAX_COLOR_ATTACHMENTS;\r
                break;\r
        case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: // integer, at least 50048\r
@@ -2129,8 +2130,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: // integer, at least 50176\r
                *params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;\r
                break;\r
-       case GL_MAX_DRAW_BUFFERS: // integer, at least 8\r
-               UNIMPLEMENTED();\r
+       case GL_MAX_DRAW_BUFFERS:\r
                *params = MAX_DRAW_BUFFERS;\r
                break;\r
        case GL_MAX_ELEMENT_INDEX:\r
@@ -2676,11 +2676,18 @@ bool Context::applyRenderTarget()
         return error(GL_INVALID_FRAMEBUFFER_OPERATION, false);\r
     }\r
 \r
-       for(int i = 0; i < MAX_DRAW_BUFFERS; ++i)\r
+       for(int i = 0; i < MAX_DRAW_BUFFERS; i++)\r
        {\r
-               egl::Image *renderTarget = framebuffer->getRenderTarget(i);\r
-               device->setRenderTarget(i, renderTarget);\r
-               if(renderTarget) renderTarget->release();\r
+               if(framebuffer->getDrawBuffer(i) != GL_NONE)\r
+               {\r
+                       egl::Image *renderTarget = framebuffer->getRenderTarget(i);\r
+                       device->setRenderTarget(i, renderTarget);\r
+                       if(renderTarget) renderTarget->release();\r
+               }\r
+               else\r
+               {\r
+                       device->setRenderTarget(i, nullptr);\r
+               }\r
        }\r
 \r
     egl::Image *depthBuffer = framebuffer->getDepthBuffer();\r
@@ -2840,7 +2847,11 @@ void Context::applyState(GLenum drawMode)
 \r
     if(mMaskStateDirty)\r
     {\r
-               device->setColorWriteMask(0, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha));\r
+               for(int i = 0; i < MAX_DRAW_BUFFERS; i++)\r
+               {\r
+                       device->setColorWriteMask(i, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha));\r
+               }\r
+\r
                device->setDepthWriteEnable(mState.depthMask);\r
 \r
         mMaskStateDirty = false;\r
index 34f3263..dd19870 100644 (file)
@@ -80,11 +80,6 @@ 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)
index 1adb45c..419d091 100644 (file)
@@ -1137,11 +1137,6 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       if(n == 0)\r
-       {\r
-               return;\r
-       }\r
-\r
        es2::Context *context = es2::getContext();\r
 \r
        if(context)\r
@@ -1197,21 +1192,24 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
                        case GL_COLOR_ATTACHMENT29:\r
                        case GL_COLOR_ATTACHMENT30:\r
                        case GL_COLOR_ATTACHMENT31:\r
-                       {\r
-                               GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0);\r
-                               if(index >= MAX_COLOR_ATTACHMENTS)\r
                                {\r
-                                       return error(GL_INVALID_ENUM);\r
-                               }\r
-                               if(index != i)\r
-                               {\r
-                                       return error(GL_INVALID_OPERATION);\r
-                               }\r
-                               if(drawFramebufferName == 0)\r
-                               {\r
-                                       return error(GL_INVALID_OPERATION);\r
+                                       GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0);\r
+\r
+                                       if(index >= MAX_COLOR_ATTACHMENTS)\r
+                                       {\r
+                                               return error(GL_INVALID_OPERATION);\r
+                                       }\r
+\r
+                                       if(index != i)\r
+                                       {\r
+                                               return error(GL_INVALID_OPERATION);\r
+                                       }\r
+\r
+                                       if(drawFramebufferName == 0)\r
+                                       {\r
+                                               return error(GL_INVALID_OPERATION);\r
+                                       }\r
                                }\r
-                       }\r
                                break;\r
                        default:\r
                                return error(GL_INVALID_ENUM);\r