From 6387ae7dfbee59fa3ce2918c2a1c02f5258b47f3 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 23 May 2024 11:57:26 -0500 Subject: [PATCH] nvk: Split SSBO and UBO address formats Part-of: --- .../vulkan/nvk_nir_lower_descriptors.c | 5 ++- src/nouveau/vulkan/nvk_shader.c | 40 ++++++++++++++++--- src/nouveau/vulkan/nvk_shader.h | 20 ++++------ 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index 1072ffd13f5..e1efa804e66 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -1238,6 +1238,7 @@ lower_ssbo_descriptor_instr(nir_builder *b, nir_instr *instr, bool nvk_nir_lower_descriptors(nir_shader *nir, + const struct nvk_physical_device *pdev, const struct vk_pipeline_robustness_state *rs, uint32_t set_layout_count, struct vk_descriptor_set_layout * const *set_layouts, @@ -1248,8 +1249,8 @@ nvk_nir_lower_descriptors(nir_shader *nir, rs->storage_buffers != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT || rs->uniform_buffers != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT || rs->images != VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT, - .ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers), - .ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers), + .ssbo_addr_format = nvk_ssbo_addr_format(pdev, rs->storage_buffers), + .ubo_addr_format = nvk_ubo_addr_format(pdev, rs->uniform_buffers), }; assert(set_layout_count <= NVK_MAX_SETS); diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index cf60f09760e..d6e6f6e9f92 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -112,6 +112,36 @@ nvk_get_nir_options(struct vk_physical_device *vk_pdev, return nvk_cg_nir_options(pdev, stage); } +nir_address_format +nvk_ubo_addr_format(const struct nvk_physical_device *pdev, + VkPipelineRobustnessBufferBehaviorEXT robustness) +{ + switch (robustness) { + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT: + return nir_address_format_64bit_global_32bit_offset; + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT: + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT: + return nir_address_format_64bit_bounded_global; + default: + unreachable("Invalid robust buffer access behavior"); + } +} + +nir_address_format +nvk_ssbo_addr_format(const struct nvk_physical_device *pdev, + VkPipelineRobustnessBufferBehaviorEXT robustness) +{ + switch (robustness) { + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT: + return nir_address_format_64bit_global_32bit_offset; + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT: + case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT: + return nir_address_format_64bit_bounded_global; + default: + unreachable("Invalid robust buffer access behavior"); + } +} + static struct spirv_to_nir_options nvk_get_spirv_options(struct vk_physical_device *vk_pdev, UNUSED gl_shader_stage stage, @@ -121,9 +151,9 @@ nvk_get_spirv_options(struct vk_physical_device *vk_pdev, container_of(vk_pdev, struct nvk_physical_device, vk); return (struct spirv_to_nir_options) { - .ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers), + .ssbo_addr_format = nvk_ssbo_addr_format(pdev, rs->storage_buffers), .phys_ssbo_addr_format = nir_address_format_64bit_global, - .ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers), + .ubo_addr_format = nvk_ubo_addr_format(pdev, rs->uniform_buffers), .shared_addr_format = nir_address_format_32bit_offset, .min_ssbo_alignment = NVK_MIN_SSBO_ALIGNMENT, .min_ubo_alignment = nvk_min_cbuf_alignment(&pdev->info), @@ -412,14 +442,14 @@ nvk_lower_nir(struct nvk_device *dev, nir_shader *nir, }; } - NIR_PASS(_, nir, nvk_nir_lower_descriptors, rs, + NIR_PASS(_, nir, nvk_nir_lower_descriptors, pdev, rs, set_layout_count, set_layouts, cbuf_map); NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_global, nir_address_format_64bit_global); NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ssbo, - nvk_buffer_addr_format(rs->storage_buffers)); + nvk_ssbo_addr_format(pdev, rs->storage_buffers)); NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ubo, - nvk_buffer_addr_format(rs->uniform_buffers)); + nvk_ubo_addr_format(pdev, rs->uniform_buffers)); NIR_PASS(_, nir, nir_shader_intrinsics_pass, lower_load_intrinsic, nir_metadata_none, NULL); diff --git a/src/nouveau/vulkan/nvk_shader.h b/src/nouveau/vulkan/nvk_shader.h index 913df1f9f9c..9be1544bda7 100644 --- a/src/nouveau/vulkan/nvk_shader.h +++ b/src/nouveau/vulkan/nvk_shader.h @@ -101,22 +101,16 @@ VkShaderStageFlags nvk_nak_stages(const struct nv_device_info *info); uint64_t nvk_physical_device_compiler_flags(const struct nvk_physical_device *pdev); -static inline nir_address_format -nvk_buffer_addr_format(VkPipelineRobustnessBufferBehaviorEXT robustness) -{ - switch (robustness) { - case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT: - return nir_address_format_64bit_global_32bit_offset; - case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT: - case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT: - return nir_address_format_64bit_bounded_global; - default: - unreachable("Invalid robust buffer access behavior"); - } -} +nir_address_format +nvk_ubo_addr_format(const struct nvk_physical_device *pdev, + VkPipelineRobustnessBufferBehaviorEXT robustness); +nir_address_format +nvk_ssbo_addr_format(const struct nvk_physical_device *pdev, + VkPipelineRobustnessBufferBehaviorEXT robustness); bool nvk_nir_lower_descriptors(nir_shader *nir, + const struct nvk_physical_device *pdev, const struct vk_pipeline_robustness_state *rs, uint32_t set_layout_count, struct vk_descriptor_set_layout * const *set_layouts,