diff options
author | Brian Ho <[email protected]> | 2020-04-01 11:50:55 -0700 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-04-07 14:13:20 +0000 |
commit | 012773be26aafb71ab232a5838d8e5e7dcc3dc55 (patch) | |
tree | 7779e0d4d8409a094685dabe6897c4e29be7a7aa /src/gallium/drivers/freedreno/ir3/ir3_gallium.c | |
parent | 6eabd6bd51406f729689cce6b3b021c2731c69f9 (diff) |
turnip: Configure VPC for geometry shaders
This commit updates tu6_emit_vpc to selectively emit GS-specifc
configuration. Most of this is repurposed from fd6_program.c.
This also refactors `link_geometry_stages` to ir3_nir_lower_tess.c
so it can be shared between fd and tu.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4436>
Diffstat (limited to 'src/gallium/drivers/freedreno/ir3/ir3_gallium.c')
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_gallium.c | 38 |
1 files changed, 1 insertions, 37 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c index 31dc82b1b6e..56972a81b9d 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c @@ -412,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, @@ -457,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); |