Mesa (main): panfrost: Introduce PAN_MAX_VARYINGS define

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 5 21:42:39 UTC 2021


Module: Mesa
Branch: main
Commit: b88225378d31b6f3d589145f675b3e25d0431b17
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b88225378d31b6f3d589145f675b3e25d0431b17

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Mon Sep 27 16:53:30 2021 -0400

panfrost: Introduce PAN_MAX_VARYINGS define

The number of varying records we need to reserve in the worst case is
greater than the number of source-level varyings we advertise
(gl_Position, gl_PointSize...)

We advertise MAX_VARYINGS source level varyings, which means anywhere we
manipulate varyings we need up to (MAX_VARYINGS + max non-source level
varyings) records. Add a PAN_MAX_VARYINGS define for this and use it
throughout.

Fixes a buffer overflow in Piglit glsl-max-varyings, which now passes
instead of crashes.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13070>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c  |  2 +-
 src/gallium/drivers/panfrost/pan_screen.c     |  4 +++-
 src/panfrost/ci/piglit-panfrost-g52-fails.txt | 11 -----------
 src/panfrost/lib/pan_shader.c                 |  3 ++-
 src/panfrost/util/pan_ir.h                    |  9 +++++++--
 5 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index 9f5ea5074c5..d295aa15a9d 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -2105,7 +2105,7 @@ panfrost_emit_varying_descs(
         unsigned consumer_count = consumer->info.varyings.input_count;
 
         /* Offsets within the general varying buffer, indexed by location */
-        signed offsets[PIPE_MAX_ATTRIBS];
+        signed offsets[PAN_MAX_VARYINGS];
         assert(producer_count <= ARRAY_SIZE(offsets));
         assert(consumer_count <= ARRAY_SIZE(offsets));
 
diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c
index 05ccda9c947..c4c4b22585d 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -279,7 +279,9 @@ panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param)
                 return 4;
 
         case PIPE_CAP_MAX_VARYINGS:
-                return PIPE_MAX_ATTRIBS;
+                /* Return the GLSL maximum. The internal maximum
+                 * PAN_MAX_VARYINGS accommodates internal varyings. */
+                return MAX_VARYING;
 
         /* Removed in v6 (Bifrost) */
         case PIPE_CAP_ALPHA_TEST:
diff --git a/src/panfrost/ci/piglit-panfrost-g52-fails.txt b/src/panfrost/ci/piglit-panfrost-g52-fails.txt
index d9d7ab2b2ae..7f5440e79fc 100644
--- a/src/panfrost/ci/piglit-panfrost-g52-fails.txt
+++ b/src/panfrost/ci/piglit-panfrost-g52-fails.txt
@@ -21,8 +21,6 @@ glx at glx-visuals-stencil -pixmap,Crash
 shaders at glsl-arb-fragment-coord-conventions,Fail
 shaders at glsl-bug-110796,Fail
 shaders at glsl-fs-pointcoord,Fail
-shaders at glsl-max-varyings,Crash
-shaders at glsl-max-varyings >max_varying_components,Crash
 shaders at glsl-uniform-interstage-limits@subdivide 5,Crash
 shaders at glsl-uniform-interstage-limits@subdivide 5- statechanges,Crash
 shaders at glsl-vs-if-bool,Fail
@@ -739,19 +737,15 @@ spec at glsl-1.10@execution at clipping@clip-plane-transformation fixed,Fail
 spec at glsl-1.10@execution at clipping@clip-plane-transformation pos_clipvert,Fail
 spec at glsl-1.10@execution at varying-packing@simple float array,Fail
 spec at glsl-1.10@execution at varying-packing@simple float arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple float separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple int array,Fail
 spec at glsl-1.10@execution at varying-packing@simple int arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple int separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple ivec2 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple ivec2 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple ivec2 separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple ivec3 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple ivec3 arrays_of_arrays,Fail
 spec at glsl-1.10@execution at varying-packing@simple ivec3 separate,Fail
 spec at glsl-1.10@execution at varying-packing@simple ivec4 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple ivec4 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple ivec4 separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple mat2 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple mat2 arrays_of_arrays,Fail
 spec at glsl-1.10@execution at varying-packing@simple mat2 separate,Fail
