[Mesa-dev] [PATCH v2 08/13] anv: Add push constant uniforms and lower uniforms

Jordan Justen jordan.l.justen at intel.com
Fri May 27 18:24:33 UTC 2016


This will be important when we start adding a uniform for the CS
thread local invocation index.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 src/intel/vulkan/anv_pipeline.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index d63e50e..8021348 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -78,6 +78,31 @@ void anv_DestroyShaderModule(
    anv_free2(&device->alloc, pAllocator, module);
 }
 
+static void
+anv_nir_lower_uniforms(nir_shader *nir, bool is_scalar)
+{
+   if (is_scalar) {
+      nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms,
+                               type_size_scalar_bytes);
+      nir_lower_io(nir, nir_var_uniform, type_size_scalar_bytes);
+   } else {
+      nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms,
+                               type_size_vec4_bytes);
+      nir_lower_io(nir, nir_var_uniform, type_size_vec4_bytes);
+   }
+}
+
+static void
+add_nir_push_constant_uniforms(nir_shader *shader)
+{
+   for (unsigned i = 0; i < MAX_PUSH_CONSTANTS_SIZE / sizeof(float); i++) {
+      char *name = ralloc_asprintf(shader, "push%02d", i);
+      nir_variable *var =
+         nir_variable_create(shader, nir_var_uniform, glsl_uint_type(), name);
+      var->data.location = i;
+   }
+}
+
 #define SPIR_V_MAGIC_NUMBER 0x07230203
 
 /* Eventually, this will become part of anv_CreateShader.  Unfortunately,
@@ -168,7 +193,8 @@ anv_shader_compile_to_nir(struct anv_device *device,
 
       nir_lower_io_to_temporaries(entry_point->shader, entry_point, true, false);
 
-      nir_lower_system_values(nir);
+      add_nir_push_constant_uniforms(nir);
+
       nir_validate_shader(nir);
    }
 
@@ -177,6 +203,10 @@ anv_shader_compile_to_nir(struct anv_device *device,
 
    nir = brw_preprocess_nir(compiler, nir);
 
+   nir_lower_system_values(nir);
+   const bool is_scalar = compiler->scalar_stage[nir->stage];
+   anv_nir_lower_uniforms(nir, is_scalar);
+
    nir_shader_gather_info(nir, entry_point->impl);
 
    nir_variable_mode indirect_mask = 0;
-- 
2.8.1



More information about the mesa-dev mailing list