panfrost: Analyze sysval dirty flags
authorAlyssa Rosenzweig <alyssa@collabora.com>
Thu, 20 May 2021 17:22:39 +0000 (13:22 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 1 Jun 2021 19:10:28 +0000 (19:10 +0000)
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@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11074>

src/gallium/drivers/panfrost/pan_assemble.c
src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_context.h

index 09f748e..7ff7b34 100644 (file)
@@ -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
index 78e9d2f..aaa84ee 100644 (file)
@@ -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,
index 22491d9..033b479 100644 (file)
@@ -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) */
@@ -391,6 +394,9 @@ panfrost_shader_compile(struct pipe_screen *pscreen,
                         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,
                                 struct pipe_resource *texture);