[Mesa-dev] [PATCH 35/38] main: Refactor _mesa_ReadBuffer.
Fredrik Höglund
fredrik at kde.org
Thu Apr 16 10:16:22 PDT 2015
On Wednesday 04 March 2015, Laura Ekstrand wrote:
> This could have added a new DD table entry for ReadBuffer that takes an
> arbitrary read buffer, but, after looking at the existing DD functions,
> Kenneth Graunke recommended that we just skip calling the DD functions in the
> case of ARB_direct_state_access. The DD implementations for ReadBuffer
> have limited functionality, especially with respect to
> ARB_direct_state_access.
> ---
> src/mesa/main/buffers.c | 45 +++++++++++++++++++++++++--------------------
> src/mesa/main/buffers.h | 7 ++++++-
> src/mesa/main/context.c | 2 +-
> 3 files changed, 32 insertions(+), 22 deletions(-)
>
> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
> index 8d95c68..e244d1e 100644
> --- a/src/mesa/main/buffers.c
> +++ b/src/mesa/main/buffers.c
> @@ -624,11 +624,10 @@ _mesa_update_draw_buffers(struct gl_context *ctx)
> * \param bufferIndex the numerical index corresponding to 'buffer'
> */
> void
> -_mesa_readbuffer(struct gl_context *ctx, GLenum buffer, GLint bufferIndex)
> +_mesa_readbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
> + GLenum buffer, GLint bufferIndex)
> {
> - struct gl_framebuffer *fb = ctx->ReadBuffer;
> -
> - if (_mesa_is_winsys_fbo(fb)) {
> + if ((fb == ctx->ReadBuffer) && _mesa_is_winsys_fbo(fb)) {
> /* Only update the per-context READ_BUFFER state if we're bound to
> * a window-system framebuffer.
> */
> @@ -647,23 +646,17 @@ _mesa_readbuffer(struct gl_context *ctx, GLenum buffer, GLint bufferIndex)
> * Called by glReadBuffer to set the source renderbuffer for reading pixels.
> * \param mode color buffer such as GL_FRONT, GL_BACK, etc.
> */
> -void GLAPIENTRY
> -_mesa_ReadBuffer(GLenum buffer)
> +void
> +_mesa_read_buffer(struct gl_context *ctx, struct gl_framebuffer *fb,
> + GLenum buffer, const char *caller)
> {
> - struct gl_framebuffer *fb;
> GLbitfield supportedMask;
> GLint srcBuffer;
> - GET_CURRENT_CONTEXT(ctx);
>
> FLUSH_VERTICES(ctx, 0);
>
> if (MESA_VERBOSE & VERBOSE_API)
> - _mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(buffer));
> -
> - fb = ctx->ReadBuffer;
> -
> - if (MESA_VERBOSE & VERBOSE_API)
> - _mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(buffer));
> + _mesa_debug(ctx, "%s %s\n", caller, _mesa_lookup_enum_by_nr(buffer));
>
> if (buffer == GL_NONE) {
> /* This is legal--it means that no buffer should be bound for reading. */
> @@ -674,24 +667,36 @@ _mesa_ReadBuffer(GLenum buffer)
> srcBuffer = read_buffer_enum_to_index(buffer);
> if (srcBuffer == -1) {
> _mesa_error(ctx, GL_INVALID_ENUM,
> - "glReadBuffer(buffer=0x%x)", buffer);
> + "%s(invalid buffer %s)", caller,
> + _mesa_lookup_enum_by_nr(buffer));
> return;
> }
> supportedMask = supported_buffer_bitmask(ctx, fb);
> if (((1 << srcBuffer) & supportedMask) == 0) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glReadBuffer(buffer=0x%x)", buffer);
> + "%s(invalid buffer %s)", caller,
> + _mesa_lookup_enum_by_nr(buffer));
> return;
> }
> }
>
> /* OK, all error checking has been completed now */
>
> - _mesa_readbuffer(ctx, buffer, srcBuffer);
> + _mesa_readbuffer(ctx, fb, buffer, srcBuffer);
>
> /*
> - * Call device driver function.
> + * Call the device driver function only if caller is the traditional entry
> + * point.
> */
> - if (ctx->Driver.ReadBuffer)
> - (*ctx->Driver.ReadBuffer)(ctx, buffer);
> + if (strcmp(caller, "glReadBuffer") == 0) {
> + if (ctx->Driver.ReadBuffer)
> + (*ctx->Driver.ReadBuffer)(ctx, buffer);
> + }
> +}
As in patch 33, I think the test should be whether fb is the currently
bound framebuffer.
> +
> +void GLAPIENTRY
> +_mesa_ReadBuffer(GLenum buffer)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_read_buffer(ctx, ctx->ReadBuffer, buffer, "glReadBuffer");
> }
> diff --git a/src/mesa/main/buffers.h b/src/mesa/main/buffers.h
> index 12d5743..ca7ad19 100644
> --- a/src/mesa/main/buffers.h
> +++ b/src/mesa/main/buffers.h
> @@ -57,12 +57,17 @@ _mesa_drawbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
> const GLbitfield *destMask);
>
> extern void
> -_mesa_readbuffer(struct gl_context *ctx, GLenum buffer, GLint bufferIndex);
> +_mesa_readbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
> + GLenum buffer, GLint bufferIndex);
>
> extern void
> _mesa_update_draw_buffers(struct gl_context *ctx);
>
>
> +extern void
> +_mesa_read_buffer(struct gl_context *ctx, struct gl_framebuffer *fb,
> + GLenum buffer, const char *caller);
> +
> extern void GLAPIENTRY
> _mesa_ReadBuffer( GLenum mode );
>
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index b285d51..8ea9e33 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -1581,7 +1581,7 @@ handle_first_current(struct gl_context *ctx)
> bufferIndex = BUFFER_FRONT_LEFT;
> }
>
> - _mesa_readbuffer(ctx, buffer, bufferIndex);
> + _mesa_readbuffer(ctx, ctx->ReadBuffer, buffer, bufferIndex);
> }
> }
>
>
More information about the mesa-dev
mailing list