Previously, NIR had a single nir_var_uniform mode used for atomic
counters, UBOs, samplers, images, and normal uniforms. This commit
splits this into nir_var_uniform and nir_var_ubo where nir_var_uniform
is still a bit of a catch-all but the nir_var_ubo is specific to UBOs.
While we're at it, we also rename shader_storage to ssbo to follow the
convention.
We need this so that we can distinguish between normal uniforms and UBO
access at the deref level without going all the way back variable and
seeing if it has an interface type.
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
13 files changed:
nir_variable *var = nir_deref_instr_get_variable(deref);
if (var->data.mode != nir_var_uniform &&
nir_variable *var = nir_deref_instr_get_variable(deref);
if (var->data.mode != nir_var_uniform &&
- var->data.mode != nir_var_shader_storage &&
+ var->data.mode != nir_var_ssbo &&
var->data.mode != nir_var_shared)
return false; /* atomics passed as function arguments can't be lowered */
var->data.mode != nir_var_shared)
return false; /* atomics passed as function arguments can't be lowered */
break;
case ir_var_uniform:
break;
case ir_var_uniform:
- var->data.mode = nir_var_uniform;
+ if (ir->get_interface_type())
+ var->data.mode = nir_var_ubo;
+ else
+ var->data.mode = nir_var_uniform;
break;
case ir_var_shader_storage:
break;
case ir_var_shader_storage:
- var->data.mode = nir_var_shader_storage;
+ var->data.mode = nir_var_ssbo;
break;
case ir_var_system_value:
break;
case ir_var_system_value:
break;
case nir_var_uniform:
break;
case nir_var_uniform:
- case nir_var_shader_storage:
+ case nir_var_ubo:
+ case nir_var_ssbo:
exec_list_push_tail(&shader->uniforms, &var->node);
break;
exec_list_push_tail(&shader->uniforms, &var->node);
break;
nir_var_global = (1 << 2),
nir_var_local = (1 << 3),
nir_var_uniform = (1 << 4),
nir_var_global = (1 << 2),
nir_var_local = (1 << 3),
nir_var_uniform = (1 << 4),
- nir_var_shader_storage = (1 << 5),
+ nir_var_ubo = (1 << 5),
nir_var_system_value = (1 << 6),
nir_var_system_value = (1 << 6),
+ nir_var_ssbo = (1 << 7),
nir_var_shared = (1 << 8),
nir_var_all = ~0,
} nir_variable_mode;
nir_var_shared = (1 << 8),
nir_var_all = ~0,
} nir_variable_mode;
snprintf(name, sizeof(name), "counter%d", var->data.binding);
snprintf(name, sizeof(name), "counter%d", var->data.binding);
- ssbo = nir_variable_create(shader, nir_var_shader_storage,
- type, name);
+ ssbo = nir_variable_create(shader, nir_var_ssbo, type, name);
ssbo->data.binding = var->data.binding;
struct glsl_struct_field field = {
ssbo->data.binding = var->data.binding;
struct glsl_struct_field field = {
* UBOs have their own address spaces, so don't count them towards the
* number of global uniforms
*/
* UBOs have their own address spaces, so don't count them towards the
* number of global uniforms
*/
- if ((var->data.mode == nir_var_uniform || var->data.mode == nir_var_shader_storage) &&
- var->interface_type != NULL)
+ if (var->data.mode == nir_var_ubo || var->data.mode == nir_var_ssbo)
continue;
var->data.driver_location = location;
continue;
var->data.driver_location = location;
written->modes |= nir_var_shader_out |
nir_var_global |
nir_var_local |
written->modes |= nir_var_shader_out |
nir_var_global |
nir_var_local |
- nir_var_shader_storage |
nir_var_shared;
continue;
}
nir_var_shared;
continue;
}
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier:
written->modes |= nir_var_shader_out |
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier:
written->modes |= nir_var_shader_out |
- nir_var_shader_storage |
apply_barrier_for_modes(copies, nir_var_shader_out |
nir_var_global |
nir_var_local |
apply_barrier_for_modes(copies, nir_var_shader_out |
nir_var_global |
nir_var_local |
- nir_var_shader_storage |
nir_var_shared);
continue;
}
nir_var_shared);
continue;
}
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier:
apply_barrier_for_modes(copies, nir_var_shader_out |
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier:
apply_barrier_for_modes(copies, nir_var_shader_out |
- nir_var_shader_storage |
clear_unused_for_modes(&unused_writes, nir_var_shader_out |
nir_var_global |
nir_var_local |
clear_unused_for_modes(&unused_writes, nir_var_shader_out |
nir_var_global |
nir_var_local |
- nir_var_shader_storage |
nir_var_shared);
continue;
}
nir_var_shared);
continue;
}
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier: {
clear_unused_for_modes(&unused_writes, nir_var_shader_out |
case nir_intrinsic_barrier:
case nir_intrinsic_memory_barrier: {
clear_unused_for_modes(&unused_writes, nir_var_shader_out |
- nir_var_shader_storage |
nir_var_shared);
break;
}
nir_var_shared);
break;
}
return "shader_out";
case nir_var_uniform:
return "uniform";
return "shader_out";
case nir_var_uniform:
return "uniform";
- case nir_var_shader_storage:
- return "shader_storage";
+ case nir_var_ubo:
+ return "ubo";
case nir_var_system_value:
return "system";
case nir_var_system_value:
return "system";
+ case nir_var_ssbo:
+ return "ssbo";
case nir_var_shared:
return "shared";
case nir_var_global:
case nir_var_shared:
return "shared";
case nir_var_global:
if (var->data.mode == nir_var_shader_in ||
var->data.mode == nir_var_shader_out ||
var->data.mode == nir_var_uniform ||
if (var->data.mode == nir_var_shader_in ||
var->data.mode == nir_var_shader_out ||
var->data.mode == nir_var_uniform ||
- var->data.mode == nir_var_shader_storage) {
+ var->data.mode == nir_var_ubo ||
+ var->data.mode == nir_var_ssbo) {
const char *loc = NULL;
char buf[4];
const char *loc = NULL;
char buf[4];
- nir_variable *v = create_int(nir_var_shader_storage, "v");
+ nir_variable *v = create_int(nir_var_ssbo, "v");
TEST_F(nir_copy_prop_vars_test, memory_barrier_in_two_blocks)
{
TEST_F(nir_copy_prop_vars_test, memory_barrier_in_two_blocks)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 4);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 4);
nir_store_var(b, v[0], nir_imm_int(b, 1), 1);
nir_store_var(b, v[1], nir_imm_int(b, 2), 1);
nir_store_var(b, v[0], nir_imm_int(b, 1), 1);
nir_store_var(b, v[1], nir_imm_int(b, 2), 1);
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_block)
{
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_block)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 2);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 2);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
TEST_F(nir_dead_write_vars_test, no_dead_writes_different_components_in_block)
{
TEST_F(nir_dead_write_vars_test, no_dead_writes_different_components_in_block)
{
- nir_variable **v = create_many_ivec2(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_ivec2(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
nir_store_var(b, v[0], nir_load_var(b, v[2]), 1 << 1);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
nir_store_var(b, v[0], nir_load_var(b, v[2]), 1 << 1);
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_if_statement)
{
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_if_statement)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 6);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 6);
nir_store_var(b, v[2], nir_load_var(b, v[0]), 1);
nir_store_var(b, v[3], nir_load_var(b, v[1]), 1);
nir_store_var(b, v[2], nir_load_var(b, v[0]), 1);
nir_store_var(b, v[3], nir_load_var(b, v[1]), 1);
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_loop_statement)
{
TEST_F(nir_dead_write_vars_test, no_dead_writes_in_loop_statement)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
TEST_F(nir_dead_write_vars_test, dead_write_in_block)
{
TEST_F(nir_dead_write_vars_test, dead_write_in_block)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
TEST_F(nir_dead_write_vars_test, dead_write_components_in_block)
{
TEST_F(nir_dead_write_vars_test, dead_write_components_in_block)
{
- nir_variable **v = create_many_ivec2(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_ivec2(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
TEST_F(nir_dead_write_vars_test, DISABLED_dead_write_in_two_blocks)
{
TEST_F(nir_dead_write_vars_test, DISABLED_dead_write_in_two_blocks)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
nir_ssa_def *load_v2 = nir_load_var(b, v[2]);
TEST_F(nir_dead_write_vars_test, DISABLED_dead_write_components_in_two_blocks)
{
TEST_F(nir_dead_write_vars_test, DISABLED_dead_write_components_in_two_blocks)
{
- nir_variable **v = create_many_ivec2(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_ivec2(nir_var_ssbo, "v", 3);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1 << 0);
TEST_F(nir_dead_write_vars_test, DISABLED_dead_writes_in_if_statement)
{
TEST_F(nir_dead_write_vars_test, DISABLED_dead_writes_in_if_statement)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 4);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 4);
/* Both branches will overwrite, making the previous store dead. */
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
/* Both branches will overwrite, making the previous store dead. */
nir_store_var(b, v[0], nir_load_var(b, v[1]), 1);
TEST_F(nir_dead_write_vars_test, DISABLED_memory_barrier_in_two_blocks)
{
TEST_F(nir_dead_write_vars_test, DISABLED_memory_barrier_in_two_blocks)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 2);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 2);
nir_store_var(b, v[0], nir_imm_int(b, 1), 1);
nir_store_var(b, v[1], nir_imm_int(b, 2), 1);
nir_store_var(b, v[0], nir_imm_int(b, 1), 1);
nir_store_var(b, v[1], nir_imm_int(b, 2), 1);
TEST_F(nir_dead_write_vars_test, DISABLED_unrelated_barrier_in_two_blocks)
{
TEST_F(nir_dead_write_vars_test, DISABLED_unrelated_barrier_in_two_blocks)
{
- nir_variable **v = create_many_int(nir_var_shader_storage, "v", 3);
+ nir_variable **v = create_many_int(nir_var_ssbo, "v", 3);
nir_variable *out = create_int(nir_var_shader_out, "out");
nir_store_var(b, out, nir_load_var(b, v[1]), 1);
nir_variable *out = create_int(nir_var_shader_out, "out");
nir_store_var(b, out, nir_load_var(b, v[1]), 1);
case SpvStorageClassUniform:
if (interface_type->block) {
mode = vtn_variable_mode_ubo;
case SpvStorageClassUniform:
if (interface_type->block) {
mode = vtn_variable_mode_ubo;
+ nir_mode = nir_var_ubo;
} else if (interface_type->buffer_block) {
mode = vtn_variable_mode_ssbo;
} else if (interface_type->buffer_block) {
mode = vtn_variable_mode_ssbo;
+ nir_mode = nir_var_ssbo;
} else {
/* Default-block uniforms, coming from gl_spirv */
mode = vtn_variable_mode_uniform;
} else {
/* Default-block uniforms, coming from gl_spirv */
mode = vtn_variable_mode_uniform;
break;
case SpvStorageClassStorageBuffer:
mode = vtn_variable_mode_ssbo;
break;
case SpvStorageClassStorageBuffer:
mode = vtn_variable_mode_ssbo;
+ nir_mode = nir_var_ssbo;
break;
case SpvStorageClassUniformConstant:
mode = vtn_variable_mode_uniform;
break;
case SpvStorageClassUniformConstant:
mode = vtn_variable_mode_uniform;
* so we don't need to worry about the ordering.
*/
if (variable->interface_type != NULL) {
* so we don't need to worry about the ordering.
*/
if (variable->interface_type != NULL) {
- if (variable->data.mode == nir_var_uniform) {
+ if (variable->data.mode == nir_var_uniform ||
+ variable->data.mode == nir_var_ubo) {
unsigned block_count;
if (base_type != GLSL_TYPE_INTERFACE) {
unsigned block_count;
if (base_type != GLSL_TYPE_INTERFACE) {
_mesa_set_add(ubo_set, variable->interface_type);
}
_mesa_set_add(ubo_set, variable->interface_type);
}
- if (variable->data.mode == nir_var_shader_storage) {
+ if (variable->data.mode == nir_var_ssbo) {
/* TODO: make this more accurate */
info->shader_buffers_declared =
u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS);
/* TODO: make this more accurate */
info->shader_buffers_declared =
u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS);
* UBO's have their own address spaces, so don't count them towards the
* number of global uniforms
*/
* UBO's have their own address spaces, so don't count them towards the
* number of global uniforms
*/
- if ((uniform->data.mode == nir_var_uniform || uniform->data.mode == nir_var_shader_storage) &&
- uniform->interface_type != NULL)
+ if (uniform->data.mode == nir_var_ubo || uniform->data.mode == nir_var_ssbo)
continue;
const struct glsl_type *type = glsl_without_array(uniform->type);
continue;
const struct glsl_type *type = glsl_without_array(uniform->type);