broadcom/compiler: track if a compute shader uses subgroup functionality
authorIago Toral Quiroga <itoral@igalia.com>
Tue, 22 Jun 2021 10:33:23 +0000 (12:33 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Tue, 29 Jun 2021 06:43:06 +0000 (08:43 +0200)
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11620>

src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/vir.c

index 564d8b9..4a46e9e 100644 (file)
@@ -728,6 +728,9 @@ struct v3d_compile {
         struct qreg cs_shared_offset;
         int local_invocation_index_bits;
 
+        /* If the shader uses subgroup functionality */
+        bool has_subgroups;
+
         uint8_t vattr_sizes[V3D_MAX_VS_INPUTS / 4];
         uint32_t vpm_output_size;
 
@@ -947,6 +950,8 @@ struct v3d_compute_prog_data {
         /* Size in bytes of the workgroup's shared space. */
         uint32_t shared_size;
         uint16_t local_size[3];
+        /* If the shader uses subgroup functionality */
+        bool has_subgroups;
 };
 
 static inline bool
index 1b35ed9..7b77e21 100644 (file)
@@ -808,6 +808,8 @@ v3d_cs_set_prog_data(struct v3d_compile *c,
         prog_data->local_size[0] = c->s->info.workgroup_size[0];
         prog_data->local_size[1] = c->s->info.workgroup_size[1];
         prog_data->local_size[2] = c->s->info.workgroup_size[2];
+
+        prog_data->has_subgroups = c->has_subgroups;
 }
 
 static void
@@ -1384,11 +1386,16 @@ lower_subgroup_intrinsics(struct v3d_compile *c,
                         continue;
 
                 switch (intr->intrinsic) {
-                case nir_intrinsic_load_num_subgroups: {
+                case nir_intrinsic_load_num_subgroups:
                         lower_load_num_subgroups(c, b, intr);
                         progress = true;
+                        FALLTHROUGH;
+                case nir_intrinsic_load_subgroup_id:
+                case nir_intrinsic_load_subgroup_size:
+                case nir_intrinsic_load_subgroup_invocation:
+                case nir_intrinsic_elect:
+                        c->has_subgroups = true;
                         break;
-                }
                 default:
                         break;
                 }