nir/print: Extract get_location_str

Locations show up in two places: variables and lowered I/O semantics. We want to
reuse the logic in both places, so extract it out. The extracted logic is IMO
easier to read, too.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21091>
This commit is contained in:
Alyssa Rosenzweig 2023-02-02 19:32:25 -05:00 committed by Marge Bot
parent f857795e83
commit 435e7f5e6d

View file

@ -572,6 +572,49 @@ get_variable_mode_str(nir_variable_mode mode, bool want_local_global_mode)
}
}
static const char *
get_location_str(unsigned location, gl_shader_stage stage,
nir_variable_mode mode, char *buf)
{
switch (stage) {
case MESA_SHADER_VERTEX:
if (mode == nir_var_shader_in)
return gl_vert_attrib_name(location);
else if (mode == nir_var_shader_out)
return gl_varying_slot_name_for_stage(location, stage);
break;
case MESA_SHADER_TASK:
case MESA_SHADER_MESH:
case MESA_SHADER_GEOMETRY:
if (mode == nir_var_shader_in || mode == nir_var_shader_out)
return gl_varying_slot_name_for_stage(location, stage);
break;
case MESA_SHADER_FRAGMENT:
if (mode == nir_var_shader_in)
return gl_varying_slot_name_for_stage(location, stage);
else if (mode == nir_var_shader_out)
return gl_frag_result_name(location);
break;
case MESA_SHADER_TESS_CTRL:
case MESA_SHADER_TESS_EVAL:
case MESA_SHADER_COMPUTE:
case MESA_SHADER_KERNEL:
default:
/* TODO */
break;
}
if (location == ~0) {
return "~0";
} else {
snprintf(buf, 4, "%u", location);
return buf;
}
}
static void
print_var_decl(nir_variable *var, print_state *state)
{
@ -629,51 +672,10 @@ print_var_decl(nir_variable *var, print_state *state)
nir_var_mem_ubo |
nir_var_mem_ssbo |
nir_var_image)) {
const char *loc = NULL;
char buf[4];
switch (state->shader->info.stage) {
case MESA_SHADER_VERTEX:
if (var->data.mode == nir_var_shader_in)
loc = gl_vert_attrib_name(var->data.location);
else if (var->data.mode == nir_var_shader_out)
loc = gl_varying_slot_name_for_stage(var->data.location,
state->shader->info.stage);
break;
case MESA_SHADER_TASK:
case MESA_SHADER_MESH:
case MESA_SHADER_GEOMETRY:
if ((var->data.mode == nir_var_shader_in) ||
(var->data.mode == nir_var_shader_out)) {
loc = gl_varying_slot_name_for_stage(var->data.location,
state->shader->info.stage);
}
break;
case MESA_SHADER_FRAGMENT:
if (var->data.mode == nir_var_shader_in) {
loc = gl_varying_slot_name_for_stage(var->data.location,
state->shader->info.stage);
} else if (var->data.mode == nir_var_shader_out) {
loc = gl_frag_result_name(var->data.location);
}
break;
case MESA_SHADER_TESS_CTRL:
case MESA_SHADER_TESS_EVAL:
case MESA_SHADER_COMPUTE:
case MESA_SHADER_KERNEL:
default:
/* TODO */
break;
}
if (!loc) {
if (var->data.location == ~0) {
loc = "~0";
} else {
snprintf(buf, sizeof(buf), "%u", var->data.location);
loc = buf;
}
}
const char *loc = get_location_str(var->data.location,
state->shader->info.stage,
var->data.mode, buf);
/* For shader I/O vars that have been split to components or packed,
* print the fractional location within the input/output.