Module: Mesa Branch: main Commit: 6e61c54d3072ec9fcd0b4045be06a9071f199093 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e61c54d3072ec9fcd0b4045be06a9071f199093
Author: Alyssa Rosenzweig <[email protected]> Date: Thu May 20 13:22:39 2021 -0400 panfrost: Analyze sysval dirty flags We want dirty tracking for constant buffer uploads, but which dirty flags are needed depend on what the sysvals are. So for each sysval, record a corresponding dirty flag at compile time, so at draw-time the check is easy. Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11074> --- src/gallium/drivers/panfrost/pan_assemble.c | 2 + src/gallium/drivers/panfrost/pan_cmdstream.c | 55 ++++++++++++++++++++++++++++ src/gallium/drivers/panfrost/pan_context.h | 6 +++ 3 files changed, 63 insertions(+) diff --git a/src/gallium/drivers/panfrost/pan_assemble.c b/src/gallium/drivers/panfrost/pan_assemble.c index 09f748ed632..7ff7b34f63c 100644 --- a/src/gallium/drivers/panfrost/pan_assemble.c +++ b/src/gallium/drivers/panfrost/pan_assemble.c @@ -101,6 +101,8 @@ panfrost_shader_compile(struct pipe_screen *pscreen, &cfg); } + panfrost_analyze_sysvals(state); + util_dynarray_fini(&binary); /* In both clone and tgsi_to_nir paths, the shader is ralloc'd against diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 78e9d2fcb8c..aaa84eea83a 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -1021,6 +1021,61 @@ panfrost_upload_rt_conversion_sysval(struct panfrost_batch *batch, } } +void +panfrost_analyze_sysvals(struct panfrost_shader_state *ss) +{ + unsigned dirty = 0; + unsigned dirty_shader = + PAN_DIRTY_STAGE_RENDERER | PAN_DIRTY_STAGE_CONST; + + for (unsigned i = 0; i < ss->info.sysvals.sysval_count; ++i) { + switch (PAN_SYSVAL_TYPE(ss->info.sysvals.sysvals[i])) { + case PAN_SYSVAL_VIEWPORT_SCALE: + case PAN_SYSVAL_VIEWPORT_OFFSET: + dirty |= PAN_DIRTY_VIEWPORT; + break; + + case PAN_SYSVAL_TEXTURE_SIZE: + dirty_shader |= PAN_DIRTY_STAGE_TEXTURE; + break; + + case PAN_SYSVAL_SSBO: + dirty_shader |= PAN_DIRTY_STAGE_SSBO; + break; + + case PAN_SYSVAL_SAMPLER: + dirty_shader |= PAN_DIRTY_STAGE_SAMPLER; + break; + + case PAN_SYSVAL_IMAGE_SIZE: + dirty_shader |= PAN_DIRTY_STAGE_IMAGE; + break; + + case PAN_SYSVAL_NUM_WORK_GROUPS: + case PAN_SYSVAL_LOCAL_GROUP_SIZE: + case PAN_SYSVAL_WORK_DIM: + case PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS: + dirty |= PAN_DIRTY_PARAMS; + break; + + case PAN_SYSVAL_DRAWID: + dirty |= PAN_DIRTY_DRAWID; + break; + + case PAN_SYSVAL_SAMPLE_POSITIONS: + case PAN_SYSVAL_MULTISAMPLED: + case PAN_SYSVAL_RT_CONVERSION: + /* Nothing beyond the batch itself */ + break; + default: + unreachable("Invalid sysval"); + } + } + + ss->dirty_3d = dirty; + ss->dirty_shader = dirty_shader; +} + static void panfrost_upload_sysvals(struct panfrost_batch *batch, const struct panfrost_ptr *ptr, diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 22491d94121..033b479a869 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -279,6 +279,9 @@ struct panfrost_shader_state { /* Variants */ enum pipe_format rt_formats[8]; unsigned nr_cbufs; + + /* Mask of state that dirties the sysvals */ + unsigned dirty_3d, dirty_shader; }; /* A collection of varyings (the CSO) */ @@ -390,6 +393,9 @@ panfrost_shader_compile(struct pipe_screen *pscreen, gl_shader_stage stage, struct panfrost_shader_state *state); +void +panfrost_analyze_sysvals(struct panfrost_shader_state *ss); + void panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so, struct pipe_context *pctx, _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
