mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 22:49:13 +02:00
nvk: Implement descriptor capture/replay
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30580>
This commit is contained in:
parent
ef9d9b70a6
commit
f7638ff1dc
8 changed files with 155 additions and 17 deletions
|
|
@ -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',
|
||||
|
|
|
|||
15
src/nouveau/vulkan/nvk_acceleration_structure.c
Normal file
15
src/nouveau/vulkan/nvk_acceleration_structure.c
Normal 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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue