panfrost: Split out regalloc/preload helpers
authorAlyssa Rosenzweig <alyssa@collabora.com>
Thu, 9 Dec 2021 22:08:13 +0000 (17:08 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 20 Dec 2021 18:21:41 +0000 (18:21 +0000)
The logic gets duplicated if IDVS is in use.

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

src/panfrost/lib/pan_shader.h

index 9c07b8d..dd3aa0c 100644 (file)
@@ -114,7 +114,51 @@ pan_shader_classify_pixel_kill_coverage(const struct pan_shader_info *info,
 
 #undef SET_PIXEL_KILL
 
-#define pan_preloads(reg) (info->preload & BITFIELD64_BIT(reg))
+#if PAN_ARCH >= 7
+static enum mali_shader_register_allocation
+pan_register_allocation(unsigned work_reg_count)
+{
+        return (work_reg_count <= 32) ?
+                MALI_SHADER_REGISTER_ALLOCATION_32_PER_THREAD :
+                MALI_SHADER_REGISTER_ALLOCATION_64_PER_THREAD;
+}
+#endif
+
+#define pan_preloads(reg) (preload & BITFIELD64_BIT(reg))
+
+static void
+pan_make_preload(gl_shader_stage stage,
+                 uint64_t preload,
+                 struct MALI_PRELOAD *out)
+{
+        switch (stage) {
+        case MESA_SHADER_VERTEX:
+                out->vertex.position_result_address_lo = pan_preloads(58);
+                out->vertex.position_result_address_hi = pan_preloads(59);
+                out->vertex.vertex_id = pan_preloads(61);
+                out->vertex.instance_id = pan_preloads(62);
+                break;
+
+        case MESA_SHADER_FRAGMENT:
+                out->fragment.primitive_id = pan_preloads(57);
+                out->fragment.primitive_flags = pan_preloads(58);
+                out->fragment.fragment_position = pan_preloads(59);
+                out->fragment.sample_mask_id = pan_preloads(61);
+                out->fragment.coverage = true;
+                break;
+
+        default:
+                out->compute.local_invocation_xy = pan_preloads(55);
+                out->compute.local_invocation_z = pan_preloads(56);
+                out->compute.work_group_x = pan_preloads(57);
+                out->compute.work_group_y = pan_preloads(58);
+                out->compute.work_group_z = pan_preloads(59);
+                out->compute.global_invocation_x = pan_preloads(60);
+                out->compute.global_invocation_y = pan_preloads(61);
+                out->compute.global_invocation_z = pan_preloads(62);
+                break;
+        }
+}
 
 static inline void
 pan_shader_prepare_bifrost_rsd(const struct pan_shader_info *info,
@@ -125,27 +169,14 @@ pan_shader_prepare_bifrost_rsd(const struct pan_shader_info *info,
 
 #if PAN_ARCH >= 7
         rsd->properties.shader_register_allocation =
-                (info->work_reg_count <= 32) ?
-                MALI_SHADER_REGISTER_ALLOCATION_32_PER_THREAD :
-                MALI_SHADER_REGISTER_ALLOCATION_64_PER_THREAD;
+                pan_register_allocation(info->work_reg_count);
 #endif
 
-        switch (info->stage) {
-        case MESA_SHADER_VERTEX:
-                rsd->preload.vertex.position_result_address_lo = pan_preloads(58);
-                rsd->preload.vertex.position_result_address_hi = pan_preloads(59);
-                rsd->preload.vertex.vertex_id = pan_preloads(61);
-                rsd->preload.vertex.instance_id = pan_preloads(62);
-                break;
+        pan_make_preload(info->stage, info->preload, &rsd->preload);
 
-        case MESA_SHADER_FRAGMENT:
+        if (info->stage == MESA_SHADER_FRAGMENT) {
                 pan_shader_classify_pixel_kill_coverage(info, rsd);
 
-#if PAN_ARCH >= 7
-                rsd->properties.shader_wait_dependency_6 = info->bifrost.wait_6;
-                rsd->properties.shader_wait_dependency_7 = info->bifrost.wait_7;
-#endif
-
                 /* Match the mesa/st convention. If this needs to be flipped,
                  * nir_lower_pntc_ytransform will do so. */
                 rsd->properties.point_sprite_coord_origin_max_y = true;
@@ -153,32 +184,13 @@ pan_shader_prepare_bifrost_rsd(const struct pan_shader_info *info,
                 rsd->properties.allow_forward_pixel_to_be_killed =
                         !info->fs.sidefx;
 
-                rsd->preload.fragment.primitive_id = pan_preloads(57);
-                rsd->preload.fragment.primitive_flags = pan_preloads(58);
-                rsd->preload.fragment.fragment_position = pan_preloads(59);
-                rsd->preload.fragment.sample_mask_id = pan_preloads(61);
-
-                rsd->preload.fragment.coverage = true;
-
 #if PAN_ARCH >= 7
+                rsd->properties.shader_wait_dependency_6 = info->bifrost.wait_6;
+                rsd->properties.shader_wait_dependency_7 = info->bifrost.wait_7;
+
                 rsd->message_preload_1 = info->bifrost.messages[0];
                 rsd->message_preload_2 = info->bifrost.messages[1];
 #endif
-                break;
-
-        case MESA_SHADER_COMPUTE:
-                rsd->preload.compute.local_invocation_xy = pan_preloads(55);
-                rsd->preload.compute.local_invocation_z = pan_preloads(56);
-                rsd->preload.compute.work_group_x = pan_preloads(57);
-                rsd->preload.compute.work_group_y = pan_preloads(58);
-                rsd->preload.compute.work_group_z = pan_preloads(59);
-                rsd->preload.compute.global_invocation_x = pan_preloads(60);
-                rsd->preload.compute.global_invocation_y = pan_preloads(61);
-                rsd->preload.compute.global_invocation_z = pan_preloads(62);
-                break;
-
-        default:
-                unreachable("TODO");
         }
 }