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:
committed by
Marge Bot
parent
677f40383d
commit
fc0f0725a4
@@ -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,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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user