nvk: Use the EDB buffer view path with NVK_DEBUG=edb_bview

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30580>
This commit is contained in:
Faith Ekstrand
2024-08-07 21:30:47 -05:00
committed by Marge Bot
parent 677f40383d
commit fc0f0725a4
10 changed files with 71 additions and 25 deletions
+27 -11
View File
@@ -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);
}
+7 -2
View File
@@ -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,
+3
View File
@@ -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 */
+16 -10
View File
@@ -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);
}
@@ -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);
+2 -1
View File
@@ -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;
+1
View File
@@ -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 },
};
@@ -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 ||
+6
View File
@@ -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)
{
+2
View File
@@ -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);
}