From 78309017516fb384595c48ee77724eeb09f06ab6 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 31 Jan 2023 16:40:30 -0800 Subject: [PATCH] microsoft/compiler: Pass deref modes to unaligned pass and handle push const Part-of: --- src/microsoft/clc/clc_compiler.c | 4 ++-- src/microsoft/compiler/dxil_nir.c | 7 +++++-- src/microsoft/compiler/dxil_nir.h | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/microsoft/clc/clc_compiler.c b/src/microsoft/clc/clc_compiler.c index 09411aaea32..42fa583b20e 100644 --- a/src/microsoft/clc/clc_compiler.c +++ b/src/microsoft/clc/clc_compiler.c @@ -888,7 +888,7 @@ clc_spirv_to_dxil(struct clc_libclc *lib, NIR_PASS_V(nir, dxil_nir_lower_deref_ssbo); - NIR_PASS_V(nir, dxil_nir_split_unaligned_loads_stores); + NIR_PASS_V(nir, dxil_nir_split_unaligned_loads_stores, nir_var_all); assert(nir->info.cs.ptr_size == 64); NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_ssbo, @@ -948,7 +948,7 @@ clc_spirv_to_dxil(struct clc_libclc *lib, } NIR_PASS_V(nir, clc_nir_lower_kernel_input_loads, inputs_var); - NIR_PASS_V(nir, dxil_nir_split_unaligned_loads_stores); + NIR_PASS_V(nir, dxil_nir_split_unaligned_loads_stores, nir_var_mem_ubo); NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_ubo, nir_address_format_32bit_index_offset); NIR_PASS_V(nir, clc_nir_lower_system_values, work_properties_var); diff --git a/src/microsoft/compiler/dxil_nir.c b/src/microsoft/compiler/dxil_nir.c index dba07253fa0..b6e43724173 100644 --- a/src/microsoft/compiler/dxil_nir.c +++ b/src/microsoft/compiler/dxil_nir.c @@ -2219,7 +2219,7 @@ split_unaligned_store(nir_builder *b, nir_intrinsic_instr *intrin, unsigned alig } bool -dxil_nir_split_unaligned_loads_stores(nir_shader *shader) +dxil_nir_split_unaligned_loads_stores(nir_shader *shader, nir_variable_mode modes) { bool progress = false; @@ -2239,6 +2239,8 @@ dxil_nir_split_unaligned_loads_stores(nir_shader *shader) intrin->intrinsic != nir_intrinsic_store_deref) continue; nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); + if (!nir_deref_mode_may_be(deref, modes)) + continue; unsigned align_mul = 0, align_offset = 0; nir_get_explicit_deref_align(deref, true, &align_mul, &align_offset); @@ -2248,7 +2250,8 @@ dxil_nir_split_unaligned_loads_stores(nir_shader *shader) /* We can load anything at 4-byte alignment, except for * UBOs (AKA CBs where the granularity is 16 bytes). */ - if (alignment >= (deref->modes == nir_var_mem_ubo ? 16 : 4)) + unsigned req_align = (nir_deref_mode_is_one_of(deref, nir_var_mem_ubo | nir_var_mem_push_const) ? 16 : 4); + if (alignment >= req_align) continue; nir_ssa_def *val; diff --git a/src/microsoft/compiler/dxil_nir.h b/src/microsoft/compiler/dxil_nir.h index 27272490b41..65d302a856d 100644 --- a/src/microsoft/compiler/dxil_nir.h +++ b/src/microsoft/compiler/dxil_nir.h @@ -77,7 +77,7 @@ bool dxil_nir_ensure_position_writes(nir_shader *s); bool dxil_nir_lower_sample_pos(nir_shader *s); bool dxil_nir_lower_subgroup_id(nir_shader *s); bool dxil_nir_lower_num_subgroups(nir_shader *s); -bool dxil_nir_split_unaligned_loads_stores(nir_shader *shader); +bool dxil_nir_split_unaligned_loads_stores(nir_shader *shader, nir_variable_mode modes); #ifdef __cplusplus }