nvk: Capture/replay buffer addresses for EDB capture/replay

Fixes: 3f1c3f04be ("nvk: Advertise VK_EXT_descriptor_buffer")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38040>
This commit is contained in:
Faith Ekstrand
2025-10-23 21:41:23 -04:00
committed by Marge Bot
parent a13474939d
commit 998dbd43d3
2 changed files with 29 additions and 4 deletions
+28 -3
View File
@@ -11,6 +11,10 @@
#include "nvk_queue.h"
#include "nvkmd/nvkmd.h"
#define NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS \
(VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT | \
VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT)
static uint32_t
nvk_get_buffer_alignment(const struct nvk_physical_device *pdev,
VkBufferUsageFlags2KHR usage_flags,
@@ -32,7 +36,7 @@ nvk_get_buffer_alignment(const struct nvk_physical_device *pdev,
alignment = MAX2(alignment, NVK_DGC_ALIGN);
if (create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))
NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS))
alignment = MAX2(alignment, pdev->nvkmd->bind_align_B);
return alignment;
@@ -70,6 +74,22 @@ nvk_get_bda_replay_addr(const VkBufferCreateInfo *pCreateInfo)
break;
}
case VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT: {
const VkOpaqueCaptureDescriptorDataCreateInfoEXT *dd = (void *)ext;
if (dd->opaqueCaptureDescriptorData != NULL) {
uint64_t dd_addr = 0;
memcpy(&dd_addr, dd->opaqueCaptureDescriptorData, sizeof(dd_addr));
#ifdef NDEBUG
return dd_addr;
#else
assert(addr == 0 || dd_addr == addr);
addr = dd_addr;
#endif
}
break;
}
default:
break;
}
@@ -98,7 +118,7 @@ nvk_CreateBuffer(VkDevice device,
if (buffer->vk.size > 0 &&
(buffer->vk.create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))) {
NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS))) {
const uint32_t alignment =
nvk_get_buffer_alignment(nvk_device_physical(dev),
buffer->vk.usage,
@@ -111,7 +131,7 @@ nvk_CreateBuffer(VkDevice device,
va_flags |= NVKMD_VA_SPARSE;
uint64_t fixed_addr = 0;
if (buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) {
if (buffer->vk.create_flags & NVK_BUFFER_CREATE_CAPTURE_REPLAY_BITS) {
va_flags |= NVKMD_VA_REPLAY;
fixed_addr = nvk_get_bda_replay_addr(pCreateInfo);
@@ -327,5 +347,10 @@ nvk_GetBufferOpaqueCaptureDescriptorDataEXT(
const VkBufferCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer);
const uint64_t addr = vk_buffer_address(&buffer->vk, 0);
memcpy(pData, &addr, sizeof(addr));
return VK_SUCCESS;
}
+1 -1
View File
@@ -1049,7 +1049,7 @@ nvk_get_device_properties(const struct nvk_instance *instance,
.maxSamplerDescriptorBufferBindings = 32,
.maxEmbeddedImmutableSamplerBindings = 32,
.maxEmbeddedImmutableSamplers = 4000,
.bufferCaptureReplayDescriptorDataSize = 0,
.bufferCaptureReplayDescriptorDataSize = sizeof(uint64_t),
.imageCaptureReplayDescriptorDataSize = 0,
.imageViewCaptureReplayDescriptorDataSize =
sizeof(struct nvk_image_view_capture),