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: 878c94288a ("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 e61a98877c)
This commit is contained in:
Erik Faye-Lund 2020-06-02 10:44:13 +02:00 committed by Dylan Baker
parent 45403a5a45
commit 8df640b461
2 changed files with 21 additions and 7 deletions

View file

@ -967,7 +967,7 @@
"description": "nir: reuse existing psiz-variable",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": "878c94288a8aed3479517660be3e9a88f9b44269"
},

View file

@ -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);
}