nvk: Implement bufferDeviceAddressCaptureReplay

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10158
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26242>
This commit is contained in:
Faith Ekstrand
2023-11-16 17:24:42 -06:00
committed by Marge Bot
parent b4cfac64c8
commit 7f6d3b82c8
2 changed files with 59 additions and 7 deletions

View File

@@ -26,12 +26,53 @@ nvk_get_buffer_alignment(UNUSED const struct nv_device_info *info,
VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR))
alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT);
if (create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
if (create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))
alignment = MAX2(alignment, 4096);
return alignment;
}
static uint64_t
nvk_get_bda_replay_addr(const VkBufferCreateInfo *pCreateInfo)
{
uint64_t addr = 0;
vk_foreach_struct_const(ext, pCreateInfo->pNext) {
switch (ext->sType) {
case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
const VkBufferOpaqueCaptureAddressCreateInfo *bda = (void *)ext;
if (bda->opaqueCaptureAddress != 0) {
#ifdef NDEBUG
return bda->opaqueCaptureAddress;
#else
assert(addr == 0 || bda->opaqueCaptureAddress == addr);
addr = bda->opaqueCaptureAddress;
#endif
}
break;
}
case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
const VkBufferDeviceAddressCreateInfoEXT *bda = (void *)ext;
if (bda->deviceAddress != 0) {
#ifdef NDEBUG
return bda->deviceAddress;
#else
assert(addr == 0 || bda->deviceAddress == addr);
addr = bda->deviceAddress;
#endif
}
break;
}
default:
break;
}
}
return addr;
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_CreateBuffer(VkDevice device,
const VkBufferCreateInfo *pCreateInfo,
@@ -50,7 +91,8 @@ nvk_CreateBuffer(VkDevice device,
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
if (buffer->vk.size > 0 &&
(buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
(buffer->vk.create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))) {
const uint32_t alignment =
nvk_get_buffer_alignment(&nvk_device_physical(dev)->info,
buffer->vk.usage,
@@ -60,9 +102,17 @@ nvk_CreateBuffer(VkDevice device,
const bool sparse_residency =
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
const bool bda_capture_replay =
buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
buffer->addr = nouveau_ws_alloc_vma(dev->ws_dev, 0, buffer->vma_size_B,
alignment, false, sparse_residency);
uint64_t bda_replay_addr = 0;
if (bda_capture_replay)
bda_replay_addr = nvk_get_bda_replay_addr(pCreateInfo);
buffer->addr = nouveau_ws_alloc_vma(dev->ws_dev, bda_replay_addr,
buffer->vma_size_B,
alignment, bda_capture_replay,
sparse_residency);
if (buffer->addr == 0) {
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY,
@@ -89,10 +139,12 @@ nvk_DestroyBuffer(VkDevice device,
if (buffer->vma_size_B > 0) {
const bool sparse_residency =
buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
const bool bda_capture_replay =
buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
nouveau_ws_bo_unbind_vma(dev->ws_dev, buffer->addr, buffer->vma_size_B);
nouveau_ws_free_vma(dev->ws_dev, buffer->addr, buffer->vma_size_B,
false, sparse_residency);
bda_capture_replay, sparse_residency);
}
vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);

View File

@@ -237,7 +237,7 @@ nvk_get_device_features(const struct nv_device_info *info,
.hostQueryReset = true,
.timelineSemaphore = true,
.bufferDeviceAddress = true,
.bufferDeviceAddressCaptureReplay = false,
.bufferDeviceAddressCaptureReplay = true,
.bufferDeviceAddressMultiDevice = false,
.shaderOutputViewportIndex = info->cls_eng3d >= MAXWELL_B,
.shaderOutputLayer = info->cls_eng3d >= MAXWELL_B,
@@ -277,7 +277,7 @@ nvk_get_device_features(const struct nv_device_info *info,
.borderColorSwizzleFromImage = false,
/* VK_EXT_buffer_device_address */
.bufferDeviceAddressCaptureReplayEXT = false,
.bufferDeviceAddressCaptureReplayEXT = true,
/* VK_EXT_conditional_rendering */
.conditionalRendering = true,