diff options
author | Erik Faye-Lund <erik.faye-lund@collabora.com> | 2020-06-02 10:44:13 +0200 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2020-06-10 19:39:17 +0200 |
commit | 9532790a6635880ef42b73944872609f2bc6324c (patch) | |
tree | 7a5f8d2ec6ccda7fce61bdc89d74320d433ce8fb | |
parent | 5fcde355a5e77a82f9fb5ed71ee196a506f968a7 (diff) |
nir: reuse existing psiz-variable
For shaders where there's already a psiz-variable, we should rather
reuse it than create a second one. This can happen if a shader writes
gl_PointSize, but disables GL_PROGRAM_POINT_SIZE.
Fixes: 878c94288a8 ("nir: add lowering-pass for point-size mov")
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5328>
(cherry picked from commit e61a98877ccdaf7ec1f9f890f0f7c1a993ee70a1)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_point_size_mov.c | 26 |
2 files changed, 21 insertions, 7 deletions
diff --git a/.pick_status.json b/.pick_status.json index 65c892f2b74..e7b160761f0 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1417,7 +1417,7 @@ "description": "nir: reuse existing psiz-variable", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "878c94288a8aed3479517660be3e9a88f9b44269" }, diff --git a/src/compiler/nir/nir_lower_point_size_mov.c b/src/compiler/nir/nir_lower_point_size_mov.c index 56cee7746fd..0b9226b60fa 100644 --- a/src/compiler/nir/nir_lower_point_size_mov.c +++ b/src/compiler/nir/nir_lower_point_size_mov.c @@ -33,11 +33,12 @@ static bool lower_impl(nir_function_impl *impl, - const gl_state_index16 *pointsize_state_tokens) + const gl_state_index16 *pointsize_state_tokens, + nir_variable *out) { nir_shader *shader = impl->function->shader; nir_builder b; - nir_variable *in, *out; + nir_variable *in; nir_builder_init(&b, impl); b.cursor = nir_before_cf_list(&impl->body); @@ -50,9 +51,11 @@ lower_impl(nir_function_impl *impl, pointsize_state_tokens, sizeof(in->state_slots[0].tokens)); - out = nir_variable_create(shader, nir_var_shader_out, - glsl_float_type(), "gl_PointSize"); - out->data.location = VARYING_SLOT_PSIZ; + if (!out) { + out = nir_variable_create(shader, nir_var_shader_out, + glsl_float_type(), "gl_PointSize"); + out->data.location = VARYING_SLOT_PSIZ; + } nir_copy_var(&b, out, in); @@ -65,5 +68,16 @@ void nir_lower_point_size_mov(nir_shader *shader, const gl_state_index16 *pointsize_state_tokens) { - lower_impl(nir_shader_get_entrypoint(shader), pointsize_state_tokens); + assert(shader->info.stage == MESA_SHADER_VERTEX); + + nir_variable *out = NULL; + nir_foreach_variable(var, &shader->outputs) { + if (var->data.location == VARYING_SLOT_PSIZ) { + out = var; + break; + } + } + + lower_impl(nir_shader_get_entrypoint(shader), pointsize_state_tokens, + out); } |