[Mesa-dev] [PATCH 5/5] st/mesa: don't update unrelated states in non-draw calls such as Clear
Brian Paul
brianp at vmware.com
Thu Feb 23 04:04:52 UTC 2017
Series LGTM.
Reviewed-by: Brian Paul <brianp at vmware.com>
On 02/22/2017 05:07 PM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> If a VAO isn't bound and u_vbuf isn't enabled because of the Core profile,
> we'll get user vertex buffers in drivers if we update vertex buffers
> in glClear. So don't do that.
>
> This fixes a regression since disabling u_vbuf for Core profiles.
> ---
> src/mesa/state_tracker/st_atom.c | 10 ++++++++++
> src/mesa/state_tracker/st_atom.h | 7 +++++++
> src/mesa/state_tracker/st_cb_clear.c | 2 +-
> src/mesa/state_tracker/st_cb_fbo.c | 2 +-
> src/mesa/state_tracker/st_cb_msaa.c | 2 +-
> src/mesa/state_tracker/st_cb_readpixels.c | 2 +-
> 6 files changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
> index 65ac517..4bef342 100644
> --- a/src/mesa/state_tracker/st_atom.c
> +++ b/src/mesa/state_tracker/st_atom.c
> @@ -169,20 +169,30 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline )
> case ST_PIPELINE_RENDER:
> if (st->ctx->API == API_OPENGL_COMPAT)
> check_attrib_edgeflag(st);
>
> check_program_state(st);
> st_manager_validate_framebuffers(st);
>
> pipeline_mask = ST_PIPELINE_RENDER_STATE_MASK;
> break;
>
> + case ST_PIPELINE_CLEAR:
> + st_manager_validate_framebuffers(st);
> + pipeline_mask = ST_PIPELINE_CLEAR_STATE_MASK;
> + break;
> +
> + case ST_PIPELINE_UPDATE_FRAMEBUFFER:
> + st_manager_validate_framebuffers(st);
> + pipeline_mask = ST_PIPELINE_UPDATE_FB_STATE_MASK;
> + break;
> +
> case ST_PIPELINE_COMPUTE: {
> struct st_compute_program *old_cp = st->cp;
> struct gl_program *new_cp = ctx->ComputeProgram._Current;
>
> if (new_cp != &old_cp->Base) {
> if (old_cp)
> st->dirty |= old_cp->affected_states;
> assert(new_cp);
> st->dirty |= st_compute_program(new_cp)->affected_states;
> }
> diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
> index 37e382c..45c3e48 100644
> --- a/src/mesa/state_tracker/st_atom.h
> +++ b/src/mesa/state_tracker/st_atom.h
> @@ -36,20 +36,22 @@
>
> #include "main/glheader.h"
>
> struct st_context;
>
> /**
> * Enumeration of state tracker pipelines.
> */
> enum st_pipeline {
> ST_PIPELINE_RENDER,
> + ST_PIPELINE_CLEAR,
> + ST_PIPELINE_UPDATE_FRAMEBUFFER,
> ST_PIPELINE_COMPUTE,
> };
>
> struct st_tracked_state {
> void (*update)( struct st_context *st );
> };
>
>
> void st_init_atoms( struct st_context *st );
> void st_destroy_atoms( struct st_context *st );
> @@ -138,15 +140,20 @@ enum {
> ST_NEW_SAMPLERS | \
> ST_NEW_CONSTANTS | \
> ST_NEW_UNIFORM_BUFFER | \
> ST_NEW_ATOMIC_BUFFER | \
> ST_NEW_STORAGE_BUFFER | \
> ST_NEW_IMAGE_UNITS)
>
> /* All state flags within each group: */
> #define ST_PIPELINE_RENDER_STATE_MASK (ST_NEW_CS_STATE - 1)
> #define ST_PIPELINE_COMPUTE_STATE_MASK (0xffllu << ST_NEW_CS_STATE_INDEX)
> +#define ST_PIPELINE_CLEAR_STATE_MASK (ST_NEW_FB_STATE | \
> + ST_NEW_SCISSOR | \
> + ST_NEW_WINDOW_RECTANGLES)
> +/* For ReadPixels, ReadBuffer, GetSamplePosition: */
> +#define ST_PIPELINE_UPDATE_FB_STATE_MASK (ST_NEW_FB_STATE)
>
> #define ST_ALL_STATES_MASK (ST_PIPELINE_RENDER_STATE_MASK | \
> ST_PIPELINE_COMPUTE_STATE_MASK)
>
> #endif
> diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
> index 158efc1..f507775 100644
> --- a/src/mesa/state_tracker/st_cb_clear.c
> +++ b/src/mesa/state_tracker/st_cb_clear.c
> @@ -399,21 +399,21 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
> struct gl_renderbuffer *stencilRb
> = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
> GLbitfield quad_buffers = 0x0;
> GLbitfield clear_buffers = 0x0;
> GLuint i;
>
> st_flush_bitmap_cache(st);
> st_invalidate_readpix_cache(st);
>
> /* This makes sure the pipe has the latest scissor, etc values */
> - st_validate_state( st, ST_PIPELINE_RENDER );
> + st_validate_state(st, ST_PIPELINE_CLEAR);
>
> if (mask & BUFFER_BITS_COLOR) {
> for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> GLint b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
>
> if (b >= 0 && mask & (1 << b)) {
> struct gl_renderbuffer *rb
> = ctx->DrawBuffer->Attachment[b].Renderbuffer;
> struct st_renderbuffer *strb = st_renderbuffer(rb);
> int colormask_index = ctx->Extensions.EXT_draw_buffers2 ? i : 0;
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index d762ca6..78433bf 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -727,21 +727,21 @@ st_ReadBuffer(struct gl_context *ctx, GLenum buffer)
> /* Check if we need to allocate a front color buffer.
> * Front buffers are often allocated on demand (other color buffers are
> * always allocated in advance).
> */
> if ((fb->_ColorReadBufferIndex == BUFFER_FRONT_LEFT ||
> fb->_ColorReadBufferIndex == BUFFER_FRONT_RIGHT) &&
> fb->Attachment[fb->_ColorReadBufferIndex].Type == GL_NONE) {
> /* add the buffer */
> st_manager_add_color_renderbuffer(st, fb, fb->_ColorReadBufferIndex);
> _mesa_update_state(ctx);
> - st_validate_state(st, ST_PIPELINE_RENDER);
> + st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
> }
> }
>
>
>
> /**
> * Called via ctx->Driver.MapRenderbuffer.
> */
> static void
> st_MapRenderbuffer(struct gl_context *ctx,
> diff --git a/src/mesa/state_tracker/st_cb_msaa.c b/src/mesa/state_tracker/st_cb_msaa.c
> index 22001e4..7f1b4fd 100644
> --- a/src/mesa/state_tracker/st_cb_msaa.c
> +++ b/src/mesa/state_tracker/st_cb_msaa.c
> @@ -38,21 +38,21 @@
>
>
> static void
> st_GetSamplePosition(struct gl_context *ctx,
> struct gl_framebuffer *fb,
> GLuint index,
> GLfloat *outPos)
> {
> struct st_context *st = st_context(ctx);
>
> - st_validate_state(st, ST_PIPELINE_RENDER);
> + st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
>
> if (st->pipe->get_sample_position)
> st->pipe->get_sample_position(st->pipe,
> _mesa_geometric_samples(fb),
> index, outPos);
> else
> outPos[0] = outPos[1] = 0.5f;
> }
>
>
> diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
> index 2bcc6be..ec6fd37 100644
> --- a/src/mesa/state_tracker/st_cb_readpixels.c
> +++ b/src/mesa/state_tracker/st_cb_readpixels.c
> @@ -410,21 +410,21 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
> struct pipe_resource *src;
> struct pipe_resource *dst = NULL;
> enum pipe_format dst_format, src_format;
> unsigned bind;
> struct pipe_transfer *tex_xfer;
> ubyte *map = NULL;
> int dst_x, dst_y;
>
> /* Validate state (to be sure we have up-to-date framebuffer surfaces)
> * and flush the bitmap cache prior to reading. */
> - st_validate_state(st, ST_PIPELINE_RENDER);
> + st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
> st_flush_bitmap_cache(st);
>
> if (!st->prefer_blit_based_texture_transfer) {
> goto fallback;
> }
>
> /* This must be done after state validation. */
> src = strb->texture;
>
> /* XXX Fallback for depth-stencil formats due to an incomplete
>
More information about the mesa-dev
mailing list