diff --git a/src/gallium/drivers/freedreno/ci/piglit-freedreno-a630-fails.txt b/src/gallium/drivers/freedreno/ci/piglit-freedreno-a630-fails.txt index 9375e6931ff..c901a7b90b3 100644 --- a/src/gallium/drivers/freedreno/ci/piglit-freedreno-a630-fails.txt +++ b/src/gallium/drivers/freedreno/ci/piglit-freedreno-a630-fails.txt @@ -189,18 +189,6 @@ spec@arb_texture_float@fbo-alphatest-formats,Fail spec@arb_texture_float@fbo-blending-formats,Fail spec@arb_texture_float@texwrap formats bordercolor-swizzled,Fail spec@arb_texture_multisample@arb_texture_multisample-dsa-texelfetch,Fail -spec@arb_texture_multisample@texelfetch@2-gs-isampler2dms,Fail -spec@arb_texture_multisample@texelfetch@2-gs-isampler2dmsarray,Fail -spec@arb_texture_multisample@texelfetch@2-gs-sampler2dms,Fail -spec@arb_texture_multisample@texelfetch@2-gs-sampler2dmsarray,Fail -spec@arb_texture_multisample@texelfetch@2-gs-usampler2dms,Fail -spec@arb_texture_multisample@texelfetch@2-gs-usampler2dmsarray,Fail -spec@arb_texture_multisample@texelfetch@4-gs-isampler2dms,Fail -spec@arb_texture_multisample@texelfetch@4-gs-isampler2dmsarray,Fail -spec@arb_texture_multisample@texelfetch@4-gs-sampler2dms,Fail -spec@arb_texture_multisample@texelfetch@4-gs-sampler2dmsarray,Fail -spec@arb_texture_multisample@texelfetch@4-gs-usampler2dms,Fail -spec@arb_texture_multisample@texelfetch@4-gs-usampler2dmsarray,Fail spec@arb_texture_rectangle@1-1-linear-texture,Fail spec@arb_texture_rectangle@copyteximage rect,Crash spec@arb_texture_rectangle@copyteximage rect samples=2,Crash diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 1650b8f6c7d..e799a3498ad 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -358,6 +358,7 @@ struct fd_context { struct fd_texture_stateobj tex[PIPE_SHADER_TYPES] dt; struct fd_program_stateobj prog dt; + uint32_t bound_shader_stages dt; struct fd_vertex_state vtx dt; diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index d0ccfa6c1eb..673fbaf50b5 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -149,14 +149,18 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) } } - if (ctx->dirty_shader[PIPE_SHADER_VERTEX] & FD_DIRTY_SHADER_CONST) { - u_foreach_bit (i, ctx->constbuf[PIPE_SHADER_VERTEX].enabled_mask) - resource_read(batch, ctx->constbuf[PIPE_SHADER_VERTEX].cb[i].buffer); - } + u_foreach_bit (s, ctx->bound_shader_stages) { + /* Mark constbuf as being read: */ + if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_CONST) { + u_foreach_bit (i, ctx->constbuf[s].enabled_mask) + resource_read(batch, ctx->constbuf[s].cb[i].buffer); + } - if (ctx->dirty_shader[PIPE_SHADER_FRAGMENT] & FD_DIRTY_SHADER_CONST) { - u_foreach_bit (i, ctx->constbuf[PIPE_SHADER_FRAGMENT].enabled_mask) - resource_read(batch, ctx->constbuf[PIPE_SHADER_FRAGMENT].cb[i].buffer); + /* Mark textures as being read */ + if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_TEX) { + u_foreach_bit (i, ctx->tex[s].valid_textures) + resource_read(batch, ctx->tex[s].textures[i]->texture); + } } /* Mark VBOs as being read */ @@ -167,17 +171,6 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) } } - /* Mark textures as being read */ - if (ctx->dirty_shader[PIPE_SHADER_VERTEX] & FD_DIRTY_SHADER_TEX) { - u_foreach_bit (i, ctx->tex[PIPE_SHADER_VERTEX].valid_textures) - resource_read(batch, ctx->tex[PIPE_SHADER_VERTEX].textures[i]->texture); - } - - if (ctx->dirty_shader[PIPE_SHADER_FRAGMENT] & FD_DIRTY_SHADER_TEX) { - u_foreach_bit (i, ctx->tex[PIPE_SHADER_FRAGMENT].valid_textures) - resource_read(batch, ctx->tex[PIPE_SHADER_FRAGMENT].textures[i]->texture); - } - /* Mark streamout buffers as being written.. */ if (ctx->dirty & FD_DIRTY_STREAMOUT) { for (unsigned i = 0; i < ctx->streamout.num_targets; i++) diff --git a/src/gallium/drivers/freedreno/freedreno_program.c b/src/gallium/drivers/freedreno/freedreno_program.c index 86ff826cf1c..0712050fecc 100644 --- a/src/gallium/drivers/freedreno/freedreno_program.c +++ b/src/gallium/drivers/freedreno/freedreno_program.c @@ -32,6 +32,17 @@ #include "freedreno_program.h" #include "freedreno_context.h" +static void +update_bound_stage(struct fd_context *ctx, enum pipe_shader_type shader, bool bound) + assert_dt +{ + if (bound) { + ctx->bound_shader_stages |= BIT(shader); + } else { + ctx->bound_shader_stages &= ~BIT(shader); + } +} + static void fd_vs_state_bind(struct pipe_context *pctx, void *hwcso) in_dt @@ -39,6 +50,7 @@ fd_vs_state_bind(struct pipe_context *pctx, void *hwcso) struct fd_context *ctx = fd_context(pctx); ctx->prog.vs = hwcso; fd_context_dirty_shader(ctx, PIPE_SHADER_VERTEX, FD_DIRTY_SHADER_PROG); + update_bound_stage(ctx, PIPE_SHADER_VERTEX, !!hwcso); } static void @@ -48,6 +60,7 @@ fd_tcs_state_bind(struct pipe_context *pctx, void *hwcso) struct fd_context *ctx = fd_context(pctx); ctx->prog.hs = hwcso; fd_context_dirty_shader(ctx, PIPE_SHADER_TESS_CTRL, FD_DIRTY_SHADER_PROG); + update_bound_stage(ctx, PIPE_SHADER_TESS_CTRL, !!hwcso); } static void @@ -57,6 +70,7 @@ fd_tes_state_bind(struct pipe_context *pctx, void *hwcso) struct fd_context *ctx = fd_context(pctx); ctx->prog.ds = hwcso; fd_context_dirty_shader(ctx, PIPE_SHADER_TESS_EVAL, FD_DIRTY_SHADER_PROG); + update_bound_stage(ctx, PIPE_SHADER_TESS_EVAL, !!hwcso); } static void @@ -66,6 +80,7 @@ fd_gs_state_bind(struct pipe_context *pctx, void *hwcso) struct fd_context *ctx = fd_context(pctx); ctx->prog.gs = hwcso; fd_context_dirty_shader(ctx, PIPE_SHADER_GEOMETRY, FD_DIRTY_SHADER_PROG); + update_bound_stage(ctx, PIPE_SHADER_GEOMETRY, !!hwcso); } static void @@ -75,6 +90,7 @@ fd_fs_state_bind(struct pipe_context *pctx, void *hwcso) struct fd_context *ctx = fd_context(pctx); ctx->prog.fs = hwcso; fd_context_dirty_shader(ctx, PIPE_SHADER_FRAGMENT, FD_DIRTY_SHADER_PROG); + update_bound_stage(ctx, PIPE_SHADER_FRAGMENT, !!hwcso); } static const char *solid_fs =