d3d12: Retrieve shader image dimensions during shader compiles

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14342>
This commit is contained in:
Jesse Natalie 2021-12-28 16:29:13 -08:00 committed by Marge Bot
parent 5e82a2ff2b
commit def1f0743c
2 changed files with 17 additions and 5 deletions

View file

@ -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

View file

@ -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;