@@ -781,25 +775,20 @@ spec at glsl-1.10@execution at varying-packing@simple mat4x3 arrays_of_arrays,Fail
 spec at glsl-1.10@execution at varying-packing@simple mat4x3 separate,Fail
 spec at glsl-1.10@execution at varying-packing@simple uint array,Fail
 spec at glsl-1.10@execution at varying-packing@simple uint arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple uint separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple uvec2 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple uvec2 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple uvec2 separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple uvec3 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple uvec3 arrays_of_arrays,Fail
 spec at glsl-1.10@execution at varying-packing@simple uvec3 separate,Fail
 spec at glsl-1.10@execution at varying-packing@simple uvec4 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple uvec4 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple uvec4 separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple vec2 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple vec2 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple vec2 separate,Crash
 spec at glsl-1.10@execution at varying-packing@simple vec3 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple vec3 arrays_of_arrays,Fail
 spec at glsl-1.10@execution at varying-packing@simple vec3 separate,Fail
 spec at glsl-1.10@execution at varying-packing@simple vec4 array,Fail
 spec at glsl-1.10@execution at varying-packing@simple vec4 arrays_of_arrays,Fail
-spec at glsl-1.10@execution at varying-packing@simple vec4 separate,Crash
 spec at glsl-1.30@execution at clipping@clip-plane-transformation pos,Fail
 spec at glsl-1.30@execution at texelfetch@fs-texelfetch-isampler1darray,Fail
 spec at glsl-1.30@execution at texelfetch@fs-texelfetch-sampler1darray,Fail
diff --git a/src/panfrost/lib/pan_shader.c b/src/panfrost/lib/pan_shader.c
index a0243404dc9..6924155fa35 100644
--- a/src/panfrost/lib/pan_shader.c
+++ b/src/panfrost/lib/pan_shader.c
@@ -92,7 +92,7 @@ collect_varyings(nir_shader *s, nir_variable_mode varying_mode,
 {
         *varying_count = 0;
 
-        unsigned comps[MAX_VARYING] = { 0 };
+        unsigned comps[PAN_MAX_VARYINGS] = { 0 };
 
         nir_foreach_variable_with_modes(var, s, varying_mode) {
                 unsigned loc = var->data.driver_location;
@@ -142,6 +142,7 @@ collect_varyings(nir_shader *s, nir_variable_mode varying_mode,
                 assert(format != PIPE_FORMAT_NONE);
 
                 for (int c = 0; c < sz; ++c) {
+                        assert(loc + c < PAN_MAX_VARYINGS);
                         varyings[loc + c].location = var->data.location + c;
                         varyings[loc + c].format = format;
                 }
diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h
index c3f166415c6..8d6bb1f95b3 100644
--- a/src/panfrost/util/pan_ir.h
+++ b/src/panfrost/util/pan_ir.h
@@ -53,6 +53,11 @@ enum pan_special_varying {
         PAN_VARY_MAX,
 };
 
+/* Maximum number of attribute descriptors required for varyings. These include
+ * up to MAX_VARYING source level varyings plus a descriptor each non-GENERAL
+ * special varying */
+#define PAN_MAX_VARYINGS (MAX_VARYING + PAN_VARY_MAX - 1)
+
 /* Define the general compiler entry point */
 
 #define MAX_SYSVAL_COUNT 32
@@ -238,9 +243,9 @@ struct pan_shader_info {
 
         struct {
                 unsigned input_count;
-                struct pan_shader_varying input[MAX_VARYING];
+                struct pan_shader_varying input[PAN_MAX_VARYINGS];
                 unsigned output_count;
-                struct pan_shader_varying output[MAX_VARYING];
+                struct pan_shader_varying output[PAN_MAX_VARYINGS];
         } varyings;
 
         struct panfrost_sysvals sysvals;



More information about the mesa-commit mailing list