turnip: Configure VPC for geometry shaders
[mesa.git] / src / gallium / drivers / freedreno / ir3 / ir3_gallium.c
index 9ad67d2ec9b07b01eae943ef03f611613b04534a..56972a81b9d55eab1d0e27b966d70148908bf27e 100644 (file)
@@ -144,6 +144,7 @@ ir3_shader_create(struct ir3_compiler *compiler,
                if (nir->info.stage != MESA_SHADER_FRAGMENT)
                        ir3_shader_variant(shader, key, true, debug);
        }
+
        return shader;
 }
 
@@ -170,6 +171,15 @@ ir3_shader_create_compute(struct ir3_compiler *compiler,
 
        struct ir3_shader *shader = ir3_shader_from_nir(compiler, nir);
 
+       if (fd_mesa_debug & FD_DBG_SHADERDB) {
+               /* if shader-db run, create a standard variant immediately
+                * (as otherwise nothing will trigger the shader to be
+                * actually compiled)
+                */
+               static struct ir3_shader_key key; /* static is implicitly zeroed */
+               ir3_shader_variant(shader, key, false, debug);
+       }
+
        return shader;
 }
 
@@ -402,42 +412,6 @@ ir3_emit_immediates(struct fd_screen *screen, const struct ir3_shader_variant *v
        }
 }
 
-static uint32_t
-link_geometry_stages(const struct ir3_shader_variant *producer,
-               const struct ir3_shader_variant *consumer,
-               uint32_t *locs)
-{
-       uint32_t num_loc = 0, factor;
-
-       switch (consumer->type) {
-       case MESA_SHADER_TESS_CTRL:
-       case MESA_SHADER_GEOMETRY:
-               /* These stages load with ldlw, which expects byte offsets. */
-               factor = 4;
-               break;
-       case MESA_SHADER_TESS_EVAL:
-               /* The tess eval shader uses ldg, which takes dword offsets. */
-               factor = 1;
-               break;
-       default:
-               unreachable("bad shader stage");
-       }
-
-       nir_foreach_variable(in_var, &consumer->shader->nir->inputs) {
-               nir_foreach_variable(out_var, &producer->shader->nir->outputs) {
-                       if (in_var->data.location == out_var->data.location) {
-                               locs[in_var->data.driver_location] =
-                                       producer->shader->output_loc[out_var->data.driver_location] * factor;
-
-                               debug_assert(num_loc <= in_var->data.driver_location + 1);
-                               num_loc = in_var->data.driver_location + 1;
-                       }
-               }
-       }
-
-       return num_loc;
-}
-
 void
 ir3_emit_link_map(struct fd_screen *screen,
                const struct ir3_shader_variant *producer,
@@ -447,7 +421,7 @@ ir3_emit_link_map(struct fd_screen *screen,
        uint32_t base = const_state->offsets.primitive_map;
        uint32_t patch_locs[MAX_VARYING] = { }, num_loc;
 
-       num_loc = link_geometry_stages(producer, v, patch_locs);
+       num_loc = ir3_link_geometry_stages(producer, v, patch_locs);
 
        int size = DIV_ROUND_UP(num_loc, 4);