diff options
author | Marek Olšák <marek.olsak@amd.com> | 2020-09-07 06:23:33 -0400 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-09-08 16:59:23 +0000 |
commit | 5c445be39a15719c63c25d1ad9b7bf9c6a0999d2 (patch) | |
tree | 4d6ff33b573cdfb4d44075340cd3022b2a24a545 | |
parent | 0b6448bbe791474a152d53bfaf750408807ac166 (diff) |
radeonsi: set outputs_written_before_ps for geometry shaders too
it will be used in following commit
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6634>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 9e1f088e16f..7d88c730bf8 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -2476,7 +2476,9 @@ static void si_init_shader_selector_async(void *job, int thread_index) * * This is only done if non-monolithic shaders are enabled. */ - if ((sel->info.stage == MESA_SHADER_VERTEX || sel->info.stage == MESA_SHADER_TESS_EVAL) && + if ((sel->info.stage == MESA_SHADER_VERTEX || + sel->info.stage == MESA_SHADER_TESS_EVAL || + sel->info.stage == MESA_SHADER_GEOMETRY) && !shader->key.as_ls && !shader->key.as_es) { unsigned i; @@ -2640,6 +2642,32 @@ static void *si_create_shader_selector(struct pipe_context *ctx, !sel->info.writes_viewport_index && !sel->info.base.vs.window_space_position && !sel->so.num_outputs; + if (sel->info.stage == MESA_SHADER_VERTEX || + sel->info.stage == MESA_SHADER_TESS_CTRL || + sel->info.stage == MESA_SHADER_TESS_EVAL || + sel->info.stage == MESA_SHADER_GEOMETRY) { + if (sel->info.stage == MESA_SHADER_TESS_CTRL) { + /* Always reserve space for these. */ + sel->patch_outputs_written |= + (1ull << si_shader_io_get_unique_index_patch(VARYING_SLOT_TESS_LEVEL_INNER)) | + (1ull << si_shader_io_get_unique_index_patch(VARYING_SLOT_TESS_LEVEL_OUTER)); + } + for (i = 0; i < sel->info.num_outputs; i++) { + unsigned semantic = sel->info.output_semantic[i]; + + if (semantic == VARYING_SLOT_TESS_LEVEL_INNER || + semantic == VARYING_SLOT_TESS_LEVEL_OUTER || + (semantic >= VARYING_SLOT_PATCH0 && semantic < VARYING_SLOT_TESS_MAX)) { + sel->patch_outputs_written |= 1ull << si_shader_io_get_unique_index_patch(semantic); + } else if (semantic < VARYING_SLOT_MAX && + semantic != VARYING_SLOT_EDGE) { + sel->outputs_written |= 1ull << si_shader_io_get_unique_index(semantic, false); + sel->outputs_written_before_ps |= 1ull + << si_shader_io_get_unique_index(semantic, true); + } + } + } + switch (sel->info.stage) { case MESA_SHADER_GEOMETRY: /* Only possibilities: POINTS, LINE_STRIP, TRIANGLES */ @@ -2663,28 +2691,9 @@ static void *si_create_shader_selector(struct pipe_context *ctx, (sel->info.num_outputs * 4 + 1) > 6500 /* max dw per GS primitive */); break; - case MESA_SHADER_TESS_CTRL: - /* Always reserve space for these. */ - sel->patch_outputs_written |= - (1ull << si_shader_io_get_unique_index_patch(VARYING_SLOT_TESS_LEVEL_INNER)) | - (1ull << si_shader_io_get_unique_index_patch(VARYING_SLOT_TESS_LEVEL_OUTER)); - /* fall through */ case MESA_SHADER_VERTEX: + case MESA_SHADER_TESS_CTRL: case MESA_SHADER_TESS_EVAL: - for (i = 0; i < sel->info.num_outputs; i++) { - unsigned semantic = sel->info.output_semantic[i]; - - if (semantic == VARYING_SLOT_TESS_LEVEL_INNER || - semantic == VARYING_SLOT_TESS_LEVEL_OUTER || - (semantic >= VARYING_SLOT_PATCH0 && semantic < VARYING_SLOT_TESS_MAX)) { - sel->patch_outputs_written |= 1ull << si_shader_io_get_unique_index_patch(semantic); - } else if (semantic < VARYING_SLOT_MAX && - semantic != VARYING_SLOT_EDGE) { - sel->outputs_written |= 1ull << si_shader_io_get_unique_index(semantic, false); - sel->outputs_written_before_ps |= 1ull - << si_shader_io_get_unique_index(semantic, true); - } - } sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16; sel->lshs_vertex_stride = sel->esgs_itemsize; |