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)
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<typename T> 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<typename T> 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<typename T> 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<typename T> 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;
......
......@@ -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)
......
......@@ -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);
......
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