ac: Add ac_hw_stage enum.
authorTimur Kristóf <timur.kristof@gmail.com>
Sat, 22 Apr 2023 14:32:14 +0000 (16:32 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 23 Jun 2023 12:49:04 +0000 (12:49 +0000)
This is going to be shared between RADV, RadeonSI and ACO.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23597>

src/amd/common/ac_shader_util.h

index 01f8163..ff144ae 100644 (file)
@@ -141,6 +141,102 @@ enum ac_descriptor_type
    AC_DESC_PLANE_2,
 };
 
+/**
+ * Shader stages as understood by AMD HW.
+ *
+ * Every HW generation has a dedicated stage for compute and PS,
+ * but it varies greatly over other geometry processing stages.
+ *
+ * Valid graphics shader configurations:
+ * (-> = merged with the next stage)
+ *
+ * -------------------------|-----|-----|----|----|----
+ * API shaders:          VS | TCS | TES | GS |copy| FS
+ * Are compiled as:         |     |     |    |    |
+ * GFX6-8 ------------------|-----|-----|----|----|----
+ *          - VS & PS:   VS |     |     |    |    | PS
+ *          - with GS:   ES |     |     | GS | VS | PS
+ *          - with tess: LS | HS  | VS  |    |    | PS
+ *          - with both: LS | HS  | ES  | GS | VS | PS
+ * GFX9-10.3/legacy --------|-----|-----|----|----|----
+ *          - VS & PS:   VS |     |     |    |    | PS
+ *          - with GS:   -> |     |     | GS | VS | PS
+ *          - with tess: -> | HS  | VS  |    |    | PS
+ *          - with both: -> | HS  | ->  | GS | VS | PS
+ * GFX10+/NGG --------------|-----|-----|----|----|----
+ *          - VS & PS:   GS |     |     |    |    | PS
+ *          - with GS:   -> |     |     | GS |    | PS
+ *          - with tess: -> | HS  | GS  |    |    | PS
+ *          - with both: -> | HS  | ->  | GS |    | PS
+ * -------------------------|-----|-----|----|----|----
+ *
+ * Valid mesh shading graphics pipeline configurations:
+ *
+ * -------------------------------|---------------|----
+ * API shaders:                TS |            MS | FS
+ * Are compiled as:               |               |
+ * GFX10.3+/NGG ------------------|---------------|----
+ *        - mesh only:            |            GS | PS
+ *        - task & mesh:       CS |            GS | PS
+ * -------------------------------|---------------|----
+ *
+ */
+enum ac_hw_stage
+{
+   /* GFX6-8 only, merged into HS on GFX9+:
+    *    - vertex shader (when tess is used)
+    */
+   AC_HW_LOCAL_SHADER,
+
+   /* GFX6-8:
+    *    - tess control shader
+    *
+    * GFX9+:
+    * Also known as surface shader.
+    *    - merged vertex and tess control shader
+    */
+   AC_HW_HULL_SHADER,
+
+   /* GFX6-8 only, merged into GS on GFX9+:
+    *    - vertex shader before GS (when tess is not used)
+    *    - tess eval shader before GS (when tess is used)
+    */
+   AC_HW_EXPORT_SHADER,
+
+   /* GFX6-8:
+    *    - geometry shader
+    * GFX9-10/legacy:
+    *    - merged vertex + geometry (when tess is not used)
+    *    - merged tess eval + geometry (when tess is used)
+    */
+   AC_HW_LEGACY_GEOMETRY_SHADER,
+
+   /* GFX6-10/legacy only:
+    *    - vertex shader (when tess and GS are not used)
+    *    - tess eval shader (when GS is not used),
+    *    - "GS copy" shader (always when GS is used)
+    */
+   AC_HW_VERTEX_SHADER,
+
+   /* GFX10+/NGG:
+    * All pre-rasterization stages (after tess). Also known as primitive shader.
+    *    - vertex shader (when tess and GS are not used)
+    *    - tess eval shader (when GS is not used)
+    *    - merged vertex + geometry shader (when GS is used but tess is not)
+    *    - merged tess eval + geometry shader (when both tess and GS are used)
+    *    - mesh shader
+    */
+   AC_HW_NEXT_GEN_GEOMETRY_SHADER,
+
+   /* Fragment shader.
+    * Call it "pixel shader" because that is how HW docs call it.
+    */
+   AC_HW_PIXEL_SHADER,
+
+   /* Compute and compute-like shaders, such as task shader and ray tracing. */
+   AC_HW_COMPUTE_SHADER,
+};
+
 unsigned ac_get_spi_shader_z_format(bool writes_z, bool writes_stencil, bool writes_samplemask,
                                     bool writes_mrt0_alpha);