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:

committed by
Marge Bot

parent
b4cfac64c8
commit
7f6d3b82c8
@@ -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);
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user