Mesa (main): panfrost: Analyze sysval dirty flags
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 1 19:26:48 UTC 2021
Module: Mesa
Branch: main
Commit: 6e61c54d3072ec9fcd0b4045be06a9071f199093
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e61c54d3072ec9fcd0b4045be06a9071f199093
Author: Alyssa Rosenzweig <alyssa at collabora.com>
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 <alyssa at collabora.com>
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,
More information about the mesa-commit
mailing list