Commit 66747475 by Nicolas Capens

Fix draw buffers support.

Bug 19353282 Change-Id: I6d1022c42a3347b8deb01af15078769d794050cb Reviewed-on: https://swiftshader-review.googlesource.com/5146Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 8b124c10
...@@ -733,10 +733,11 @@ void Context::setFramebufferReadBuffer(GLuint buf) ...@@ -733,10 +733,11 @@ void Context::setFramebufferReadBuffer(GLuint buf)
void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs) void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)
{ {
Framebuffer* drawFramebuffer = getDrawFramebuffer(); Framebuffer *drawFramebuffer = getDrawFramebuffer();
for(int i = 0; i < n; ++i)
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<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2082,8 +2083,8 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
return false; return false;
} }
break; break;
case GL_DRAW_BUFFER0: // symbolic constant, initial value is GL_BACK​ case GL_DRAW_BUFFER0:
case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE case GL_DRAW_BUFFER1:
case GL_DRAW_BUFFER2: case GL_DRAW_BUFFER2:
case GL_DRAW_BUFFER3: case GL_DRAW_BUFFER3:
case GL_DRAW_BUFFER4: case GL_DRAW_BUFFER4:
...@@ -2100,7 +2101,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2100,7 +2101,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
case GL_DRAW_BUFFER15: case GL_DRAW_BUFFER15:
*params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0); *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);
break; break;
case GL_MAJOR_VERSION: // integer, at least 3 case GL_MAJOR_VERSION:
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
*params = clientVersion; *params = clientVersion;
...@@ -2116,7 +2117,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -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 case GL_MAX_ARRAY_TEXTURE_LAYERS: // GLint, at least 2048
*params = IMPLEMENTATION_MAX_TEXTURE_SIZE; *params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
break; break;
case GL_MAX_COLOR_ATTACHMENTS: // integer, at least 8 case GL_MAX_COLOR_ATTACHMENTS:
*params = MAX_COLOR_ATTACHMENTS; *params = MAX_COLOR_ATTACHMENTS;
break; break;
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: // integer, at least 50048 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: // integer, at least 50048
...@@ -2129,8 +2130,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -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 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: // integer, at least 50176
*params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS; *params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;
break; break;
case GL_MAX_DRAW_BUFFERS: // integer, at least 8 case GL_MAX_DRAW_BUFFERS:
UNIMPLEMENTED();
*params = MAX_DRAW_BUFFERS; *params = MAX_DRAW_BUFFERS;
break; break;
case GL_MAX_ELEMENT_INDEX: case GL_MAX_ELEMENT_INDEX:
...@@ -2676,12 +2676,19 @@ bool Context::applyRenderTarget() ...@@ -2676,12 +2676,19 @@ bool Context::applyRenderTarget()
return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); 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++)
{
if(framebuffer->getDrawBuffer(i) != GL_NONE)
{ {
egl::Image *renderTarget = framebuffer->getRenderTarget(i); egl::Image *renderTarget = framebuffer->getRenderTarget(i);
device->setRenderTarget(i, renderTarget); device->setRenderTarget(i, renderTarget);
if(renderTarget) renderTarget->release(); if(renderTarget) renderTarget->release();
} }
else
{
device->setRenderTarget(i, nullptr);
}
}
egl::Image *depthBuffer = framebuffer->getDepthBuffer(); egl::Image *depthBuffer = framebuffer->getDepthBuffer();
device->setDepthBuffer(depthBuffer); device->setDepthBuffer(depthBuffer);
...@@ -2840,7 +2847,11 @@ void Context::applyState(GLenum drawMode) ...@@ -2840,7 +2847,11 @@ void Context::applyState(GLenum drawMode)
if(mMaskStateDirty) 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); device->setDepthWriteEnable(mState.depthMask);
mMaskStateDirty = false; mMaskStateDirty = false;
......
...@@ -80,11 +80,6 @@ void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index, ...@@ -80,11 +80,6 @@ void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index,
{ {
mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE; mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE;
mColorbufferPointer[index] = lookupRenderbuffer(type, colorbuffer, level, layer); 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) void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
......
...@@ -1137,11 +1137,6 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs) ...@@ -1137,11 +1137,6 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(n == 0)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1199,14 +1194,17 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs) ...@@ -1199,14 +1194,17 @@ GL_APICALL void GL_APIENTRY glDrawBuffers(GLsizei n, const GLenum *bufs)
case GL_COLOR_ATTACHMENT31: case GL_COLOR_ATTACHMENT31:
{ {
GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0); GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0);
if(index >= MAX_COLOR_ATTACHMENTS) if(index >= MAX_COLOR_ATTACHMENTS)
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
if(index != i) if(index != i)
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(drawFramebufferName == 0) if(drawFramebufferName == 0)
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment