glDrawBuffers(n==0) is valid
According to the GL spec, calling glDrawBuffers() with n == 0 is a valid operation (and essentially prevents drawing to any buffers). But _msa_DrawBuffersARB() was producing a GL_INVALID_VALUE error in this case. This fix adjusts the error check, and makes a small change to the ctx->Driver.DrawBuffer() call below to ensure that, if n == 0, Driver.DrawBuffer() is called with GL_NONE and that buffers[0] is *not* referenced in this case (since we don't know whether it is valid). Internal identifier: 365833
This commit is contained in:
@@ -290,7 +290,10 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||
|
||||
if (n < 1 || n > (GLsizei) ctx->Const.MaxDrawBuffers) {
|
||||
/* Turns out n==0 is a valid input that should not produce an error.
|
||||
* The remaining code below correctly handles the n==0 case.
|
||||
*/
|
||||
if (n < 0 || n > (GLsizei) ctx->Const.MaxDrawBuffers) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawBuffersARB(n)");
|
||||
return;
|
||||
}
|
||||
@@ -332,12 +335,14 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
||||
_mesa_drawbuffers(ctx, n, buffers, destMask);
|
||||
|
||||
/*
|
||||
* Call device driver function.
|
||||
* Call device driver function. Note that n can be equal to 0,
|
||||
* in which case we don't want to reference buffers[0], which
|
||||
* may not be valid.
|
||||
*/
|
||||
if (ctx->Driver.DrawBuffers)
|
||||
ctx->Driver.DrawBuffers(ctx, n, buffers);
|
||||
else if (ctx->Driver.DrawBuffer)
|
||||
ctx->Driver.DrawBuffer(ctx, buffers[0]);
|
||||
ctx->Driver.DrawBuffer(ctx, n>0? buffers[0]:GL_NONE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user