radeonsi/nir: gather tess properties
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 6 Dec 2017 05:02:34 +0000 (16:02 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 5 Jan 2018 00:58:55 +0000 (11:58 +1100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader_nir.c

index 4138e04dcb567d79a9d2b21517c2e7925104e6ef..2757d4e4117d59142547f6dad6d6f6f35043cce4 100644 (file)
@@ -83,6 +83,9 @@ static void scan_instruction(struct tgsi_shader_info *info,
                case nir_intrinsic_load_instance_id:
                        info->uses_instanceid = 1;
                        break;
+               case nir_intrinsic_load_invocation_id:
+                       info->uses_invocationid = true;
+                       break;
                case nir_intrinsic_load_vertex_id:
                        info->uses_vertexid = 1;
                        break;
@@ -95,6 +98,10 @@ static void scan_instruction(struct tgsi_shader_info *info,
                case nir_intrinsic_load_primitive_id:
                        info->uses_primid = 1;
                        break;
+               case nir_intrinsic_load_tess_level_inner:
+               case nir_intrinsic_load_tess_level_outer:
+                       info->reads_tess_factors = true;
+                       break;
                case nir_intrinsic_image_store:
                case nir_intrinsic_image_atomic_add:
                case nir_intrinsic_image_atomic_min:
@@ -137,6 +144,28 @@ void si_nir_scan_shader(const struct nir_shader *nir,
        info->num_tokens = 2; /* indicate that the shader is non-empty */
        info->num_instructions = 2;
 
+       if (nir->info.stage == MESA_SHADER_TESS_CTRL) {
+               info->properties[TGSI_PROPERTY_TCS_VERTICES_OUT] =
+                       nir->info.tess.tcs_vertices_out;
+       }
+
+       if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
+               if (nir->info.tess.primitive_mode == GL_ISOLINES)
+                       info->properties[TGSI_PROPERTY_TES_PRIM_MODE] = PIPE_PRIM_LINES;
+               else
+                       info->properties[TGSI_PROPERTY_TES_PRIM_MODE] = nir->info.tess.primitive_mode;
+
+               STATIC_ASSERT((TESS_SPACING_EQUAL + 1) % 3 == PIPE_TESS_SPACING_EQUAL);
+               STATIC_ASSERT((TESS_SPACING_FRACTIONAL_ODD + 1) % 3 ==
+                             PIPE_TESS_SPACING_FRACTIONAL_ODD);
+               STATIC_ASSERT((TESS_SPACING_FRACTIONAL_EVEN + 1) % 3 ==
+                             PIPE_TESS_SPACING_FRACTIONAL_EVEN);
+
+               info->properties[TGSI_PROPERTY_TES_SPACING] = (nir->info.tess.spacing + 1) % 3;
+               info->properties[TGSI_PROPERTY_TES_VERTEX_ORDER_CW] = !nir->info.tess.ccw;
+               info->properties[TGSI_PROPERTY_TES_POINT_MODE] = nir->info.tess.point_mode;
+       }
+
        if (nir->info.stage == MESA_SHADER_GEOMETRY) {
                info->properties[TGSI_PROPERTY_GS_INPUT_PRIM] = nir->info.gs.input_primitive;
                info->properties[TGSI_PROPERTY_GS_OUTPUT_PRIM] = nir->info.gs.output_primitive;