\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
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
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
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
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
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
\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
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
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