microsoft/spirv_to_dxil: Add pass to lower dynamic accesses on ubo[1]
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14988>
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include "nir_deref.h"
|
||||
#include "nir_to_dxil.h"
|
||||
#include "util/u_math.h"
|
||||
#include "vulkan/vulkan_core.h"
|
||||
|
||||
static void
|
||||
cl_type_size_align(const struct glsl_type *type, unsigned *size,
|
||||
@@ -1851,3 +1852,60 @@ dxil_reassign_driver_locations(nir_shader* s, nir_variable_mode modes,
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool
|
||||
lower_ubo_array_one_to_static(struct nir_builder *b, nir_instr *inst,
|
||||
void *cb_data)
|
||||
{
|
||||
if (inst->type != nir_instr_type_intrinsic)
|
||||
return false;
|
||||
|
||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(inst);
|
||||
|
||||
if (intrin->intrinsic != nir_intrinsic_load_vulkan_descriptor)
|
||||
return false;
|
||||
|
||||
nir_variable *var =
|
||||
nir_get_binding_variable(b->shader, nir_chase_binding(intrin->src[0]));
|
||||
|
||||
if (!var)
|
||||
return false;
|
||||
|
||||
if (!glsl_type_is_array(var->type) || glsl_array_size(var->type) != 1)
|
||||
return false;
|
||||
|
||||
nir_intrinsic_instr *index = nir_src_as_intrinsic(intrin->src[0]);
|
||||
/* We currently do not support reindex */
|
||||
assert(index && index->intrinsic == nir_intrinsic_vulkan_resource_index);
|
||||
|
||||
if (nir_src_is_const(index->src[0]) && nir_src_as_uint(index->src[0]) == 0)
|
||||
return false;
|
||||
|
||||
if (nir_intrinsic_desc_type(index) != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)
|
||||
return false;
|
||||
|
||||
b->cursor = nir_instr_remove(&index->instr);
|
||||
|
||||
// Indexing out of bounds on array of UBOs is considered undefined
|
||||
// behavior. Therefore, we just hardcode all the index to 0.
|
||||
uint8_t bit_size = index->dest.ssa.bit_size;
|
||||
nir_ssa_def *zero = nir_imm_intN_t(b, 0, bit_size);
|
||||
nir_ssa_def *dest =
|
||||
nir_vulkan_resource_index(b, index->num_components, bit_size, zero,
|
||||
.desc_set = nir_intrinsic_desc_set(index),
|
||||
.binding = nir_intrinsic_binding(index),
|
||||
.desc_type = nir_intrinsic_desc_type(index));
|
||||
|
||||
nir_ssa_def_rewrite_uses(&index->dest.ssa, dest);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
dxil_nir_lower_ubo_array_one_to_static(nir_shader *s)
|
||||
{
|
||||
bool progress = nir_shader_instructions_pass(
|
||||
s, lower_ubo_array_one_to_static, nir_metadata_none, NULL);
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
||||
@@ -70,6 +70,7 @@ dxil_reassign_driver_locations(nir_shader* s, nir_variable_mode modes,
|
||||
|
||||
void dxil_nir_split_tess_ctrl(nir_shader *nir, nir_function **patch_const_func);
|
||||
bool dxil_nir_fixup_tess_level_for_domain(nir_shader *nir);
|
||||
bool dxil_nir_lower_ubo_array_one_to_static(nir_shader *s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -714,6 +714,7 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
|
||||
NIR_PASS_V(nir, dxil_nir_lower_loads_stores_to_dxil);
|
||||
NIR_PASS_V(nir, dxil_nir_split_typed_samplers);
|
||||
NIR_PASS_V(nir, dxil_nir_lower_bool_input);
|
||||
NIR_PASS_V(nir, dxil_nir_lower_ubo_array_one_to_static);
|
||||
NIR_PASS_V(nir, nir_opt_dce);
|
||||
NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_uniform, NULL);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user