On 07/17/2014 09:21 AM, Pavel Popov wrote:
According to spec (OpenGL 4.0 specification, pages 254-255) we have a different
bits set
for one buffer and for multiple buffers. For glDrawBuffer we may have up to
four bits set
but for glDrawBuffers we can only have one bit set.
The _mesa_drawbuffers is called with ctx->Const.MaxDrawBuffers and NULL
arguments when
_mesa_update_framebuffer or _mesa_update_draw_buffers is called. In this
situation realization
for glDrawBuffers is used for any number of buffers. Even for one. But
glDrawBuffer have to be
used for one buffer instead of glDrawBuffers.
Piglit test 'gl30basic' fails with assert with debug Mesa and pass with release
'main/buffers.c:520: _mesa_drawbuffers: Assertion
`__builtin_popcount(destMask[buf]) == 1' failed.'
Probably some other tests also can be affected.
Signed-off-by: Pavel Popov <pavel.e.po...@intel.com>
---
src/mesa/main/buffers.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
index b13a7af..a640360 100644
--- a/src/mesa/main/buffers.c
+++ b/src/mesa/main/buffers.c
@@ -480,6 +480,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const
GLenum *buffers,
struct gl_framebuffer *fb = ctx->DrawBuffer;
GLbitfield mask[MAX_DRAW_BUFFERS];
GLuint buf;
+ GLuint m = n;
if (!destMask) {
/* compute destMask values now */
@@ -489,15 +490,17 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const
GLenum *buffers,
mask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);
ASSERT(mask[output] != BAD_MASK);
mask[output] &= supportedMask;
+ if (mask[output] == 0)
+ m--;
}
destMask = mask;
}
/*
- * If n==1, destMask[0] may have up to four bits set.
+ * If m==1, destMask[0] may have up to four bits set.
* Otherwise, destMask[x] can only have one bit set.
*/
- if (n == 1) {
+ if (m == 1) {
GLuint count = 0, destMask0 = destMask[0];
while (destMask0) {
GLint bufIndex = ffs(destMask0) - 1;
Weird. I remembered seeing this assertion a few days ago, but now I
can't reproduce it. I don't know what might have changed.
In any case, I don't think the patch is quite right. If the array of
buffers was something like {GL_NONE, GL_COLOR_ATTACHMENT1, GL_NONE,
GL_NONE} and n=4 you'd wind up with m=1, but you'd be executing the
wrong part of the if block.
Instead, I think you'd need to test if (m == 1 && destMask[0]) since
it's the 0th entry that requires special validation.
And as someone else pointed out, please word-wrap the commit msg to
70-75 chars.
-Brian
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev