From ddd39dbf89b59552fad58b49f002c2de4d3cabd3 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 21 Apr 2023 12:29:00 +0300 Subject: [PATCH] anv: fix anv_nir_lower_ubo_loads pass In order to use load_global_const_block_intel we need to ensure the 64bit address in src[0] is uniform. This is not the case in the vkd3d-proton test_bindless_cbv tests for example. Signed-off-by: Lionel Landwerlin Cc: mesa-stable Reviewed-by: Emma Anholt Part-of: (cherry picked from commit 9fb9ae5ac69293ab60d5d1f7470d8f152ccde7f6) --- .pick_status.json | 2 +- src/intel/vulkan/anv_nir_lower_ubo_loads.c | 2 +- src/intel/vulkan/anv_pipeline.c | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index de7086d3ab4..31db25964f9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1273,7 +1273,7 @@ "description": "anv: fix anv_nir_lower_ubo_loads pass", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/intel/vulkan/anv_nir_lower_ubo_loads.c b/src/intel/vulkan/anv_nir_lower_ubo_loads.c index 5a170352c80..f1609a22c30 100644 --- a/src/intel/vulkan/anv_nir_lower_ubo_loads.c +++ b/src/intel/vulkan/anv_nir_lower_ubo_loads.c @@ -47,7 +47,7 @@ lower_ubo_load_instr(nir_builder *b, nir_instr *instr, UNUSED void *_data) unsigned byte_size = bit_size / 8; nir_ssa_def *val; - if (nir_src_is_const(load->src[1])) { + if (!nir_src_is_divergent(load->src[0]) && nir_src_is_const(load->src[1])) { uint32_t offset = nir_src_as_uint(load->src[1]); /* Things should be component-aligned. */ diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index ca9b15008ba..c72d536194e 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -884,8 +884,16 @@ anv_pipeline_lower_nir(struct anv_pipeline *pipeline, NIR_PASS(_, nir, nir_copy_prop); NIR_PASS(_, nir, nir_opt_constant_folding); + /* Required for nir_divergence_analysis() which is needed for + * anv_nir_lower_ubo_loads. + */ + NIR_PASS(_, nir, nir_convert_to_lcssa, true, true); + nir_divergence_analysis(nir); + NIR_PASS(_, nir, anv_nir_lower_ubo_loads); + NIR_PASS(_, nir, nir_opt_remove_phis); + enum nir_lower_non_uniform_access_type lower_non_uniform_access_types = nir_lower_non_uniform_texture_access | nir_lower_non_uniform_image_access;