diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index c36dead5a4d..8c3a364254d 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1748,19 +1748,10 @@ try_pbo_upload_common(struct gl_context *ctx, if (!fs) return false; - cso_save_state(cso, (CSO_BIT_VERTEX_ELEMENTS | - CSO_BIT_FRAMEBUFFER | - CSO_BIT_VIEWPORT | - CSO_BIT_BLEND | - CSO_BIT_DEPTH_STENCIL_ALPHA | - CSO_BIT_RASTERIZER | - CSO_BIT_STREAM_OUTPUTS | + /* Save only states that have no st_atom. */ + cso_save_state(cso, (CSO_BIT_STREAM_OUTPUTS | (st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) | - CSO_BIT_SAMPLE_MASK | - CSO_BIT_MIN_SAMPLES | - CSO_BIT_RENDER_CONDITION | - CSO_BIT_MESH_SHADER | - CSO_BITS_VERTEX_PIPE_SHADERS)); + CSO_BIT_RENDER_CONDITION)); cso_set_sample_mask(cso, ~0); cso_set_min_samples(cso, 1); @@ -1833,9 +1824,25 @@ fail: cso_restore_state(cso, CSO_UNBIND_FS_SAMPLERVIEWS); st->state.num_sampler_views[MESA_SHADER_FRAGMENT] = 0; - ctx->Array.NewVertexElements = true; - ST_SET_STATE3(ctx->NewDriverState, ST_NEW_VERTEX_ARRAYS, - ST_NEW_FS_CONSTANTS, ST_NEW_FS_SAMPLER_VIEWS); + /* Invalidate all states this meta-op modified. The atoms will + * re-derive them from GL state before the next draw. + */ + st_context_invalidate_state(st, + ST_INVALIDATE_VERTEX_BUFFERS | + ST_INVALIDATE_FB_STATE | + ST_INVALIDATE_VIEWPORT | + ST_INVALIDATE_BLEND | + ST_INVALIDATE_DSA | + ST_INVALIDATE_RASTERIZER | + ST_INVALIDATE_SAMPLE_MASK | + ST_INVALIDATE_SAMPLE_SHADING | + ST_INVALIDATE_FS_CONSTBUF0 | + ST_INVALIDATE_VS_STATE | + ST_INVALIDATE_FS_STATE | + ST_INVALIDATE_GS_STATE | + ST_INVALIDATE_TCS_STATE | + ST_INVALIDATE_TES_STATE | + ST_INVALIDATE_MESH_STATE); return success; } @@ -2009,19 +2016,10 @@ try_pbo_download(struct st_context *st, if (!st_pbo_addresses_pixelstore(st, gl_target, dims == 3, pack, pixels, &addr)) return false; - cso_save_state(cso, (CSO_BIT_VERTEX_ELEMENTS | - CSO_BIT_FRAMEBUFFER | - CSO_BIT_VIEWPORT | - CSO_BIT_BLEND | - CSO_BIT_DEPTH_STENCIL_ALPHA | - CSO_BIT_RASTERIZER | - CSO_BIT_STREAM_OUTPUTS | + /* Save only states that have no st_atom. */ + cso_save_state(cso, (CSO_BIT_STREAM_OUTPUTS | (st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) | - CSO_BIT_SAMPLE_MASK | - CSO_BIT_MIN_SAMPLES | - CSO_BIT_RENDER_CONDITION | - CSO_BIT_MESH_SHADER | - CSO_BITS_VERTEX_PIPE_SHADERS)); + CSO_BIT_RENDER_CONDITION)); cso_set_sample_mask(cso, ~0); cso_set_min_samples(cso, 1); @@ -2114,10 +2112,26 @@ fail: cso_restore_state(cso, CSO_UNBIND_FS_SAMPLERVIEWS | CSO_UNBIND_FS_IMAGE0); st->state.num_sampler_views[MESA_SHADER_FRAGMENT] = 0; - st->ctx->Array.NewVertexElements = true; - ST_SET_STATE4(st->ctx->NewDriverState, ST_NEW_FS_CONSTANTS, - ST_NEW_FS_IMAGES, ST_NEW_FS_SAMPLER_VIEWS, - ST_NEW_VERTEX_ARRAYS); + /* Invalidate all states this meta-op modified. The atoms will + * re-derive them from GL state before the next draw. + */ + st_context_invalidate_state(st, + ST_INVALIDATE_VERTEX_BUFFERS | + ST_INVALIDATE_FB_STATE | + ST_INVALIDATE_VIEWPORT | + ST_INVALIDATE_BLEND | + ST_INVALIDATE_DSA | + ST_INVALIDATE_RASTERIZER | + ST_INVALIDATE_SAMPLE_MASK | + ST_INVALIDATE_SAMPLE_SHADING | + ST_INVALIDATE_FS_CONSTBUF0 | + ST_INVALIDATE_FS_IMAGES | + ST_INVALIDATE_VS_STATE | + ST_INVALIDATE_FS_STATE | + ST_INVALIDATE_GS_STATE | + ST_INVALIDATE_TCS_STATE | + ST_INVALIDATE_TES_STATE | + ST_INVALIDATE_MESH_STATE); return success; }