nvk: Implement descriptor capture/replay

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30580>
This commit is contained in:
Faith Ekstrand 2024-08-08 10:09:50 -05:00 committed by Marge Bot
parent ef9d9b70a6
commit f7638ff1dc
8 changed files with 155 additions and 17 deletions

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: MIT
nvk_files = files(
'../../gallium/auxiliary/tgsi/tgsi_from_mesa.c',
'nvk_acceleration_structure.c',
'nvk_buffer.c',
'nvk_buffer.h',
'nvk_buffer_view.c',

View file

@ -0,0 +1,15 @@
/*
* Copyright © 2022 Collabora Ltd. and Red Hat Inc.
* SPDX-License-Identifier: MIT
*/
#include "nvk_entrypoints.h"
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetAccelerationStructureOpaqueCaptureDescriptorDataEXT(
VkDevice device,
const VkAccelerationStructureCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
return VK_SUCCESS;
}

View file

@ -325,3 +325,12 @@ nvk_queue_buffer_bind(struct nvk_queue *queue,
return result;
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetBufferOpaqueCaptureDescriptorDataEXT(
VkDevice device,
const VkBufferCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
return VK_SUCCESS;
}

View file

@ -1713,3 +1713,12 @@ nvk_queue_image_opaque_bind(struct nvk_queue *queue,
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetImageOpaqueCaptureDescriptorDataEXT(
VkDevice _device,
const VkImageCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
return VK_SUCCESS;
}

View file

@ -106,6 +106,13 @@ nvk_image_view_init(struct nvk_device *dev,
VK_FROM_HANDLE(nvk_image, image, pCreateInfo->image);
VkResult result;
const VkOpaqueCaptureDescriptorDataCreateInfoEXT *cap_info =
vk_find_struct_const(pCreateInfo->pNext,
OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT);
struct nvk_image_view_capture cap = {};
if (cap_info != NULL)
memcpy(&cap, cap_info->opaqueCaptureDescriptorData, sizeof(cap));
memset(view, 0, sizeof(*view));
vk_image_view_init(&dev->vk, &view->vk, driver_internal, pCreateInfo);
@ -181,12 +188,21 @@ nvk_image_view_init(struct nvk_device *dev,
nil_image_fill_tic(&nil_image, &pdev->info,
&nil_view, base_addr, &tic);
result = nvk_descriptor_table_add(dev, &dev->images, tic, sizeof(tic),
&view->planes[view_plane].sampled_desc_index);
uint32_t desc_index = 0;
if (cap_info != NULL) {
desc_index = cap.planes[view_plane].sampled_desc_index;
result = nvk_descriptor_table_insert(dev, &dev->images,
desc_index, tic, sizeof(tic));
} else {
result = nvk_descriptor_table_add(dev, &dev->images,
tic, sizeof(tic), &desc_index);
}
if (result != VK_SUCCESS) {
nvk_image_view_finish(dev, view);
return result;
}
view->planes[view_plane].sampled_desc_index = desc_index;
}
if (view->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) {
@ -219,12 +235,21 @@ nvk_image_view_init(struct nvk_device *dev,
nil_image_fill_tic(&nil_image, &pdev->info, &nil_view,
base_addr, &tic);
result = nvk_descriptor_table_add(dev, &dev->images, tic, sizeof(tic),
&view->planes[view_plane].storage_desc_index);
uint32_t desc_index = 0;
if (cap_info != NULL) {
desc_index = cap.planes[view_plane].storage_desc_index;
result = nvk_descriptor_table_insert(dev, &dev->images,
desc_index, tic, sizeof(tic));
} else {
result = nvk_descriptor_table_add(dev, &dev->images,
tic, sizeof(tic), &desc_index);
}
if (result != VK_SUCCESS) {
nvk_image_view_finish(dev, view);
return result;
}
view->planes[view_plane].storage_desc_index = desc_index;
}
}
@ -290,3 +315,23 @@ nvk_DestroyImageView(VkDevice _device,
nvk_image_view_finish(dev, view);
vk_free2(&dev->vk.alloc, pAllocator, view);
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetImageViewOpaqueCaptureDescriptorDataEXT(
VkDevice _device,
const VkImageViewCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
VK_FROM_HANDLE(nvk_image_view, view, pInfo->imageView);
struct nvk_image_view_capture cap = {};
for (uint8_t p = 0; p < view->plane_count; p++) {
cap.planes[p].sampled_desc_index = view->planes[p].sampled_desc_index;
cap.planes[p].storage_desc_index = view->planes[p].storage_desc_index;
}
memcpy(pData, &cap, sizeof(cap));
return VK_SUCCESS;
}

View file

@ -33,6 +33,13 @@ struct nvk_image_view {
VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_image_view, vk.base, VkImageView,
VK_OBJECT_TYPE_IMAGE_VIEW)
struct nvk_image_view_capture {
struct {
uint32_t sampled_desc_index;
uint32_t storage_desc_index;
} planes[3];
};
VkResult nvk_image_view_init(struct nvk_device *dev,
struct nvk_image_view *view,
bool driver_internal,

View file

@ -293,20 +293,38 @@ nvk_CreateSampler(VkDevice device,
struct nvk_sampler *sampler;
VkResult result;
const VkOpaqueCaptureDescriptorDataCreateInfoEXT *cap_info =
vk_find_struct_const(pCreateInfo->pNext,
OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT);
struct nvk_sampler_capture cap = {};
if (cap_info != NULL)
memcpy(&cap, cap_info->opaqueCaptureDescriptorData, sizeof(cap));
sampler = vk_sampler_create(&dev->vk, pCreateInfo,
pAllocator, sizeof(*sampler));
if (!sampler)
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
uint32_t samp[8] = {};
sampler->plane_count = 1;
nvk_sampler_fill_header(pdev, pCreateInfo, &sampler->vk, samp);
result = nvk_descriptor_table_add(dev, &dev->samplers,
samp, sizeof(samp),
&sampler->planes[0].desc_index);
if (result != VK_SUCCESS) {
vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk);
return result;
{
uint32_t samp[8] = {};
sampler->plane_count = 1;
nvk_sampler_fill_header(pdev, pCreateInfo, &sampler->vk, samp);
uint32_t desc_index = 0;
if (cap_info != NULL) {
desc_index = cap.planes[0].desc_index;
result = nvk_descriptor_table_insert(dev, &dev->samplers,
desc_index, samp, sizeof(samp));
} else {
result = nvk_descriptor_table_add(dev, &dev->samplers,
samp, sizeof(samp), &desc_index);
}
if (result != VK_SUCCESS) {
vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk);
return result;
}
sampler->planes[0].desc_index = desc_index;
}
/* In order to support CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT, we
@ -329,18 +347,29 @@ nvk_CreateSampler(VkDevice device,
plane2_info.magFilter = chroma_filter;
plane2_info.minFilter = chroma_filter;
memset(samp, 0, sizeof(samp));
uint32_t samp[8] = {};
sampler->plane_count = 2;
nvk_sampler_fill_header(pdev, &plane2_info, &sampler->vk, samp);
result = nvk_descriptor_table_add(dev, &dev->samplers,
samp, sizeof(samp),
&sampler->planes[1].desc_index);
uint32_t desc_index = 0;
if (cap_info != NULL) {
desc_index = cap.planes[1].desc_index;
result = nvk_descriptor_table_insert(dev, &dev->samplers,
desc_index,
samp, sizeof(samp));
} else {
result = nvk_descriptor_table_add(dev, &dev->samplers,
samp, sizeof(samp),
&desc_index);
}
if (result != VK_SUCCESS) {
nvk_descriptor_table_remove(dev, &dev->samplers,
sampler->planes[0].desc_index);
vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk);
return result;
}
sampler->planes[1].desc_index = desc_index;
}
}
@ -367,3 +396,20 @@ nvk_DestroySampler(VkDevice device,
vk_sampler_destroy(&dev->vk, pAllocator, &sampler->vk);
}
VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetSamplerOpaqueCaptureDescriptorDataEXT(
VkDevice _device,
const VkSamplerCaptureDescriptorDataInfoEXT *pInfo,
void *pData)
{
VK_FROM_HANDLE(nvk_sampler, sampler, pInfo->sampler);
struct nvk_sampler_capture cap = {};
for (uint8_t p = 0; p < sampler->plane_count; p++)
cap.planes[p].desc_index = sampler->planes[p].desc_index;
memcpy(pData, &cap, sizeof(cap));
return VK_SUCCESS;
}

View file

@ -26,6 +26,12 @@ struct nvk_sampler {
VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_sampler, vk.base, VkSampler,
VK_OBJECT_TYPE_SAMPLER)
struct nvk_sampler_capture {
struct {
uint32_t desc_index;
} planes[2];
};
static void
nvk_sampler_fill_header(const struct nvk_physical_device *pdev,
const struct VkSamplerCreateInfo *info,