[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:35:54 PST 2012
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.
> 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