From def1f0743c557e1f16d960205aa051569179a934 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 28 Dec 2021 16:29:13 -0800 Subject: [PATCH] d3d12: Retrieve shader image dimensions during shader compiles Reviewed-by: Sil Vilerino Part-of: --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 16 ++++++++++++---- src/gallium/drivers/d3d12/d3d12_compiler.h | 6 +++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 9b79f13dfdb..90849551edd 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -191,18 +191,26 @@ compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel, // Non-ubo variables shader->begin_srv_binding = (UINT_MAX); nir_foreach_variable_with_modes(var, nir, nir_var_uniform) { - auto type = glsl_without_array(var->type); - if (glsl_type_is_texture(type)) { + auto type_no_array = glsl_without_array(var->type); + if (glsl_type_is_texture(type_no_array)) { unsigned count = glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1; for (unsigned i = 0; i < count; ++i) { - shader->srv_bindings[var->data.binding + i].binding = var->data.binding; - shader->srv_bindings[var->data.binding + i].dimension = resource_dimension(glsl_get_sampler_dim(type)); + shader->srv_bindings[var->data.binding + i].dimension = resource_dimension(glsl_get_sampler_dim(type_no_array)); } shader->begin_srv_binding = MIN2(var->data.binding, shader->begin_srv_binding); shader->end_srv_binding = MAX2(var->data.binding + count, shader->end_srv_binding); } } + nir_foreach_image_variable(var, nir) { + auto type_no_array = glsl_without_array(var->type); + unsigned count = glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1; + for (unsigned i = 0; i < count; ++i) { + shader->uav_bindings[var->data.driver_location + i].format = var->data.image.format; + shader->uav_bindings[var->data.driver_location + i].dimension = resource_dimension(glsl_get_sampler_dim(type_no_array)); + } + } + // Ubo variables if(nir->info.num_ubos) { // Ignore state_vars ubo as it is bound as root constants diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h b/src/gallium/drivers/d3d12/d3d12_compiler.h index 8625aae7666..4947102ce95 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.h +++ b/src/gallium/drivers/d3d12/d3d12_compiler.h @@ -136,12 +136,16 @@ struct d3d12_shader { bool state_vars_used; struct { - int binding; uint32_t dimension; } srv_bindings[PIPE_MAX_SHADER_SAMPLER_VIEWS]; size_t begin_srv_binding; size_t end_srv_binding; + struct { + enum pipe_format format; + uint32_t dimension; + } uav_bindings[PIPE_MAX_SHADER_IMAGES]; + bool has_default_ubo0; unsigned pstipple_binding;