From: Louis-Francis Ratté-Boulianne Date: Fri, 14 Feb 2020 07:14:07 +0000 (-0500) Subject: nir: Always create UBO variable when lowering uniforms to ubo X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4777ee1a62f0620efa2a105215eb589fc44dfa0f;p=mesa.git nir: Always create UBO variable when lowering uniforms to ubo Zink needs to know the sizes of UBOs, and for normal UBOs we get this from the nir_var_mem_ubo variables. This allows us to treat all of these the same way. We're about to need the same information for the in-progress D3D12 driver, so let's do this in a central location instead of in the driver. This version is also a bit more careful than the Zink version. In particular, for two reasons: 1. We increase the variable bindings when we adjust the pre-existing UBOs. 2. We increase shader->info.num_ubos when we insert a new UBO variable. Reviewed-by: Alyssa Rosenzweig Reviewed-by: Eric Anholt Part-of: --- diff --git a/src/compiler/nir/nir_lower_uniforms_to_ubo.c b/src/compiler/nir/nir_lower_uniforms_to_ubo.c index 565410cf0cc..1046fdc6117 100644 --- a/src/compiler/nir/nir_lower_uniforms_to_ubo.c +++ b/src/compiler/nir/nir_lower_uniforms_to_ubo.c @@ -103,8 +103,33 @@ nir_lower_uniforms_to_ubo(nir_shader *shader, int multiplier) } } + if (progress) { + if (!shader->info.first_ubo_is_default_ubo) { + nir_foreach_variable(var, &shader->uniforms) { + if (var->data.mode == nir_var_mem_ubo) + var->data.binding++; + } + } + + if (shader->num_uniforms > 0) { + const struct glsl_type *type = glsl_array_type(glsl_vec4_type(), + shader->num_uniforms, 0); + nir_variable *ubo = nir_variable_create(shader, nir_var_mem_ubo, type, + "uniform_0"); + ubo->data.binding = 0; + + struct glsl_struct_field field = { + .type = type, + .name = "data", + .location = -1, + }; + ubo->interface_type = + glsl_interface_type(&field, 1, GLSL_INTERFACE_PACKING_STD430, + false, "__ubo0_interface"); + shader->info.num_ubos++; + } + } + shader->info.first_ubo_is_default_ubo = true; return progress; } - -