From 66747475f8d7492dc604bd79271da1e93092c515 Mon Sep 17 00:00:00 2001 From: Nicolas Capens Date: Mon, 18 Apr 2016 14:32:22 -0400 Subject: [PATCH] Fix draw buffers support. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Bug 19353282 Change-Id: I6d1022c42a3347b8deb01af15078769d794050cb Reviewed-on: https://swiftshader-review.googlesource.com/5146 Tested-by: Nicolas Capens Reviewed-by: Alexis Hétu Reviewed-by: Nicolas Capens --- src/OpenGL/libGLESv2/Context.cpp | 39 +++++++++++++++++++++++------------- src/OpenGL/libGLESv2/Framebuffer.cpp | 5 ----- src/OpenGL/libGLESv2/libGLESv3.cpp | 34 +++++++++++++++---------------- 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index af7a8848b..e20f27591 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp @@ -733,10 +733,11 @@ void Context::setFramebufferReadBuffer(GLuint buf) void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs) { - Framebuffer* drawFramebuffer = getDrawFramebuffer(); - for(int i = 0; i < n; ++i) + Framebuffer *drawFramebuffer = getDrawFramebuffer(); + + for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++) { - drawFramebuffer->setDrawBuffer(i, bufs[i]); + drawFramebuffer->setDrawBuffer(i, (i < n) ? bufs[i] : GL_NONE); } } @@ -2082,8 +2083,8 @@ template bool Context::getIntegerv(GLenum pname, T *params) const return false; } break; - case GL_DRAW_BUFFER0: // symbolic constant, initial value is GL_BACK​ - case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE + case GL_DRAW_BUFFER0: + case GL_DRAW_BUFFER1: case GL_DRAW_BUFFER2: case GL_DRAW_BUFFER3: case GL_DRAW_BUFFER4: @@ -2100,7 +2101,7 @@ template bool Context::getIntegerv(GLenum pname, T *params) const case GL_DRAW_BUFFER15: *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0); break; - case GL_MAJOR_VERSION: // integer, at least 3 + case GL_MAJOR_VERSION: if(clientVersion >= 3) { *params = clientVersion; @@ -2116,7 +2117,7 @@ template bool Context::getIntegerv(GLenum pname, T *params) const case GL_MAX_ARRAY_TEXTURE_LAYERS: // GLint, at least 2048 *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break; - case GL_MAX_COLOR_ATTACHMENTS: // integer, at least 8 + case GL_MAX_COLOR_ATTACHMENTS: *params = MAX_COLOR_ATTACHMENTS; break; case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: // integer, at least 50048 @@ -2129,8 +2130,7 @@ template bool Context::getIntegerv(GLenum pname, T *params) const case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: // integer, at least 50176 *params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS; break; - case GL_MAX_DRAW_BUFFERS: // integer, at least 8 - UNIMPLEMENTED(); + case GL_MAX_DRAW_BUFFERS: *params = MAX_DRAW_BUFFERS; break; case GL_MAX_ELEMENT_INDEX: @@ -2676,11 +2676,18 @@ bool Context::applyRenderTarget() return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); } - for(int i = 0; i < MAX_DRAW_BUFFERS; ++i) + for(int i = 0; i < MAX_DRAW_BUFFERS; i++) { - egl::Image *renderTarget = framebuffer->getRenderTarget(i); - device->setRenderTarget(i, renderTarget); - if(renderTarget) renderTarget->release(); + if(framebuffer->getDrawBuffer(i) != GL_NONE) + { + egl::Image *renderTarget = framebuffer->getRenderTarget(i); + device->setRenderTarget(i, renderTarget); + if(renderTarget) renderTarget->release(); + } + else + { + device->setRenderTarget(i, nullptr); + } } egl::Image *depthBuffer = framebuffer->getDepthBuffer(); @@ -2840,7 +2847,11 @@ void Context::applyState(GLenum drawMode) if(mMaskStateDirty) { - device->setColorWriteMask(0, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha)); + for(int i = 0; i < MAX_DRAW_BUFFERS; i++) + { + device->setColorWriteMask(i, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha)); + } + device->setDepthWriteEnable(mState.depthMask); mMaskStateDirty = false; diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp index 34f326340..dd1987022 100644 --- a/src/OpenGL/libGLESv2/Framebuffer.cpp +++ b/src/OpenGL/libGLESv2/Framebuffer.cpp @@ -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) diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp index 1adb45cf0..419d09167 100644 --- a/src/OpenGL/libGLESv2/libGLESv3.cpp +++ b/src/OpenGL/libGLESv2/libGLESv3.cpp @@ -1137,11 +1137,6 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs) return error(GL_INVALID_VALUE); } - if(n == 0) - { - return; - } - es2::Context *context = es2::getContext(); if(context) @@ -1197,21 +1192,24 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs) case GL_COLOR_ATTACHMENT29: case GL_COLOR_ATTACHMENT30: case GL_COLOR_ATTACHMENT31: - { - GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0); - if(index >= MAX_COLOR_ATTACHMENTS) { - return error(GL_INVALID_ENUM); - } - if(index != i) - { - return error(GL_INVALID_OPERATION); - } - if(drawFramebufferName == 0) - { - return error(GL_INVALID_OPERATION); + GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0); + + if(index >= MAX_COLOR_ATTACHMENTS) + { + return error(GL_INVALID_OPERATION); + } + + if(index != i) + { + return error(GL_INVALID_OPERATION); + } + + if(drawFramebufferName == 0) + { + return error(GL_INVALID_OPERATION); + } } - } break; default: return error(GL_INVALID_ENUM); -- 2.11.0