[Mesa-dev] [alternate PATCH 1.1/6] mesa: Handle GL_BACK correctly for ES 3.0 in glDrawBuffers().

Anuj Phogat anuj.phogat at gmail.com
Tue Dec 18 16:42:15 PST 2012


On Tue, Dec 18, 2012 at 4:35 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:
> On Tue, Dec 18, 2012 at 1:26 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
>> In ES 3.0, when calling glDrawBuffers() on the window system
>> framebuffer, the only valid targets are GL_NONE or GL_BACK.  Since there
>> is no stereo rendering in ES 3.0, this is a single buffer, unlike
>> desktop where it may be two (and thus isn't allowed).
>>
>> For single-buffered configs, GL_BACK ironically means the front (and
>> only) buffer.  I'm not sure that it matters, however, as ES shouldn't
>> have front buffer rendering in the first place.
>>
>> Fixes es3conform framebuffer_blit_coverage_default_draw_buffer_binding.
>> ---
>>  src/mesa/main/buffers.c | 21 +++++++++++++++++----
>>  1 file changed, 17 insertions(+), 4 deletions(-)
>>
>> These two patches are a proposed replacement for Anuj's patch 1/6.
>>
> patch 1/6 is still required to fix failures related to
> glGetFramebufferAttachmentParameteriv
> in framebuffer_blit_functionality_multisampled_to_singlesampled_blit test case.
> I'll soon post an updated patch.
>
Please ignore this comment. I confused it with my patch 2/6.

>> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
>> index aa9b9f0..244f4de 100644
>> --- a/src/mesa/main/buffers.c
>> +++ b/src/mesa/main/buffers.c
>> @@ -94,7 +94,7 @@ supported_buffer_bitmask(const struct gl_context *ctx,
>>   * GL_FRONT_AND_BACK), return the corresponding bitmask of BUFFER_BIT_* flags.
>>   */
>>  static GLbitfield
>> -draw_buffer_enum_to_bitmask(GLenum buffer)
>> +draw_buffer_enum_to_bitmask(const struct gl_context *ctx, GLenum buffer)
>>  {
>>     switch (buffer) {
>>        case GL_NONE:
>> @@ -102,6 +102,19 @@ draw_buffer_enum_to_bitmask(GLenum buffer)
>>        case GL_FRONT:
>>           return BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT;
>>        case GL_BACK:
>> +         if (_mesa_is_gles3(ctx)) {
>> +            /* From the ES 3.0 specification, page 180:
>> +             * "When draw buffer zero is BACK, color values are written into
>> +             *  the sole buffer for single-buffered contexts, or into the back
>> +             *  buffer for double-buffered contexts."
>> +             *
>> +             * Since there is no stereo rendering in ES 3.0, only return the
>> +             * LEFT bits.  This also satisfies the "n must be 1" requirement.
>> +             */
>> +            if (ctx->DrawBuffer->Visual.doubleBufferMode)
>> +               return BUFFER_BIT_BACK_LEFT;
>> +            return BUFFER_BIT_FRONT_LEFT;
>> +         }
>>           return BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT;
>>        case GL_RIGHT:
>>           return BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT;
>> @@ -241,7 +254,7 @@ _mesa_DrawBuffer(GLenum buffer)
>>     else {
>>        const GLbitfield supportedMask
>>           = supported_buffer_bitmask(ctx, ctx->DrawBuffer);
>> -      destMask = draw_buffer_enum_to_bitmask(buffer);
>> +      destMask = draw_buffer_enum_to_bitmask(ctx, buffer);
>>        if (destMask == BAD_MASK) {
>>           /* totally bogus buffer */
>>           _mesa_error(ctx, GL_INVALID_ENUM,
>> @@ -321,7 +334,7 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>>              return;
>>           }
>>
>> -         destMask[output] = draw_buffer_enum_to_bitmask(buffers[output]);
>> +         destMask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);
>>
>>           /* From the OpenGL 3.0 specification, page 258:
>>            * "Each buffer listed in bufs must be one of the values from tables
>> @@ -451,7 +464,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
>>        const GLbitfield supportedMask = supported_buffer_bitmask(ctx, fb);
>>        GLuint output;
>>        for (output = 0; output < n; output++) {
>> -         mask[output] = draw_buffer_enum_to_bitmask(buffers[output]);
>> +         mask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);
>>           ASSERT(mask[output] != BAD_MASK);
>>           mask[output] &= supportedMask;
>>        }
>> --
>> 1.8.0.2
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
> Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list