From fc0f0725a411818a852f4cff4701d44055cd2525 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 7 Aug 2024 21:30:47 -0500 Subject: [PATCH] nvk: Use the EDB buffer view path with NVK_DEBUG=edb_bview Part-of: --- src/nouveau/vulkan/nvk_buffer_view.c | 38 +++++++++++++------ src/nouveau/vulkan/nvk_buffer_view.h | 9 ++++- src/nouveau/vulkan/nvk_debug.h | 3 ++ src/nouveau/vulkan/nvk_descriptor_set.c | 26 ++++++++----- .../vulkan/nvk_descriptor_set_layout.c | 3 +- src/nouveau/vulkan/nvk_device.c | 3 +- src/nouveau/vulkan/nvk_instance.c | 1 + .../vulkan/nvk_nir_lower_descriptors.c | 5 +++ src/nouveau/vulkan/nvk_physical_device.h | 6 +++ src/nouveau/vulkan/nvk_shader.c | 2 + 10 files changed, 71 insertions(+), 25 deletions(-) diff --git a/src/nouveau/vulkan/nvk_buffer_view.c b/src/nouveau/vulkan/nvk_buffer_view.c index b0486980034..04867ec146d 100644 --- a/src/nouveau/vulkan/nvk_buffer_view.c +++ b/src/nouveau/vulkan/nvk_buffer_view.c @@ -50,6 +50,7 @@ nvk_CreateBufferView(VkDevice _device, { VK_FROM_HANDLE(nvk_device, dev, _device); VK_FROM_HANDLE(nvk_buffer, buffer, pCreateInfo->buffer); + struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nvk_buffer_view *view; VkResult result; @@ -58,17 +59,30 @@ nvk_CreateBufferView(VkDevice _device, if (!view) return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); - uint32_t desc[8]; - nil_buffer_fill_tic(&nvk_device_physical(dev)->info, - nvk_buffer_address(buffer, view->vk.offset), - nil_format(vk_format_to_pipe_format(view->vk.format)), - view->vk.elements, &desc); + const uint64_t addr = nvk_buffer_address(buffer, view->vk.offset); + enum pipe_format format = vk_format_to_pipe_format(view->vk.format); - result = nvk_descriptor_table_add(dev, &dev->images, - desc, sizeof(desc), &view->desc_index); - if (result != VK_SUCCESS) { - vk_buffer_view_destroy(&dev->vk, pAllocator, &view->vk); - return result; + if (nvk_use_edb_buffer_views(pdev)) { + view->edb_desc = + nvk_edb_bview_cache_get_descriptor(dev, &dev->edb_bview_cache, + addr, view->vk.range, format); + } else { + uint32_t desc[8]; + nil_buffer_fill_tic(&pdev->info, addr, nil_format(format), + view->vk.elements, &desc); + + uint32_t desc_index; + result = nvk_descriptor_table_add(dev, &dev->images, + desc, sizeof(desc), + &desc_index); + if (result != VK_SUCCESS) { + vk_buffer_view_destroy(&dev->vk, pAllocator, &view->vk); + return result; + } + + view->desc = (struct nvk_buffer_view_descriptor) { + .image_index = desc_index, + }; } *pBufferView = nvk_buffer_view_to_handle(view); @@ -83,11 +97,13 @@ nvk_DestroyBufferView(VkDevice _device, { VK_FROM_HANDLE(nvk_device, dev, _device); VK_FROM_HANDLE(nvk_buffer_view, view, bufferView); + struct nvk_physical_device *pdev = nvk_device_physical(dev); if (!view) return; - nvk_descriptor_table_remove(dev, &dev->images, view->desc_index); + if (!nvk_use_edb_buffer_views(pdev)) + nvk_descriptor_table_remove(dev, &dev->images, view->desc.image_index); vk_buffer_view_destroy(&dev->vk, pAllocator, &view->vk); } diff --git a/src/nouveau/vulkan/nvk_buffer_view.h b/src/nouveau/vulkan/nvk_buffer_view.h index a122bfffbc8..704e1e2630d 100644 --- a/src/nouveau/vulkan/nvk_buffer_view.h +++ b/src/nouveau/vulkan/nvk_buffer_view.h @@ -7,6 +7,8 @@ #include "nvk_private.h" +#include "nvk_descriptor_types.h" + #include "vk_buffer_view.h" struct nvk_physical_device; @@ -18,8 +20,11 @@ nvk_get_buffer_format_features(struct nvk_physical_device *pdev, struct nvk_buffer_view { struct vk_buffer_view vk; - /** Index in the image descriptor table */ - uint32_t desc_index; + /* Selected based on nvk_use_edb_buffer_views() */ + union { + struct nvk_buffer_view_descriptor desc; + struct nvk_edb_buffer_view_descriptor edb_desc; + }; }; VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_buffer_view, vk.base, VkBufferView, diff --git a/src/nouveau/vulkan/nvk_debug.h b/src/nouveau/vulkan/nvk_debug.h index 6d43ec7d40e..c5aa78b6321 100644 --- a/src/nouveau/vulkan/nvk_debug.h +++ b/src/nouveau/vulkan/nvk_debug.h @@ -29,6 +29,9 @@ enum nvk_debug { * Root descriptors still end up in a cbuf */ NVK_DEBUG_NO_CBUF = 1ull << 5, + + /* Use the EXT_descriptor_buffer path for all buffer views */ + NVK_DEBUG_FORCE_EDB_BVIEW = 1ull << 6, }; #endif /* NVK_DEBUG_H */ diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index d1cecd4601a..c4edf91ca92 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -216,18 +216,24 @@ write_dynamic_ssbo_desc(struct nvk_descriptor_set *set, } static void -write_buffer_view_desc(struct nvk_descriptor_set *set, +write_buffer_view_desc(struct nvk_physical_device *pdev, + struct nvk_descriptor_set *set, const VkBufferView bufferView, uint32_t binding, uint32_t elem) { - struct nvk_buffer_view_descriptor desc = { }; - if (bufferView != VK_NULL_HANDLE) { - VK_FROM_HANDLE(nvk_buffer_view, view, bufferView); + VK_FROM_HANDLE(nvk_buffer_view, view, bufferView); - assert(view->desc_index < (1 << 20)); - desc.image_index = view->desc_index; + if (nvk_use_edb_buffer_views(pdev)) { + struct nvk_edb_buffer_view_descriptor desc = { }; + if (view != NULL) + desc = view->edb_desc; + write_desc(set, binding, elem, &desc, sizeof(desc)); + } else { + struct nvk_buffer_view_descriptor desc = { }; + if (view != NULL) + desc = view->desc; + write_desc(set, binding, elem, &desc, sizeof(desc)); } - write_desc(set, binding, elem, &desc, sizeof(desc)); } static void @@ -277,7 +283,7 @@ nvk_UpdateDescriptorSets(VkDevice device, case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_buffer_view_desc(set, write->pTexelBufferView[j], + write_buffer_view_desc(pdev, set, write->pTexelBufferView[j], write->dstBinding, write->dstArrayElement + j); } break; @@ -417,7 +423,7 @@ nvk_push_descriptor_set_update(struct nvk_device *dev, case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t j = 0; j < write->descriptorCount; j++) { - write_buffer_view_desc(&set, write->pTexelBufferView[j], + write_buffer_view_desc(pdev, &set, write->pTexelBufferView[j], write->dstBinding, write->dstArrayElement + j); } break; @@ -799,7 +805,7 @@ nvk_descriptor_set_write_template(struct nvk_device *dev, const VkBufferView *bview = data + entry->offset + j * entry->stride; - write_buffer_view_desc(set, *bview, + write_buffer_view_desc(pdev, set, *bview, entry->binding, entry->array_element + j); } diff --git a/src/nouveau/vulkan/nvk_descriptor_set_layout.c b/src/nouveau/vulkan/nvk_descriptor_set_layout.c index dac528fa8e9..bbb17c02a30 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set_layout.c +++ b/src/nouveau/vulkan/nvk_descriptor_set_layout.c @@ -48,7 +48,8 @@ nvk_descriptor_stride_align_for_type(const struct nvk_physical_device *pdev, case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - if (layout_flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT) { + if ((layout_flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT) || + nvk_use_edb_buffer_views(pdev)) { *stride = *alignment = sizeof(struct nvk_edb_buffer_view_descriptor); } else { *stride = *alignment = sizeof(struct nvk_buffer_view_descriptor); diff --git a/src/nouveau/vulkan/nvk_device.c b/src/nouveau/vulkan/nvk_device.c index ebd98b599b0..20d7edd812f 100644 --- a/src/nouveau/vulkan/nvk_device.c +++ b/src/nouveau/vulkan/nvk_device.c @@ -189,7 +189,8 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice, if (result != VK_SUCCESS) goto fail_images; - if (dev->vk.enabled_features.descriptorBuffer) { + if (dev->vk.enabled_features.descriptorBuffer || + nvk_use_edb_buffer_views(pdev)) { result = nvk_edb_bview_cache_init(dev, &dev->edb_bview_cache); if (result != VK_SUCCESS) goto fail_samplers; diff --git a/src/nouveau/vulkan/nvk_instance.c b/src/nouveau/vulkan/nvk_instance.c index fd578da0060..daa57de9491 100644 --- a/src/nouveau/vulkan/nvk_instance.c +++ b/src/nouveau/vulkan/nvk_instance.c @@ -85,6 +85,7 @@ nvk_init_debug_flags(struct nvk_instance *instance) { "zero_memory", NVK_DEBUG_ZERO_MEMORY }, { "vm", NVK_DEBUG_VM }, { "no_cbuf", NVK_DEBUG_NO_CBUF }, + { "edb_bview", NVK_DEBUG_FORCE_EDB_BVIEW }, { NULL, 0 }, }; diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index 7033408128d..a25df05c858 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -55,6 +55,7 @@ struct lower_descriptors_ctx { const struct nvk_descriptor_set_layout *set_layouts[NVK_MAX_SETS]; bool use_bindless_cbuf; + bool use_edb_buffer_views; bool clamp_desc_array_bounds; nir_address_format ubo_addr_format; nir_address_format ssbo_addr_format; @@ -949,6 +950,9 @@ is_edb_buffer_view(nir_deref_instr *deref, if (glsl_get_sampler_dim(deref->type) != GLSL_SAMPLER_DIM_BUF) return false; + if (ctx->use_edb_buffer_views) + return true; + nir_variable *var = nir_deref_instr_get_variable(deref); uint8_t set = var->data.descriptor_set; @@ -1549,6 +1553,7 @@ nvk_nir_lower_descriptors(nir_shader *nir, struct lower_descriptors_ctx ctx = { .dev_info = &pdev->info, .use_bindless_cbuf = nvk_use_bindless_cbuf(&pdev->info), + .use_edb_buffer_views = nvk_use_edb_buffer_views(pdev), .clamp_desc_array_bounds = rs->storage_buffers != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT || rs->uniform_buffers != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT || diff --git a/src/nouveau/vulkan/nvk_physical_device.h b/src/nouveau/vulkan/nvk_physical_device.h index 363be8f453b..ca7361c3d92 100644 --- a/src/nouveau/vulkan/nvk_physical_device.h +++ b/src/nouveau/vulkan/nvk_physical_device.h @@ -67,6 +67,12 @@ VK_DEFINE_HANDLE_CASTS(nvk_physical_device, VkPhysicalDevice, VK_OBJECT_TYPE_PHYSICAL_DEVICE) +static inline uint32_t +nvk_use_edb_buffer_views(const struct nvk_physical_device *pdev) +{ + return pdev->debug_flags & NVK_DEBUG_FORCE_EDB_BVIEW; +} + static inline struct nvk_instance * nvk_physical_device_instance(struct nvk_physical_device *pdev) { diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 073feec98da..d9c7893b8a6 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -81,6 +81,7 @@ uint64_t nvk_physical_device_compiler_flags(const struct nvk_physical_device *pdev) { bool no_cbufs = pdev->debug_flags & NVK_DEBUG_NO_CBUF; + bool use_edb_buffer_views = nvk_use_edb_buffer_views(pdev); uint64_t prog_debug = nvk_cg_get_prog_debug(); uint64_t prog_optimize = nvk_cg_get_prog_optimize(); uint64_t nak_stages = nvk_nak_stages(&pdev->info); @@ -94,6 +95,7 @@ nvk_physical_device_compiler_flags(const struct nvk_physical_device *pdev) return prog_debug | (prog_optimize << 8) | ((uint64_t)no_cbufs << 12) + | ((uint64_t)use_edb_buffer_views << 13) | (nak_stages << 16) | (nak_flags << 48); }