diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index b3e17b514..de13d5a6c 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1211,6 +1211,10 @@ enum class VulkanChunk : uint32_t vkCmdTraceRaysIndirect2KHR, vkCmdWriteAccelerationStructuresPropertiesKHR, vkCmdBindIndexBuffer2KHR, + vkGetDescriptorEXT, + vkCmdBindDescriptorBuffersEXT, + vkCmdSetDescriptorBufferOffsetsEXT, + vkCmdBindDescriptorBufferEmbeddedSamplersEXT, Max, }; diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 91c1ffe1f..a50d9ee2b 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -4379,6 +4379,16 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) return Serialise_vkCmdCopyMemoryToAccelerationStructureKHR(ser, VK_NULL_HANDLE, NULL); case VulkanChunk::vkCreateAccelerationStructureKHR: return Serialise_vkCreateAccelerationStructureKHR(ser, VK_NULL_HANDLE, NULL, NULL, NULL); + case VulkanChunk::vkGetDescriptorEXT: + return Serialise_vkGetDescriptorEXT(ser, VK_NULL_HANDLE, NULL, 0, NULL); + case VulkanChunk::vkCmdBindDescriptorBuffersEXT: + return Serialise_vkCmdBindDescriptorBuffersEXT(ser, VK_NULL_HANDLE, 0, NULL); + case VulkanChunk::vkCmdSetDescriptorBufferOffsetsEXT: + return Serialise_vkCmdSetDescriptorBufferOffsetsEXT( + ser, VK_NULL_HANDLE, VK_PIPELINE_BIND_POINT_MAX_ENUM, VK_NULL_HANDLE, 0, 0, NULL, NULL); + case VulkanChunk::vkCmdBindDescriptorBufferEmbeddedSamplersEXT: + return Serialise_vkCmdBindDescriptorBufferEmbeddedSamplersEXT( + ser, VK_NULL_HANDLE, VK_PIPELINE_BIND_POINT_MAX_ENUM, VK_NULL_HANDLE, 0); case VulkanChunk::vkCmdBindShadersEXT: return Serialise_vkCmdBindShadersEXT(ser, VK_NULL_HANDLE, 0, NULL, NULL); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index c2efd2351..165b4464d 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -3054,4 +3054,35 @@ public: void vkGetImageSubresourceLayout2EXT(VkDevice device, VkImage image, const VkImageSubresource2 *pSubresource, VkSubresourceLayout2 *pLayout); + + // VK_EXT_descriptor_buffer + void vkGetDescriptorSetLayoutSizeEXT(VkDevice device, VkDescriptorSetLayout layout, + VkDeviceSize *pLayoutSizeInBytes); + void vkGetDescriptorSetLayoutBindingOffsetEXT(VkDevice device, VkDescriptorSetLayout layout, + uint32_t binding, VkDeviceSize *pOffset); + VkResult vkGetBufferOpaqueCaptureDescriptorDataEXT(VkDevice device, + const VkBufferCaptureDescriptorDataInfoEXT *pInfo, + void *pData); + VkResult vkGetImageOpaqueCaptureDescriptorDataEXT(VkDevice device, + const VkImageCaptureDescriptorDataInfoEXT *pInfo, + void *pData); + VkResult vkGetImageViewOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkImageViewCaptureDescriptorDataInfoEXT *pInfo, void *pData); + VkResult vkGetSamplerOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkSamplerCaptureDescriptorDataInfoEXT *pInfo, void *pData); + VkResult vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkAccelerationStructureCaptureDescriptorDataInfoEXT *pInfo, void *pData); + IMPLEMENT_FUNCTION_SERIALISED(void, vkGetDescriptorEXT, VkDevice device, + const VkDescriptorGetInfoEXT *pDescriptorInfo, size_t dataSize, + void *pDescriptor); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindDescriptorBuffersEXT, VkCommandBuffer commandBuffer, + uint32_t bufferCount, + const VkDescriptorBufferBindingInfoEXT *pBindingInfos); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdSetDescriptorBufferOffsetsEXT, + VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, + const uint32_t *pBufferIndices, const VkDeviceSize *pOffsets); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindDescriptorBufferEmbeddedSamplersEXT, + VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t set); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index d55c4be9e..2602f47cb 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -548,7 +548,8 @@ DeclExt(KHR_ray_tracing_maintenance1); \ DeclExt(KHR_maintenance5); \ DeclExt(EXT_image_compression_control); \ - DeclExt(EXT_image_compression_control_swapchain); + DeclExt(EXT_image_compression_control_swapchain); \ + DeclExt(EXT_descriptor_buffer); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -686,7 +687,8 @@ CheckExt(KHR_ray_tracing_maintenance1, VKXX); \ CheckExt(KHR_maintenance5, VKXX); \ CheckExt(EXT_image_compression_control, VKXX); \ - CheckExt(EXT_image_compression_control_swapchain, VKXX); + CheckExt(EXT_image_compression_control_swapchain, VKXX); \ + CheckExt(EXT_descriptor_buffer, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -1058,6 +1060,17 @@ HookInitExtension(KHR_maintenance5, GetImageSubresourceLayout2KHR); \ HookInitExtension(KHR_maintenance5, GetRenderingAreaGranularityKHR); \ HookInitExtension(EXT_image_compression_control, GetImageSubresourceLayout2EXT); \ + HookInitExtension(EXT_descriptor_buffer, CmdBindDescriptorBufferEmbeddedSamplersEXT); \ + HookInitExtension(EXT_descriptor_buffer, CmdBindDescriptorBuffersEXT); \ + HookInitExtension(EXT_descriptor_buffer, CmdSetDescriptorBufferOffsetsEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetBufferOpaqueCaptureDescriptorDataEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetDescriptorEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetDescriptorSetLayoutBindingOffsetEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetDescriptorSetLayoutSizeEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetImageOpaqueCaptureDescriptorDataEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetImageViewOpaqueCaptureDescriptorDataEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetSamplerOpaqueCaptureDescriptorDataEXT); \ + HookInitExtension(EXT_descriptor_buffer, GetAccelerationStructureOpaqueCaptureDescriptorDataEXT); \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ HookInitExtension_Device_Android(); \ @@ -1975,6 +1988,29 @@ const VkRenderingAreaInfo *, pRenderingAreaInfo, VkExtent2D *, pGranularity); \ HookDefine4(void, vkGetImageSubresourceLayout2EXT, VkDevice, device, VkImage, image, \ const VkImageSubresource2 *, pSubresource, VkSubresourceLayout2 *, pLayout); \ + HookDefine3(void, vkGetDescriptorSetLayoutSizeEXT, VkDevice, device, VkDescriptorSetLayout, \ + layout, VkDeviceSize *, pLayoutSizeInBytes); \ + HookDefine4(void, vkGetDescriptorSetLayoutBindingOffsetEXT, VkDevice, device, \ + VkDescriptorSetLayout, layout, uint32_t, binding, VkDeviceSize *, pOffset); \ + HookDefine4(void, vkGetDescriptorEXT, VkDevice, device, const VkDescriptorGetInfoEXT *, \ + pDescriptorInfo, size_t, dataSize, void *, pDescriptor); \ + HookDefine3(void, vkCmdBindDescriptorBuffersEXT, VkCommandBuffer, commandBuffer, uint32_t, \ + bufferCount, const VkDescriptorBufferBindingInfoEXT *, pBindingInfos); \ + HookDefine7(void, vkCmdSetDescriptorBufferOffsetsEXT, VkCommandBuffer, commandBuffer, \ + VkPipelineBindPoint, pipelineBindPoint, VkPipelineLayout, layout, uint32_t, firstSet, \ + uint32_t, setCount, const uint32_t *, pBufferIndices, const VkDeviceSize *, pOffsets); \ + HookDefine4(void, vkCmdBindDescriptorBufferEmbeddedSamplersEXT, VkCommandBuffer, commandBuffer, \ + VkPipelineBindPoint, pipelineBindPoint, VkPipelineLayout, layout, uint32_t, set); \ + HookDefine3(VkResult, vkGetBufferOpaqueCaptureDescriptorDataEXT, VkDevice, device, \ + const VkBufferCaptureDescriptorDataInfoEXT *, pInfo, void *, pData); \ + HookDefine3(VkResult, vkGetImageOpaqueCaptureDescriptorDataEXT, VkDevice, device, \ + const VkImageCaptureDescriptorDataInfoEXT *, pInfo, void *, pData); \ + HookDefine3(VkResult, vkGetImageViewOpaqueCaptureDescriptorDataEXT, VkDevice, device, \ + const VkImageViewCaptureDescriptorDataInfoEXT *, pInfo, void *, pData); \ + HookDefine3(VkResult, vkGetSamplerOpaqueCaptureDescriptorDataEXT, VkDevice, device, \ + const VkSamplerCaptureDescriptorDataInfoEXT *, pInfo, void *, pData); \ + HookDefine3(VkResult, vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT, VkDevice, device, \ + const VkAccelerationStructureCaptureDescriptorDataInfoEXT *, pInfo, void *, pData); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_Android(); \ diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index d319fb336..7fac6f684 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -28,7 +28,7 @@ template <> rdcstr DoStringise(const VulkanChunk &el) { - RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1218, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1222, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -250,6 +250,10 @@ rdcstr DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdTraceRaysIndirect2KHR) STRINGISE_ENUM_CLASS(vkCmdWriteAccelerationStructuresPropertiesKHR) STRINGISE_ENUM_CLASS(vkCmdBindIndexBuffer2KHR) + STRINGISE_ENUM_CLASS(vkGetDescriptorEXT) + STRINGISE_ENUM_CLASS(vkCmdBindDescriptorBuffersEXT) + STRINGISE_ENUM_CLASS(vkCmdSetDescriptorBufferOffsetsEXT) + STRINGISE_ENUM_CLASS(vkCmdBindDescriptorBufferEmbeddedSamplersEXT) STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 7ee38fbd0..1597ac214 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -8667,6 +8667,52 @@ void WrappedVulkan::vkCmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer, VkBu } } +template +bool WrappedVulkan::Serialise_vkCmdBindDescriptorBuffersEXT( + SerialiserType &ser, VkCommandBuffer commandBuffer, uint32_t bufferCount, + const VkDescriptorBufferBindingInfoEXT *pBindingInfos) +{ + return true; +} + +void WrappedVulkan::vkCmdBindDescriptorBuffersEXT(VkCommandBuffer commandBuffer, uint32_t bufferCount, + const VkDescriptorBufferBindingInfoEXT *pBindingInfos) +{ +} + +template +bool WrappedVulkan::Serialise_vkCmdSetDescriptorBufferOffsetsEXT( + SerialiserType &ser, VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const uint32_t *pBufferIndices, + const VkDeviceSize *pOffsets) +{ + return true; +} + +void WrappedVulkan::vkCmdSetDescriptorBufferOffsetsEXT(VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t firstSet, + uint32_t setCount, + const uint32_t *pBufferIndices, + const VkDeviceSize *pOffsets) +{ +} + +template +bool WrappedVulkan::Serialise_vkCmdBindDescriptorBufferEmbeddedSamplersEXT( + SerialiserType &ser, VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t set) +{ + return true; +} + +void WrappedVulkan::vkCmdBindDescriptorBufferEmbeddedSamplersEXT(VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t set) +{ +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateCommandPool, VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *, VkCommandPool *pCommandPool); @@ -8862,3 +8908,14 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindShadersEXT, VkCommandBuffer comma INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType); + +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindDescriptorBuffersEXT, VkCommandBuffer commandBuffer, + uint32_t bufferCount, + const VkDescriptorBufferBindingInfoEXT *pBindingInfos); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetDescriptorBufferOffsetsEXT, + VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, + const uint32_t *pBufferIndices, const VkDeviceSize *pOffsets); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindDescriptorBufferEmbeddedSamplersEXT, + VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t set); diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index 527552713..7060a5de4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -1870,6 +1870,19 @@ void WrappedVulkan::vkUpdateDescriptorSetWithTemplate( } } +template +bool WrappedVulkan::Serialise_vkGetDescriptorEXT(SerialiserType &ser, VkDevice device, + const VkDescriptorGetInfoEXT *pDescriptorInfo, + size_t dataSize, void *pDescriptor) +{ + return true; +} + +void WrappedVulkan::vkGetDescriptorEXT(VkDevice device, const VkDescriptorGetInfoEXT *pDescriptorInfo, + size_t dataSize, void *pDescriptor) +{ +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateDescriptorSetLayout, VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *, VkDescriptorSetLayout *pSetLayout); @@ -1897,3 +1910,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkUpdateDescriptorSetWithTemplate, VkDevic VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void *pData); + +INSTANTIATE_FUNCTION_SERIALISED(void, vkGetDescriptorEXT, VkDevice device, + const VkDescriptorGetInfoEXT *pDescriptorInfo, size_t dataSize, + void *pDescriptor); diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 81f77cd86..650ee766e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -1332,3 +1332,67 @@ void WrappedVulkan::vkGetImageSubresourceLayout2EXT(VkDevice device, VkImage ima ObjDisp(device)->GetImageSubresourceLayout2EXT(Unwrap(device), Unwrap(image), pSubresource, pLayout); } + +void WrappedVulkan::vkGetDescriptorSetLayoutSizeEXT(VkDevice device, VkDescriptorSetLayout layout, + VkDeviceSize *pLayoutSizeInBytes) +{ + ObjDisp(device)->GetDescriptorSetLayoutSizeEXT(Unwrap(device), Unwrap(layout), pLayoutSizeInBytes); +} + +void WrappedVulkan::vkGetDescriptorSetLayoutBindingOffsetEXT(VkDevice device, + VkDescriptorSetLayout layout, + uint32_t binding, VkDeviceSize *pOffset) +{ + ObjDisp(device)->GetDescriptorSetLayoutBindingOffsetEXT(Unwrap(device), Unwrap(layout), binding, + pOffset); +} + +VkResult WrappedVulkan::vkGetBufferOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkBufferCaptureDescriptorDataInfoEXT *pInfo, void *pData) +{ + VkBufferCaptureDescriptorDataInfoEXT unwrappedInfo = *pInfo; + unwrappedInfo.buffer = Unwrap(unwrappedInfo.buffer); + + return ObjDisp(device)->GetBufferOpaqueCaptureDescriptorDataEXT(Unwrap(device), &unwrappedInfo, + pData); +} + +VkResult WrappedVulkan::vkGetImageOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkImageCaptureDescriptorDataInfoEXT *pInfo, void *pData) +{ + VkImageCaptureDescriptorDataInfoEXT unwrappedInfo = *pInfo; + unwrappedInfo.image = Unwrap(unwrappedInfo.image); + + return ObjDisp(device)->GetImageOpaqueCaptureDescriptorDataEXT(Unwrap(device), &unwrappedInfo, + pData); +} + +VkResult WrappedVulkan::vkGetImageViewOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkImageViewCaptureDescriptorDataInfoEXT *pInfo, void *pData) +{ + VkImageViewCaptureDescriptorDataInfoEXT unwrappedInfo = *pInfo; + unwrappedInfo.imageView = Unwrap(unwrappedInfo.imageView); + + return ObjDisp(device)->GetImageViewOpaqueCaptureDescriptorDataEXT(Unwrap(device), &unwrappedInfo, + pData); +} + +VkResult WrappedVulkan::vkGetSamplerOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkSamplerCaptureDescriptorDataInfoEXT *pInfo, void *pData) +{ + VkSamplerCaptureDescriptorDataInfoEXT unwrappedInfo = *pInfo; + unwrappedInfo.sampler = Unwrap(unwrappedInfo.sampler); + + return ObjDisp(device)->GetSamplerOpaqueCaptureDescriptorDataEXT(Unwrap(device), &unwrappedInfo, + pData); +} + +VkResult WrappedVulkan::vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT( + VkDevice device, const VkAccelerationStructureCaptureDescriptorDataInfoEXT *pInfo, void *pData) +{ + VkAccelerationStructureCaptureDescriptorDataInfoEXT unwrappedInfo = *pInfo; + unwrappedInfo.accelerationStructure = Unwrap(unwrappedInfo.accelerationStructure); + + return ObjDisp(device)->GetAccelerationStructureOpaqueCaptureDescriptorDataEXT( + Unwrap(device), &unwrappedInfo, pData); +}