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

Fixes: 3f1c3f04be ("nvk: Advertise VK_EXT_descriptor_buffer")
(cherry picked from commit 998dbd43d3)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38167>
This commit is contained in:
Faith Ekstrand 2025-10-23 21:41:23 -04:00 committed by Dylan Baker
parent ba107091c2
commit 7f75931019
3 changed files with 30 additions and 5 deletions

View file

@ -164,7 +164,7 @@
"description": "nvk: Capture/replay buffer addresses for EDB capture/replay",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "3f1c3f04be93a3efaaac794cd48a825907ad07fe",
"notes": null

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;
}

View file

@ -1045,7 +1045,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),