nvk: Split SSBO and UBO address formats

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29591>
This commit is contained in:
Faith Ekstrand 2024-05-23 11:57:26 -05:00 committed by Marge Bot
parent dc7b08c41a
commit 6387ae7dfb
3 changed files with 45 additions and 20 deletions

View File

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

View File

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

View File

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