From b56f1e7cf04a75822246abf9bf4970b003c6a1de Mon Sep 17 00:00:00 2001 From: qbojj <105227351+qbojj@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:03:05 +0100 Subject: [PATCH] add VK_KHR_maintenance5 support --- .../VulkanPipelineStateViewer.cpp | 4 +- renderdoc/api/replay/pipestate.inl | 2 +- renderdoc/api/replay/vk_pipestate.h | 5 +- renderdoc/driver/vulkan/extension_support.md | 2 +- renderdoc/driver/vulkan/vk_common.cpp | 4 +- renderdoc/driver/vulkan/vk_common.h | 40 ++++ renderdoc/driver/vulkan/vk_core.cpp | 90 +++++++++ renderdoc/driver/vulkan/vk_core.h | 25 +++ renderdoc/driver/vulkan/vk_dispatchtables.cpp | 4 +- renderdoc/driver/vulkan/vk_dispatchtables.h | 13 +- renderdoc/driver/vulkan/vk_hookset_defs.h | 18 +- renderdoc/driver/vulkan/vk_info.cpp | 7 +- renderdoc/driver/vulkan/vk_info.h | 4 +- renderdoc/driver/vulkan/vk_layer.cpp | 30 +-- renderdoc/driver/vulkan/vk_next_chains.cpp | 84 +++++++- renderdoc/driver/vulkan/vk_overlay.cpp | 16 +- renderdoc/driver/vulkan/vk_postvs.cpp | 9 +- renderdoc/driver/vulkan/vk_replay.cpp | 1 + renderdoc/driver/vulkan/vk_serialise.cpp | 184 +++++++++++++++++- renderdoc/driver/vulkan/vk_shader_cache.cpp | 46 ++++- .../driver/vulkan/vk_shader_feedback.cpp | 2 +- renderdoc/driver/vulkan/vk_state.cpp | 15 +- renderdoc/driver/vulkan/vk_state.h | 1 + renderdoc/driver/vulkan/vk_stringise.cpp | 77 +++++++- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 93 +++++++++ .../driver/vulkan/wrappers/vk_get_funcs.cpp | 31 ++- .../vulkan/wrappers/vk_resource_funcs.cpp | 56 +++--- .../vulkan/wrappers/vk_shader_funcs.cpp | 43 ++-- renderdoc/replay/renderdoc_serialise.inl | 7 +- 29 files changed, 803 insertions(+), 110 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 9d20ca834a..f19b1cbea3 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -1910,7 +1910,7 @@ void VulkanPipelineStateViewer::setState() BufferDescription *buf = m_Ctx.GetBuffer(state.inputAssembly.indexBuffer.resourceId); if(buf) - length = buf->length; + length = qMin(buf->length, state.inputAssembly.indexBuffer.byteSize); RDTreeWidgetItem *node = new RDTreeWidgetItem( {tr("Index"), state.inputAssembly.indexBuffer.resourceId, tr("Index"), lit("-"), @@ -3461,7 +3461,7 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe:: if(ib) { name = m_Ctx.GetResourceName(ia.indexBuffer.resourceId); - length = ib->length; + length = qMin(ib->length, ia.indexBuffer.byteSize); } QString ifmt = lit("UNKNOWN"); diff --git a/renderdoc/api/replay/pipestate.inl b/renderdoc/api/replay/pipestate.inl index 51a93a97fd..8faf74f949 100644 --- a/renderdoc/api/replay/pipestate.inl +++ b/renderdoc/api/replay/pipestate.inl @@ -515,7 +515,7 @@ BoundVBuffer PipeState::GetIBuffer() const ret.resourceId = m_Vulkan->inputAssembly.indexBuffer.resourceId; ret.byteOffset = m_Vulkan->inputAssembly.indexBuffer.byteOffset; ret.byteStride = m_Vulkan->inputAssembly.indexBuffer.byteStride; - ret.byteSize = ~0ULL; + ret.byteSize = m_Vulkan->inputAssembly.indexBuffer.byteSize; } } diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index a3d58df5c1..9740b18bfd 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -126,7 +126,7 @@ When not using pipeline libraries, this will be identical to :data:`pipelinePreR )"); ResourceId pipelineFragmentLayoutResourceId; DOCUMENT("The flags used to create the pipeline object."); - uint32_t flags = 0; + uint64_t flags = 0; DOCUMENT(R"(The bound descriptor sets. @@ -149,6 +149,9 @@ struct IndexBuffer DOCUMENT("The byte offset from the start of the buffer to the beginning of the index data."); uint64_t byteOffset = 0; + DOCUMENT("The number of bytes in the index buffer."); + uint64_t byteSize = 0; + DOCUMENT(R"(The number of bytes for each index in the index buffer. Typically 2 or 4 bytes but it can be 0 if no index buffer is bound. )"); diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 4d71649a5b..45749ca70a 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -174,6 +174,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_KHR_maintenance2` * `VK_KHR_maintenance3` * `VK_KHR_maintenance4` +* `VK_KHR_maintenance5` * `VK_KHR_multiview` * `VK_KHR_performance_query` * `VK_KHR_pipeline_executable_properties` @@ -242,7 +243,6 @@ KHR extensions will definitely be implemented at some point, though KHR extensio * `VK_KHR_cooperative_matrix` * `VK_KHR_dynamic_rendering_local_read` -* `VK_KHR_maintenance5` * `VK_KHR_maintenance6` * `VK_KHR_map_memory2` * `VK_KHR_shader_expect_assume` diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index e7f4a2edba..6ca59949fa 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -248,7 +248,7 @@ void GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, VkDeviceSize size, u else allocInfo.memoryTypeIndex = driver->GetUploadMemoryIndex(mrq.memoryTypeBits); - bool useBufferAddressKHR = driver->GetExtensions(NULL).ext_KHR_buffer_device_address; + bool useBufferAddressKHR = driver->GetExtensions(NULL).ext_KHR_buffer_device_address != 0; VkMemoryAllocateFlagsInfo memFlags = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO}; if(useBufferAddressKHR && (flags & eGPUBufferAddressable)) @@ -931,7 +931,7 @@ rdcstr HumanDriverName(VkDriverId driverId) return ""; } -BASIC_TYPE_SERIALISE_STRINGIFY(VkPackedVersion, (uint32_t &)el, SDBasic::UnsignedInteger, 4); +BASIC_TYPE_SERIALISE_STRINGIFY(VkPackedVersion, el.version, SDBasic::UnsignedInteger, 4); INSTANTIATE_SERIALISE_TYPE(VkPackedVersion); diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index b135b58705..ca0014dbbd 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -73,6 +73,8 @@ #define VkAccessFlagBits2 VkAccessFlagBits2_VkFlags64_typedef #define VkPipelineStageFlagBits2 VkPipelineStageFlagBits2_VkFlags64_typedef #define VkFormatFeatureFlagBits2 VkFormatFeatureFlagBits2_VkFlags64_typedef +#define VkBufferUsageFlagBits2KHR VkBufferUsageFlagBits2KHR_VkFlags64_typedef +#define VkPipelineCreateFlagBits2KHR VkPipelineCreateFlagBits2KHR_VkFlags64_typedef #include "core/core.h" #include "core/resource_manager.h" @@ -84,6 +86,8 @@ #undef VkAccessFlagBits2 #undef VkPipelineStageFlagBits2 #undef VkFormatFeatureFlagBits2 +#undef VkBufferUsageFlagBits2KHR +#undef VkPipelineCreateFlagBits2KHR #undef Bool #undef None @@ -129,6 +133,14 @@ int SampleIndex(VkSampleCountFlagBits countFlag); int StageIndex(VkShaderStageFlagBits stageFlag); VkShaderStageFlags ShaderMaskFromIndex(size_t index); +// VK_KHR_maintenance5 helpers +VkPipelineCreateFlags2KHR GetPipelineCreateFlags(const VkGraphicsPipelineCreateInfo *info); +VkPipelineCreateFlags2KHR GetPipelineCreateFlags(const VkComputePipelineCreateInfo *info); +VkBufferUsageFlags2KHR GetBufferUsageFlags(const VkBufferCreateInfo *info); +void SetPipelineCreateFlags(VkGraphicsPipelineCreateInfo *info, VkPipelineCreateFlags2KHR flags); +void SetPipelineCreateFlags(VkComputePipelineCreateInfo *info, VkPipelineCreateFlags2KHR flags); +void SetBufferUsageFlags(VkBufferCreateInfo *info, VkBufferUsageFlags2KHR flags); + struct PackedWindowHandle { PackedWindowHandle(WindowingSystem s, void *h) : system(s), handle(h) {} @@ -1087,6 +1099,7 @@ enum class VulkanChunk : uint32_t vkCmdTraceRaysIndirectKHR, vkCmdTraceRaysKHR, vkCreateRayTracingPipelinesKHR, + vkCmdBindIndexBuffer2KHR, Max, }; @@ -1581,6 +1594,14 @@ DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDescription2EXT); DECLARE_REFLECTION_STRUCT(VkWriteDescriptorSet); DECLARE_REFLECTION_STRUCT(VkWriteDescriptorSetAccelerationStructureKHR); DECLARE_REFLECTION_STRUCT(VkWriteDescriptorSetInlineUniformBlock); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMaintenance5FeaturesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMaintenance5PropertiesKHR); +DECLARE_REFLECTION_STRUCT(VkRenderingAreaInfoKHR); +DECLARE_REFLECTION_STRUCT(VkDeviceImageSubresourceInfoKHR); +DECLARE_REFLECTION_STRUCT(VkPipelineCreateFlags2CreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkBufferUsageFlags2CreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkImageSubresource2KHR); +DECLARE_REFLECTION_STRUCT(VkSubresourceLayout2KHR); DECLARE_DESERIALISE_TYPE(VkAccelerationStructureBuildGeometryInfoKHR); DECLARE_DESERIALISE_TYPE(VkAccelerationStructureBuildSizesInfoKHR); @@ -2018,6 +2039,14 @@ DECLARE_DESERIALISE_TYPE(VkVertexInputBindingDescription2EXT); DECLARE_DESERIALISE_TYPE(VkWriteDescriptorSet); DECLARE_DESERIALISE_TYPE(VkWriteDescriptorSetAccelerationStructureKHR); DECLARE_DESERIALISE_TYPE(VkWriteDescriptorSetInlineUniformBlock); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMaintenance5FeaturesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMaintenance5PropertiesKHR); +DECLARE_DESERIALISE_TYPE(VkRenderingAreaInfoKHR); +DECLARE_DESERIALISE_TYPE(VkDeviceImageSubresourceInfoKHR); +DECLARE_DESERIALISE_TYPE(VkPipelineCreateFlags2CreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkBufferUsageFlags2CreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkImageSubresource2KHR); +DECLARE_DESERIALISE_TYPE(VkSubresourceLayout2KHR); // plain structs with no next chain DECLARE_REFLECTION_STRUCT(VkAabbPositionsKHR); @@ -2106,6 +2135,7 @@ DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDescription); DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDivisorDescriptionEXT); DECLARE_REFLECTION_STRUCT(VkViewport); DECLARE_REFLECTION_STRUCT(VkXYColorEXT); +DECLARE_REFLECTION_STRUCT(VkSubresourceLayout); // rdcarray serialisation is generic but the stringification is not DECLARE_STRINGISE_TYPE(rdcarray); @@ -2196,6 +2226,14 @@ enum VkFormatFeatureFlagBits2 : uint64_t { }; +enum VkBufferUsageFlagBits2KHR : uint64_t +{ +}; + +enum VkPipelineCreateFlagBits2KHR : uint64_t +{ +}; + // enums DECLARE_REFLECTION_ENUM(VkAccelerationStructureBuildTypeKHR); @@ -2353,6 +2391,8 @@ DECLARE_REFLECTION_ENUM(VkValidationCheckEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureDisableEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureEnableEXT); DECLARE_REFLECTION_ENUM(VkVertexInputRate); +DECLARE_REFLECTION_ENUM(VkBufferUsageFlagBits2KHR); +DECLARE_REFLECTION_ENUM(VkPipelineCreateFlagBits2KHR); // win32 only enums #ifdef VK_USE_PLATFORM_WIN32_KHR diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index dddbc58d72..df6b1b7550 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -37,6 +37,8 @@ #include "stb/stb_image_write.h" +#include + RDOC_EXTERN_CONFIG(bool, Replay_Debug_PrintChunkTimings); RDOC_EXTERN_CONFIG(bool, Vulkan_Debug_VerboseCommandRecording); @@ -1538,6 +1540,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_KHR_MAINTENANCE_4_EXTENSION_NAME, VK_KHR_MAINTENANCE_4_SPEC_VERSION, }, + { + VK_KHR_MAINTENANCE_5_EXTENSION_NAME, + VK_KHR_MAINTENANCE_5_SPEC_VERSION, + }, { VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, @@ -4159,6 +4165,10 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) return Serialise_vkCreateRayTracingPipelinesKHR(ser, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL, NULL, NULL); + case VulkanChunk::vkCmdBindIndexBuffer2KHR: + return Serialise_vkCmdBindIndexBuffer2KHR(ser, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, 0, + VK_INDEX_TYPE_MAX_ENUM); + // chunks that are reserved but not yet serialised case VulkanChunk::vkResetCommandPool: case VulkanChunk::vkCreateDepthTargetView: @@ -5824,6 +5834,86 @@ void WrappedVulkan::ReplayDraw(VkCommandBuffer cmd, const ActionDescription &act } } +VkPipelineCreateFlags2KHR WrappedVulkan::GetPipelineCreateFlags(const VkGraphicsPipelineCreateInfo *info) +{ + const VkPipelineCreateFlags2CreateInfoKHR *flags2 = + (const VkPipelineCreateFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + if(flags2) + return flags2->flags; + + return info->flags; +} + +VkPipelineCreateFlags2KHR WrappedVulkan::GetPipelineCreateFlags(const VkComputePipelineCreateInfo *info) +{ + const VkPipelineCreateFlags2CreateInfoKHR *flags2 = + (const VkPipelineCreateFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + if(flags2) + return flags2->flags; + + return info->flags; +} + +VkBufferUsageFlags2KHR WrappedVulkan::GetBufferUsageFlags(const VkBufferCreateInfo *info) +{ + const VkBufferUsageFlags2CreateInfoKHR *usage2 = + (const VkBufferUsageFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR); + if(usage2) + return usage2->usage; + + return info->usage; +} + +void WrappedVulkan::SetPipelineCreateFlags(VkGraphicsPipelineCreateInfo *info, + VkPipelineCreateFlags2KHR flags) +{ + VkPipelineCreateFlags2CreateInfoKHR *flags2 = (VkPipelineCreateFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + if(flags2) + { + flags2->flags = flags; + } + else + { + assert(flags <= VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM); + info->flags = (VkPipelineCreateFlags)flags; + } +} + +void WrappedVulkan::SetPipelineCreateFlags(VkComputePipelineCreateInfo *info, + VkPipelineCreateFlags2KHR flags) +{ + VkPipelineCreateFlags2CreateInfoKHR *flags2 = (VkPipelineCreateFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + if(flags2) + { + flags2->flags = flags; + } + else + { + assert(flags <= VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM); + info->flags = (VkPipelineCreateFlags)flags; + } +} + +void WrappedVulkan::SetBufferUsageFlags(VkBufferCreateInfo *info, VkBufferUsageFlags2KHR flags) +{ + VkBufferUsageFlags2CreateInfoKHR *usage2 = (VkBufferUsageFlags2CreateInfoKHR *)FindNextStruct( + info, VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR); + if(usage2) + { + usage2->usage = flags; + } + else + { + assert(flags <= VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM); + info->usage = (VkBufferUsageFlags)flags; + } +} + #if ENABLED(ENABLE_UNIT_TESTS) #undef None diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 43236fba11..ba42723405 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1434,6 +1434,17 @@ class WrappedVulkan : public IFrameCapturer return NULL; } + // VK_KHR_maintenance5 helpers + static VkPipelineCreateFlags2KHR GetPipelineCreateFlags(const VkGraphicsPipelineCreateInfo *info); + static VkPipelineCreateFlags2KHR GetPipelineCreateFlags(const VkComputePipelineCreateInfo *info); + static VkBufferUsageFlags2KHR GetBufferUsageFlags(const VkBufferCreateInfo *info); + + static void SetPipelineCreateFlags(VkGraphicsPipelineCreateInfo *info, + VkPipelineCreateFlags2KHR flags); + static void SetPipelineCreateFlags(VkComputePipelineCreateInfo *info, + VkPipelineCreateFlags2KHR flags); + static void SetBufferUsageFlags(VkBufferCreateInfo *info, VkBufferUsageFlags2KHR flags); + // Device initialization IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateInstance, const VkInstanceCreateInfo *pCreateInfo, @@ -2995,4 +3006,18 @@ class WrappedVulkan : public IFrameCapturer VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR(VkDevice device, VkPipeline pipeline, uint32_t group, VkShaderGroupShaderKHR groupShader); + + // VK_KHR_maintenance5 + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer commandBuffer, + VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, + VkIndexType indexType); + IMPLEMENT_FUNCTION_SERIALISED(void, vkGetDeviceImageSubresourceLayoutKHR, VkDevice device, + const VkDeviceImageSubresourceInfoKHR *pInfo, + VkSubresourceLayout2KHR *pLayout); + IMPLEMENT_FUNCTION_SERIALISED(void, vkGetImageSubresourceLayout2KHR, VkDevice device, + VkImage image, const VkImageSubresource2KHR *pSubresource, + VkSubresourceLayout2KHR *pLayout); + IMPLEMENT_FUNCTION_SERIALISED(void, vkGetRenderingAreaGranularityKHR, VkDevice device, + const VkRenderingAreaInfoKHR *pRenderingAreaInfo, + VkExtent2D *pGranularity); }; diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.cpp b/renderdoc/driver/vulkan/vk_dispatchtables.cpp index b2fcc81271..3ed0935fd5 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.cpp +++ b/renderdoc/driver/vulkan/vk_dispatchtables.cpp @@ -75,8 +75,8 @@ void InitInstanceExtensionTables(VkInstance instance, InstanceDeviceInfo *info) instance = Unwrap(instance); #undef DeclExt -#define DeclExt(name) \ - bool name = false; \ +#define DeclExt(name) \ + ExtensionStatusFlags name = ExtensionStatusFlagBits::NotEnabled; \ (void)name; #undef CheckExt diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.h b/renderdoc/driver/vulkan/vk_dispatchtables.h index 6963f41023..1e7ed5cc48 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.h +++ b/renderdoc/driver/vulkan/vk_dispatchtables.h @@ -26,6 +26,7 @@ // layer includes +#include #if ENABLED(RDOC_WIN32) // undefined clashing windows #defines #undef CreateEvent @@ -37,10 +38,20 @@ void InitReplayTables(void *vulkanModule); +// bitmask of extension enabled status +enum ExtensionStatusFlagBits +{ + NotEnabled = 0, + ExplicitEnabled = 1 << 0, + PromotionEnabled = 1 << 1, +}; + +typedef uint8_t ExtensionStatusFlags; + struct InstanceDeviceInfo { #undef DeclExt -#define DeclExt(name) bool ext_##name = false; +#define DeclExt(name) ExtensionStatusFlags ext_##name = ExtensionStatusFlagBits::NotEnabled; bool brokenGetDeviceProcAddr = false; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index a964af88d0..cdda075599 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -539,7 +539,8 @@ DeclExt(KHR_ray_query); \ DeclExt(EXT_nested_command_buffer); \ DeclExt(EXT_shader_object); \ - DeclExt(KHR_ray_tracing_pipeline); + DeclExt(KHR_ray_tracing_pipeline); \ + DeclExt(KHR_maintenance5); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -668,7 +669,8 @@ CheckExt(KHR_acceleration_structure, VKXX); \ CheckExt(KHR_ray_query, VKXX); \ CheckExt(EXT_shader_object, VKXX); \ - CheckExt(KHR_ray_tracing_pipeline, VKXX); + CheckExt(KHR_ray_tracing_pipeline, VKXX); \ + CheckExt(KHR_maintenance5, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -1032,6 +1034,10 @@ HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingCaptureReplayShaderGroupHandlesKHR); \ HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingShaderGroupHandlesKHR); \ HookInitExtension(KHR_ray_tracing_pipeline, GetRayTracingShaderGroupStackSizeKHR); \ + HookInitExtension(KHR_maintenance5, CmdBindIndexBuffer2KHR); \ + HookInitExtension(KHR_maintenance5, GetDeviceImageSubresourceLayoutKHR); \ + HookInitExtension(KHR_maintenance5, GetImageSubresourceLayout2KHR); \ + HookInitExtension(KHR_maintenance5, GetRenderingAreaGranularityKHR); \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ HookInitExtension_Device_Android(); \ @@ -1933,6 +1939,14 @@ pipeline, uint32_t, group, VkShaderGroupShaderKHR, groupShader); \ HookDefine2(void, vkCmdSetRayTracingPipelineStackSizeKHR, VkCommandBuffer, commandBuffer, \ uint32_t, pipelineStackSize); \ + HookDefine5(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer, commandBuffer, VkBuffer, buffer, \ + VkDeviceSize, offset, VkDeviceSize, size, VkIndexType, indexType); \ + HookDefine3(void, vkGetDeviceImageSubresourceLayoutKHR, VkDevice, device, \ + const VkDeviceImageSubresourceInfoKHR *, pInfo, VkSubresourceLayout2KHR *, pLayout); \ + HookDefine4(void, vkGetImageSubresourceLayout2KHR, VkDevice, device, VkImage, image, \ + const VkImageSubresource2KHR *, pSubresource, VkSubresourceLayout2KHR *, pLayout); \ + HookDefine3(void, vkGetRenderingAreaGranularityKHR, VkDevice, device, \ + const VkRenderingAreaInfoKHR *, pRenderingAreaInfo, VkExtent2D *, pGranularity); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_Android(); \ diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 02896c56c9..f46d520452 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1069,7 +1069,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, VulkanCreationInfo &info, ResourceId id, const VkGraphicsPipelineCreateInfo *pCreateInfo) { - flags = pCreateInfo->flags; + flags = WrappedVulkan::GetPipelineCreateFlags(pCreateInfo); graphicsPipe = true; @@ -1750,8 +1750,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, VulkanCreationInfo &info, ResourceId id, const VkComputePipelineCreateInfo *pCreateInfo) { - flags = pCreateInfo->flags; - + flags = WrappedVulkan::GetPipelineCreateFlags(pCreateInfo); graphicsPipe = false; compLayout = GetResID(pCreateInfo->layout); @@ -2300,7 +2299,7 @@ void VulkanCreationInfo::Buffer::Init(VulkanResourceManager *resourceMan, Vulkan const VkBufferCreateInfo *pCreateInfo, VkMemoryRequirements origMrq) { - usage = pCreateInfo->usage; + usage = WrappedVulkan::GetBufferUsageFlags(pCreateInfo); size = pCreateInfo->size; gpuAddress = 0; diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 9c446f235c..1e2bff004d 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -293,7 +293,7 @@ struct VulkanCreationInfo VkPipeline subpass0pipe; // VkGraphicsPipelineCreateInfo - VkPipelineCreateFlags flags; + VkPipelineCreateFlags2KHR flags; // VkPipelineShaderStageCreateInfo ShaderEntry shaders[NumShaderStages]; @@ -590,7 +590,7 @@ struct VulkanCreationInfo void Init(VulkanResourceManager *resourceMan, VulkanCreationInfo &info, const VkBufferCreateInfo *pCreateInfo, VkMemoryRequirements origMrq); - VkBufferUsageFlags usage; + VkBufferUsageFlags2KHR usage; uint64_t size; uint64_t gpuAddress; bool external; diff --git a/renderdoc/driver/vulkan/vk_layer.cpp b/renderdoc/driver/vulkan/vk_layer.cpp index c4fcef0293..8ffdf66bfb 100644 --- a/renderdoc/driver/vulkan/vk_layer.cpp +++ b/renderdoc/driver/vulkan/vk_layer.cpp @@ -374,12 +374,14 @@ VK_LAYER_RENDERDOC_CaptureEnumerateInstanceExtensionProperties( } #undef DeclExt -#define DeclExt(name) \ - bool name = false; \ +#define DeclExt(name) \ + ExtensionStatusFlags name = ExtensionStatusFlagBits::NotEnabled; \ (void)name; #undef CheckExt -#define CheckExt(name, ver) name = instDevInfo == NULL || instDevInfo->ext_##name; +#define CheckExt(name, ver) \ + name = instDevInfo == NULL ? (ExtensionStatusFlags)ExtensionStatusFlagBits::NotEnabled \ + : instDevInfo->ext_##name; #undef HookInit #define HookInit(function) \ @@ -396,12 +398,16 @@ VK_LAYER_RENDERDOC_CaptureEnumerateInstanceExtensionProperties( // for promoted extensions, we return the function pointer for either name as an alias. #undef HookInitPromotedExtension -#define HookInitPromotedExtension(cond, function, suffix) \ - if(!strcmp(pName, STRINGIZE(CONCAT(vk, function))) || \ - !strcmp(pName, STRINGIZE(CONCAT(vk, CONCAT(function, suffix))))) \ - { \ - if(cond) \ - return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); \ +#define HookInitPromotedExtension(cond, function, suffix) \ + if(!strcmp(pName, STRINGIZE(CONCAT(vk, CONCAT(function, suffix))))) \ + { \ + if(ExtensionStatusFlagBits::ExplicitEnabled & cond) \ + return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); \ + } \ + if(!strcmp(pName, STRINGIZE(CONCAT(vk, function)))) \ + { \ + if(ExtensionStatusFlagBits::PromotionEnabled & cond) \ + return (PFN_vkVoidFunction)&CONCAT(hooked_vk, function); \ } #undef HookInitExtensionEXTtoKHR @@ -412,6 +418,9 @@ VK_LAYER_RENDERDOC_CaptureEnumerateInstanceExtensionProperties( VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName) { + if(device == VK_NULL_HANDLE || pName == NULL) + return NULL; + if(!strcmp("vkGetDeviceProcAddr", pName)) return (PFN_vkVoidFunction)&VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr; if(!strcmp("vkCreateDevice", pName)) @@ -421,9 +430,6 @@ VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName) HookInitVulkanDevice(); - if(device == VK_NULL_HANDLE) - return NULL; - InstanceDeviceInfo *instDevInfo = GetRecord(device)->instDevInfo; DeclExts(); diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index dd05904255..5a0ab4cb67 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -798,7 +798,17 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, VkSemaphoreGetFdInfoKHR, \ UnwrapInPlace(out->semaphore)); \ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, VkSwapchainCreateInfoKHR, \ - UnwrapInPlace(out->surface), UnwrapInPlace(out->oldSwapchain)); + UnwrapInPlace(out->surface), UnwrapInPlace(out->oldSwapchain)); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, \ + VkBufferUsageFlags2CreateInfoKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR, \ + VkPipelineCreateFlags2CreateInfoKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, \ + VkPhysicalDeviceMaintenance5FeaturesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR, \ + VkPhysicalDeviceMaintenance5PropertiesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR, VkImageSubresource2KHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR, VkSubresourceLayout2KHR); // define cases for structs we don't handle at all - only the body of the case needs to be defined // per-function. @@ -844,7 +854,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: \ case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA: \ case VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA: \ - case VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR: \ case VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV: \ case VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV: \ case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: \ @@ -878,7 +887,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT: \ case VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT: \ - case VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR: \ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT: \ case VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM: \ case VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG: \ @@ -917,7 +925,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA: \ - case VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX: \ case VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT: \ @@ -1031,8 +1038,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT: \ @@ -1106,7 +1111,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR: \ case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT: \ @@ -1139,7 +1143,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_SUBMIT_INFO_ARM: \ case VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: \ - case VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR: \ case VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR: \ case VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR: \ case VK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM: \ @@ -1156,7 +1159,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP: \ case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: \ case VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT: \ - case VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT: \ case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_LATENCY_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV: \ @@ -1696,6 +1698,23 @@ size_t GetNextPatchSize(const void *pNext) memSize += info->accelerationStructureCount * sizeof(VkAccelerationStructureKHR); break; } + case VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR: + { + memSize += sizeof(VkDeviceImageSubresourceInfoKHR); + + VkDeviceImageSubresourceInfoKHR *info = (VkDeviceImageSubresourceInfoKHR *)next; + memSize += GetNextPatchSize(info->pCreateInfo); + memSize += GetNextPatchSize(info->pSubresource); + break; + } + case VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR: + { + memSize += sizeof(VkRenderingAreaInfoKHR); + + VkRenderingAreaInfoKHR *info = (VkRenderingAreaInfoKHR *)next; + memSize += info->colorAttachmentCount * sizeof(VkFormat); + break; + } // Android External Buffer Memory Extension #if ENABLED(RDOC_ANDROID) @@ -2962,6 +2981,46 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, break; } + case VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR: + { + const VkDeviceImageSubresourceInfoKHR *in = + (const VkDeviceImageSubresourceInfoKHR *)nextInput; + VkDeviceImageSubresourceInfoKHR *out = (VkDeviceImageSubresourceInfoKHR *)tempMem; + + // append immediately so tempMem is incremented + AppendModifiedChainedStruct(tempMem, out, nextChainTail); + + out->sType = VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR; + out->pNext = in->pNext; + + out->pCreateInfo = AllocStructCopy(tempMem, in->pCreateInfo); + UnwrapNextChain(state, "VkImageCreateInfo", tempMem, (VkBaseInStructure *)out->pCreateInfo); + + out->pSubresource = AllocStructCopy(tempMem, in->pSubresource); + UnwrapNextChain(state, "VkImageSubresource2KHR", tempMem, + (VkBaseInStructure *)out->pSubresource); + + break; + } + case VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR: + { + const VkRenderingAreaInfoKHR *in = (const VkRenderingAreaInfoKHR *)nextInput; + VkRenderingAreaInfoKHR *out = (VkRenderingAreaInfoKHR *)tempMem; + + // append immediately so tempMem is incremented + AppendModifiedChainedStruct(tempMem, out, nextChainTail); + + VkFormat *outFormats = (VkFormat *)tempMem; + tempMem += sizeof(VkFormat) * in->colorAttachmentCount; + + *out = *in; + + out->pColorAttachmentFormats = outFormats; + for(uint32_t i = 0; i < in->colorAttachmentCount; i++) + outFormats[i] = in->pColorAttachmentFormats[i]; + + break; + } // Android External Buffer Memory Extension #if ENABLED(RDOC_ANDROID) @@ -3281,6 +3340,13 @@ void CopyNextChainForPatching(const char *structName, byte *&tempMem, VkBaseInSt CopyNextChainedStruct(sizeof(VkWriteDescriptorSetAccelerationStructureKHR), tempMem, nextInput, nextChainTail); break; + case VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR: + CopyNextChainedStruct(sizeof(VkDeviceImageSubresourceInfoKHR), tempMem, nextInput, + nextChainTail); + break; + case VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR: + CopyNextChainedStruct(sizeof(VkRenderingAreaInfoKHR), tempMem, nextInput, nextChainTail); + break; // Android External Buffer Memory Extension #if ENABLED(RDOC_ANDROID) diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 1f741eb4ad..29d78c4d22 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -526,9 +526,19 @@ void VulkanDebugManager::PatchLineStripIndexBuffer(const ActionDescription *acti if(action->flags & ActionFlags::Indexed) { - GetBufferData(rs.ibuffer.buf, - rs.ibuffer.offs + uint64_t(action->indexOffset) * rs.ibuffer.bytewidth, - uint64_t(action->numIndices) * rs.ibuffer.bytewidth, indices); + uint64_t offset = uint64_t(action->indexOffset) * rs.ibuffer.bytewidth; + uint64_t data_len = uint64_t(action->numIndices) * rs.ibuffer.bytewidth; + + uint64_t len = RDCMIN(data_len, rs.ibuffer.size - offset); + + GetBufferData(rs.ibuffer.buf, rs.ibuffer.offs + offset, len, indices); + + if(len < data_len) + { + // fill the rest with 0s + indices.resize((size_t)data_len); + memset(indices.data() + len, 0, (size_t)(data_len - len)); + } if(rs.ibuffer.bytewidth == 4) idx32 = (uint32_t *)indices.data(); diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index 28fae6b482..01fcf5713f 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -4517,8 +4517,13 @@ void VulkanReplay::FetchVSOut(uint32_t eventId, VulkanRenderState &state) // fetch ibuffer if(state.ibuffer.buf != ResourceId()) - GetBufferData(state.ibuffer.buf, state.ibuffer.offs + action->indexOffset * idxsize, - uint64_t(action->numIndices) * idxsize, idxdata); + { + uint64_t offset = uint64_t(action->indexOffset) * idxsize; + uint64_t data_len = uint64_t(action->numIndices) * idxsize; + + uint64_t len = RDCMIN(data_len, state.ibuffer.size - offset); + GetBufferData(state.ibuffer.buf, state.ibuffer.offs + offset, len, idxdata); + } // figure out what the maximum index could be, so we can clamp our index buffer to something // sane diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 02525b6056..7ff2457c1c 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1332,6 +1332,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) ret.inputAssembly.indexBuffer.resourceId = rm->GetOriginalID(state.ibuffer.buf); ret.inputAssembly.indexBuffer.byteOffset = state.ibuffer.offs; ret.inputAssembly.indexBuffer.byteStride = state.ibuffer.bytewidth; + ret.inputAssembly.indexBuffer.byteSize = state.ibuffer.size; ret.inputAssembly.primitiveRestartEnable = state.primRestartEnable != VK_FALSE; ret.inputAssembly.topology = MakePrimitiveTopology(state.primitiveTopology, state.patchControlPoints); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 2559a8c537..3faae76b00 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -172,6 +172,8 @@ DECL_VKFLAG_EXT(VkBuildAccelerationStructure, KHR); DECL_VKFLAG_EXT(VkGeometry, KHR); DECL_VKFLAG_EXT(VkGeometryInstance, KHR); DECL_VKFLAG_EXT(VkShaderCreate, EXT); +DECL_VKFLAG_EXT(VkBufferUsage, 2KHR); +DECL_VKFLAG_EXT(VkPipelineCreate, 2KHR); // serialise a member as flags - cast to the Bits enum for serialisation so the stringification // picks up the bitfield and doesn't treat it as uint32_t. Then we rename the type back to the base @@ -1456,6 +1458,20 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM, \ VkSubpassFragmentDensityMapOffsetEndInfoQCOM) \ \ + /* VK_KHR_maintenance5 */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR, \ + VkPhysicalDeviceMaintenance5FeaturesKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR, \ + VkPhysicalDeviceMaintenance5PropertiesKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR, VkRenderingAreaInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR, VkDeviceImageSubresourceInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR, \ + VkPipelineCreateFlags2CreateInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, \ + VkBufferUsageFlags2CreateInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR, VkImageSubresource2KHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR, VkSubresourceLayout2KHR) \ + \ /* Surface creation structs. These would pull in dependencies on OS-specific includes. */ \ /* So treat them as unsupported. */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR) \ @@ -1587,8 +1603,6 @@ SERIALISE_VK_HANDLES(); /* VK_EXT_image_compression_control */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT) \ \ /* VK_EXT_image_compression_control_swapchain */ \ @@ -1726,14 +1740,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR) \ \ - /* VK_KHR_maintenance5 */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR) \ - \ /* VK_KHR_maintenance6 */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR) \ @@ -12391,6 +12397,155 @@ void DoSerialise(SerialiserType &ser, VkStridedDeviceAddressRegionKHR &el) SERIALISE_MEMBER(size); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMaintenance5FeaturesKHR &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(maintenance5); +} + +template <> +void Deserialise(const VkPhysicalDeviceMaintenance5FeaturesKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMaintenance5PropertiesKHR &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(earlyFragmentMultisampleCoverageAfterSampleCounting); + SERIALISE_MEMBER(earlyFragmentSampleMaskTestBeforeSampleCounting); + SERIALISE_MEMBER(depthStencilSwizzleOneSupport); + SERIALISE_MEMBER(polygonModePointSize); + SERIALISE_MEMBER(nonStrictSinglePixelWideLinesUseParallelogram); + SERIALISE_MEMBER(nonStrictWideLinesUseParallelogram); +} + +template <> +void Deserialise(const VkPhysicalDeviceMaintenance5PropertiesKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkRenderingAreaInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(colorAttachmentCount); + SERIALISE_MEMBER_ARRAY(pColorAttachmentFormats, colorAttachmentCount); + SERIALISE_MEMBER(depthAttachmentFormat); + SERIALISE_MEMBER(stencilAttachmentFormat); +} + +template <> +void Deserialise(const VkRenderingAreaInfoKHR &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pColorAttachmentFormats; +} + +template +void DoSerialise(SerialiserType &ser, VkDeviceImageSubresourceInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_OPT(pCreateInfo); + SERIALISE_MEMBER_OPT(pSubresource); +} + +template <> +void Deserialise(const VkDeviceImageSubresourceInfoKHR &el) +{ + DeserialiseNext(el.pNext); + delete el.pCreateInfo; + delete el.pSubresource; +} + +template +void DoSerialise(SerialiserType &ser, VkPipelineCreateFlags2CreateInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkPipelineCreateFlags2KHR, flags); +} + +template <> +void Deserialise(const VkPipelineCreateFlags2CreateInfoKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkBufferUsageFlags2CreateInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_VKFLAGS(VkBufferUsageFlags2KHR, usage); +} + +template <> +void Deserialise(const VkBufferUsageFlags2CreateInfoKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkImageSubresource2KHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(imageSubresource); +} + +template <> +void Deserialise(const VkImageSubresource2KHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSubresourceLayout2KHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(subresourceLayout); +} + +template <> +void Deserialise(const VkSubresourceLayout2KHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSubresourceLayout &el) +{ + SERIALISE_MEMBER(offset).OffsetOrSize(); + SERIALISE_MEMBER(size).OffsetOrSize(); + SERIALISE_MEMBER(rowPitch).OffsetOrSize(); + SERIALISE_MEMBER(arrayPitch).OffsetOrSize(); + SERIALISE_MEMBER(depthPitch).OffsetOrSize(); +} + +template <> +void Deserialise(const VkSubresourceLayout &el) +{ +} + // pNext structs - always have deserialise for the next chain INSTANTIATE_SERIALISE_TYPE(VkAccelerationStructureBuildGeometryInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkAccelerationStructureBuildSizesInfoKHR); @@ -12831,6 +12986,14 @@ INSTANTIATE_SERIALISE_TYPE(VkVertexInputAttributeDescription2EXT); INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDescription2EXT); INSTANTIATE_SERIALISE_TYPE(VkWriteDescriptorSet); INSTANTIATE_SERIALISE_TYPE(VkWriteDescriptorSetAccelerationStructureKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMaintenance5FeaturesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMaintenance5PropertiesKHR); +INSTANTIATE_SERIALISE_TYPE(VkRenderingAreaInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkDeviceImageSubresourceInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkPipelineCreateFlags2CreateInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkBufferUsageFlags2CreateInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkImageSubresource2KHR); +INSTANTIATE_SERIALISE_TYPE(VkSubresourceLayout2KHR); // plain structs with no next chain INSTANTIATE_SERIALISE_TYPE(VkAabbPositionsKHR); @@ -12917,6 +13080,7 @@ INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDescription); INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDivisorDescriptionEXT); INSTANTIATE_SERIALISE_TYPE(VkViewport); INSTANTIATE_SERIALISE_TYPE(VkXYColorEXT); +INSTANTIATE_SERIALISE_TYPE(VkSubresourceLayout); INSTANTIATE_SERIALISE_TYPE(DescriptorSetSlot); INSTANTIATE_SERIALISE_TYPE(ImageRegionState); diff --git a/renderdoc/driver/vulkan/vk_shader_cache.cpp b/renderdoc/driver/vulkan/vk_shader_cache.cpp index f52f1482b6..a714203044 100644 --- a/renderdoc/driver/vulkan/vk_shader_cache.cpp +++ b/renderdoc/driver/vulkan/vk_shader_cache.cpp @@ -909,7 +909,7 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p VkGraphicsPipelineCreateInfo ret = { VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, NULL, - pipeInfo.flags, + 0, stageCount, stages, &vi, @@ -1024,11 +1024,28 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p rs.pNext = &provokeSetup; } + static VkPipelineCreateFlags2CreateInfoKHR flags2 = { + VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR, + }; + + VkPipelineCreateFlags2KHR flags = pipeInfo.flags; + // never create derivatives - ret.flags &= ~VK_PIPELINE_CREATE_DERIVATIVE_BIT; + flags &= ~VK_PIPELINE_CREATE_DERIVATIVE_BIT; - ret.flags &= ~VK_PIPELINE_CREATE_LIBRARY_BIT_KHR; - ret.flags &= ~VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT; + flags &= ~VK_PIPELINE_CREATE_LIBRARY_BIT_KHR; + flags &= ~VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT; + + if(flags > VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM) + { + flags2.flags = pipeInfo.flags; + flags2.pNext = ret.pNext; + ret.pNext = &flags2; + } + else + { + ret.flags = (VkPipelineCreateFlags)flags; + } pipeCreateInfo = ret; } @@ -1100,15 +1117,32 @@ void VulkanShaderCache::MakeComputePipelineInfo(VkComputePipelineCreateInfo &pip VkComputePipelineCreateInfo ret = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, NULL, - pipeInfo.flags, + 0, stage, rm->GetCurrentHandle(pipeInfo.compLayout), VK_NULL_HANDLE, // base pipeline handle 0, // base pipeline index }; + VkPipelineCreateFlags2KHR flags = pipeInfo.flags; + // never create derivatives - ret.flags &= ~VK_PIPELINE_CREATE_DERIVATIVE_BIT; + flags &= ~VK_PIPELINE_CREATE_DERIVATIVE_BIT; + + static VkPipelineCreateFlags2CreateInfoKHR flags2 = { + VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR, + }; + + if(flags > VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM) + { + flags2.flags = pipeInfo.flags; + flags2.pNext = ret.pNext; + ret.pNext = &flags2; + } + else + { + ret.flags = (VkPipelineCreateFlags)flags; + } pipeCreateInfo = ret; } diff --git a/renderdoc/driver/vulkan/vk_shader_feedback.cpp b/renderdoc/driver/vulkan/vk_shader_feedback.cpp index ef24cfe53d..a4dd06ba0b 100644 --- a/renderdoc/driver/vulkan/vk_shader_feedback.cpp +++ b/renderdoc/driver/vulkan/vk_shader_feedback.cpp @@ -1605,7 +1605,7 @@ bool VulkanReplay::FetchShaderFeedback(uint32_t eventId) m_pDriver->GetDriverInfo().BufferDeviceAddressBrokenDriver()) useBufferAddress = false; - bool useBufferAddressKHR = m_pDriver->GetExtensions(NULL).ext_KHR_buffer_device_address; + bool useBufferAddressKHR = m_pDriver->GetExtensions(NULL).ext_KHR_buffer_device_address != 0; const VulkanRenderState &state = m_pDriver->m_RenderState; VulkanCreationInfo &creationInfo = m_pDriver->m_CreationInfo; diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index 5116f7be1b..1ea9c20916 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -138,7 +138,6 @@ void setupRenderingInfo(const VulkanRenderState::DynamicRendering &dynamicRender VulkanRenderState::VulkanRenderState() { - RDCEraseEl(ibuffer); } void VulkanRenderState::BeginRenderPassAndApplyState(WrappedVulkan *vk, VkCommandBuffer cmd, @@ -697,9 +696,17 @@ void VulkanRenderState::BindDynamicState(WrappedVulkan *vk, VkCommandBuffer cmd) else if(ibuffer.bytewidth == 1) type = VK_INDEX_TYPE_UINT8_KHR; - ObjDisp(cmd)->CmdBindIndexBuffer( - Unwrap(cmd), Unwrap(vk->GetResourceManager()->GetCurrentHandle(ibuffer.buf)), - ibuffer.offs, type); + VkBuffer idxBufferUnwrapped = + Unwrap(vk->GetResourceManager()->GetCurrentHandle(ibuffer.buf)); + if(ibuffer.size == VK_WHOLE_SIZE) + { + ObjDisp(cmd)->CmdBindIndexBuffer(Unwrap(cmd), idxBufferUnwrapped, ibuffer.offs, type); + } + else + { + ObjDisp(cmd)->CmdBindIndexBuffer2KHR(Unwrap(cmd), idxBufferUnwrapped, ibuffer.offs, + ibuffer.size, type); + } } if((vk->DynamicVertexInput() || vk->ShaderObject()) && dynamicStates[VkDynamicVertexInputEXT]) diff --git a/renderdoc/driver/vulkan/vk_state.h b/renderdoc/driver/vulkan/vk_state.h index b8417b6405..29f7bd1735 100644 --- a/renderdoc/driver/vulkan/vk_state.h +++ b/renderdoc/driver/vulkan/vk_state.h @@ -179,6 +179,7 @@ struct VulkanRenderState { ResourceId buf; VkDeviceSize offs = 0; + VkDeviceSize size = VK_WHOLE_SIZE; int bytewidth = 0; } ibuffer; diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index 66fbf4799d..54d61e29da 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 == 1213, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1214, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -245,6 +245,7 @@ rdcstr DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdTraceRaysIndirectKHR) STRINGISE_ENUM_CLASS(vkCmdTraceRaysKHR) STRINGISE_ENUM_CLASS(vkCreateRayTracingPipelinesKHR) + STRINGISE_ENUM_CLASS(vkCmdBindIndexBuffer2KHR) STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() @@ -4103,3 +4104,77 @@ rdcstr DoStringise(const VkGeometryTypeKHR &el) } END_ENUM_STRINGISE(); } + +template <> +rdcstr DoStringise(const VkBufferUsageFlagBits2KHR &el) +{ + BEGIN_BITFIELD_STRINGISE(VkBufferUsageFlagBits2KHR); + { + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} + +template <> +rdcstr DoStringise(const VkPipelineCreateFlagBits2KHR &el) +{ + BEGIN_BITFIELD_STRINGISE(VkPipelineCreateFlagBits2KHR); + { + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR); + STRINGISE_BITFIELD_BIT64( + VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT); + STRINGISE_BITFIELD_BIT64(VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 2c93d9ba7f..166b7a8883 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -3854,6 +3854,7 @@ bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer(SerialiserType &ser, VulkanRenderState &renderstate = GetCmdRenderState(); renderstate.ibuffer.buf = GetResID(buffer); renderstate.ibuffer.offs = offset; + renderstate.ibuffer.size = VK_WHOLE_SIZE; if(indexType == VK_INDEX_TYPE_UINT32) renderstate.ibuffer.bytewidth = 4; @@ -3907,6 +3908,94 @@ void WrappedVulkan::vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer } } +template +bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer2KHR(SerialiserType &ser, + VkCommandBuffer commandBuffer, + VkBuffer buffer, VkDeviceSize offset, + VkDeviceSize size, VkIndexType indexType) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(buffer).Important(); + SERIALISE_ELEMENT(offset).OffsetOrSize(); + SERIALISE_ELEMENT(size).OffsetOrSize(); + SERIALISE_ELEMENT(indexType).Important(); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + if(IsActiveReplaying(m_State)) + { + if(InRerecordRange(m_LastCmdBufferID)) + { + commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); + ObjDisp(commandBuffer) + ->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType); + + { + VulkanRenderState &renderstate = GetCmdRenderState(); + renderstate.ibuffer.buf = GetResID(buffer); + renderstate.ibuffer.offs = offset; + renderstate.ibuffer.size = size; + + if(indexType == VK_INDEX_TYPE_UINT32) + renderstate.ibuffer.bytewidth = 4; + else if(indexType == VK_INDEX_TYPE_UINT8_KHR) + renderstate.ibuffer.bytewidth = 1; + else + renderstate.ibuffer.bytewidth = 2; + } + } + } + else + { + // track while reading, as we need to bind current topology & index byte width in AddAction + if(indexType == VK_INDEX_TYPE_UINT32) + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 4; + else if(indexType == VK_INDEX_TYPE_UINT8_KHR) + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 1; + else + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 2; + + // track while reading, as we need to track resource usage + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.buf = GetResID(buffer); + + ObjDisp(commandBuffer) + ->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType); + } + } + + return true; +} + +void WrappedVulkan::vkCmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer, VkBuffer buffer, + VkDeviceSize offset, VkDeviceSize size, + VkIndexType indexType) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL( + ObjDisp(commandBuffer) + ->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType)); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdBindIndexBuffer2KHR); + Serialise_vkCmdBindIndexBuffer2KHR(ser, commandBuffer, buffer, offset, size, indexType); + + record->AddChunk(scope.Get(&record->cmdInfo->alloc)); + record->MarkBufferFrameReferenced(GetRecord(buffer), 0, VK_WHOLE_SIZE, eFrameRef_Read); + } +} + template bool WrappedVulkan::Serialise_vkCmdPushConstants(SerialiserType &ser, VkCommandBuffer commandBuffer, VkPipelineLayout layout, @@ -8354,3 +8443,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyMemoryToAccelerationStructureKHR, INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindShadersEXT, VkCommandBuffer commandBuffer, uint32_t stageCount, const VkShaderStageFlagBits *pStages, const VkShaderEXT *pShaders); + +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer commandBuffer, + VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, + VkIndexType indexType); diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 5bc3b5a53e..1c424d23f9 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -331,13 +331,16 @@ void WrappedVulkan::vkGetDeviceBufferMemoryRequirements(VkDevice device, VkBufferCreateInfo *info = (VkBufferCreateInfo *)unwrappedInfo->pCreateInfo; + VkBufferUsageFlags2KHR usage = GetBufferUsageFlags(info); + // patch the create info the same as we would for vkCreateBuffer - info->usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - info->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; + usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; - if(IsCaptureMode(m_State) && (info->usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)) + if(IsCaptureMode(m_State) && (usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)) info->flags |= VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT; + SetBufferUsageFlags(info, usage); ObjDisp(device)->GetDeviceBufferMemoryRequirements(Unwrap(device), unwrappedInfo, pMemoryRequirements); @@ -1291,3 +1294,25 @@ VkDeviceSize WrappedVulkan::vkGetRayTracingShaderGroupStackSizeKHR( return ObjDisp(device)->GetRayTracingShaderGroupStackSizeKHR(Unwrap(device), Unwrap(pipeline), group, groupShader); } + +void WrappedVulkan::vkGetDeviceImageSubresourceLayoutKHR(VkDevice device, + const VkDeviceImageSubresourceInfoKHR *pInfo, + VkSubresourceLayout2KHR *pLayout) +{ + ObjDisp(device)->GetDeviceImageSubresourceLayoutKHR(Unwrap(device), pInfo, pLayout); +} + +void WrappedVulkan::vkGetImageSubresourceLayout2KHR(VkDevice device, VkImage image, + const VkImageSubresource2KHR *pSubresource, + VkSubresourceLayout2KHR *pLayout) +{ + ObjDisp(device)->GetImageSubresourceLayout2KHR(Unwrap(device), Unwrap(image), pSubresource, + pLayout); +} + +void WrappedVulkan::vkGetRenderingAreaGranularityKHR(VkDevice device, + const VkRenderingAreaInfoKHR *pRenderingAreaInfo, + VkExtent2D *pGranularity) +{ + ObjDisp(device)->GetRenderingAreaGranularityKHR(Unwrap(device), pRenderingAreaInfo, pGranularity); +} diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 67c1c9ba8f..c71c567bdc 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1709,16 +1709,6 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic { VkBuffer buf = VK_NULL_HANDLE; - VkBufferUsageFlags origusage = CreateInfo.usage; - - // ensure we can always readback from buffers - CreateInfo.usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - - // we only need to add TRANSFER_DST_BIT for dedicated buffers, but there's not a reliable way to - // know if a buffer will be dedicated-allocation or not. We assume that TRANSFER_DST is - // effectively free as a usage bit for all sensible implementations so we just add it here. - CreateInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; - // remap the queue family indices if(CreateInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) { @@ -1727,11 +1717,22 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic queueFamiles[q] = m_QueueRemapping[queueFamiles[q]][0].family; } - VkBufferCreateInfo patched = CreateInfo; + VkBufferUsageFlags2KHR origusage = GetBufferUsageFlags(&CreateInfo); - byte *tempMem = GetTempMemory(GetNextPatchSize(patched.pNext)); + VkBufferUsageFlags2KHR augmented_usage = origusage; + + // ensure we can always readback from buffers + augmented_usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + // we only need to add TRANSFER_DST_BIT for dedicated buffers, but there's not a reliable way to + // know if a buffer will be dedicated-allocation or not. We assume that TRANSFER_DST is + // effectively free as a usage bit for all sensible implementations so we just add it here. + augmented_usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; + + VkBufferCreateInfo patched = CreateInfo; + byte *tempMem = GetTempMemory(GetNextPatchSize(patched.pNext)); UnwrapNextChain(m_State, "VkBufferCreateInfo", tempMem, (VkBaseInStructure *)&patched); + SetBufferUsageFlags(&patched, augmented_usage); VkResult ret = ObjDisp(device)->CreateBuffer(Unwrap(device), &patched, NULL, &buf); @@ -1741,7 +1742,7 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic APIProps.SparseResources = true; } - CreateInfo.usage = origusage; + SetBufferUsageFlags(&CreateInfo, origusage); if(ret != VK_SUCCESS) { @@ -1770,38 +1771,45 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo { VkBufferCreateInfo adjusted_info = *pCreateInfo; + byte *tempMem = GetTempMemory(GetNextPatchSize(adjusted_info.pNext)); + UnwrapNextChain(m_State, "VkBufferCreateInfo", tempMem, (VkBaseInStructure *)&adjusted_info); + + VkBufferUsageFlags2KHR origusage = GetBufferUsageFlags(&adjusted_info); + + VkBufferUsageFlags2KHR usage = origusage; + // if you change any properties here, ensure you also update // vkGetDeviceBufferMemoryRequirementsKHR // TEMP HACK: Until we define a portable fake hardware, need to match the requirements for usage // on replay, so that the memory requirements are the same - adjusted_info.usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT; // we only need to add TRANSFER_DST_BIT for dedicated buffers, but there's not a reliable way to // know if a buffer will be dedicated-allocation or not. We assume that TRANSFER_DST is // effectively free as a usage bit for all sensible implementations so we just add it here. - adjusted_info.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; + usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; if(IsCaptureMode(m_State)) { // If we're using this buffer for AS storage we need to enable BDA - if(adjusted_info.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR) - adjusted_info.usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; + if(usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR) + usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; // If we're using this buffer for device addresses, ensure we force on capture replay bit. // We ensured the physical device can support this feature before whitelisting the extension. - if(adjusted_info.usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) + if(usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) adjusted_info.flags |= VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT; } - byte *tempMem = GetTempMemory(GetNextPatchSize(adjusted_info.pNext)); - - UnwrapNextChain(m_State, "VkBufferCreateInfo", tempMem, (VkBaseInStructure *)&adjusted_info); + SetBufferUsageFlags(&adjusted_info, usage); VkResult ret; SERIALISE_TIME_CALL( ret = ObjDisp(device)->CreateBuffer(Unwrap(device), &adjusted_info, NULL, pBuffer)); + SetBufferUsageFlags(&adjusted_info, origusage); + if(ret == VK_SUCCESS) { ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pBuffer); @@ -1824,7 +1832,7 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo // if we're using VK_[KHR|EXT]_buffer_device_address, we fetch the device address that's been // allocated and insert it into the next chain and patch the flags so that it replays // naturally. - if((pCreateInfo->usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) != 0) + if((origusage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) != 0) { VkBufferDeviceAddressInfo getInfo = { VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, @@ -1885,8 +1893,8 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo record->AddChunk(chunk); - record->storable = (pCreateInfo->usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | - VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) != 0; + record->storable = (origusage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) != 0; bool isSparse = (pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)) != 0; diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index 629a08fd78..87c7496076 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -38,7 +38,7 @@ VkComputePipelineCreateInfo *WrappedVulkan::UnwrapInfos(CaptureState state, unwrapped[i] = info[i]; unwrapped[i].stage.module = Unwrap(unwrapped[i].stage.module); unwrapped[i].layout = Unwrap(unwrapped[i].layout); - if(unwrapped[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + if(GetPipelineCreateFlags(&unwrapped[i]) & VK_PIPELINE_CREATE_DERIVATIVE_BIT) unwrapped[i].basePipelineHandle = Unwrap(unwrapped[i].basePipelineHandle); } @@ -79,7 +79,7 @@ VkGraphicsPipelineCreateInfo *WrappedVulkan::UnwrapInfos(CaptureState state, unwrappedInfos[i].pStages = unwrappedStages; unwrappedInfos[i].layout = Unwrap(unwrappedInfos[i].layout); unwrappedInfos[i].renderPass = Unwrap(unwrappedInfos[i].renderPass); - if(unwrappedInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + if(GetPipelineCreateFlags(&unwrappedInfos[i]) & VK_PIPELINE_CREATE_DERIVATIVE_BIT) unwrappedInfos[i].basePipelineHandle = Unwrap(unwrappedInfos[i].basePipelineHandle); UnwrapNextChain(state, "VkGraphicsPipelineCreateInfo", tempMem, @@ -638,22 +638,25 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines( // don't use pipeline caches on replay pipelineCache = VK_NULL_HANDLE; + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(&CreateInfo); + // if we have pipeline executable properties, capture the data if(GetExtensions(NULL).ext_KHR_pipeline_executable_properties) { - CreateInfo.flags |= (VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | - VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); + flags |= (VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | + VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); } // don't fail when a compile is required because we don't currently replay caches so this will // always happen. This still allows application to use this flag at runtime where it will be // valid - CreateInfo.flags &= ~VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT; + flags &= ~VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT; VkGraphicsPipelineCreateInfo *unwrapped = UnwrapInfos(m_State, &CreateInfo, 1); + SetPipelineCreateFlags(unwrapped, flags); + VkResult ret = ObjDisp(device)->CreateGraphicsPipelines(Unwrap(device), Unwrap(pipelineCache), 1, unwrapped, NULL, &pipe); - AddResource(Pipeline, ResourceType::PipelineState, "Graphics Pipeline"); if(ret != VK_SUCCESS) @@ -758,6 +761,7 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines( CreateInfo.subpass = 0; unwrapped = UnwrapInfos(m_State, &CreateInfo, 1); + SetPipelineCreateFlags(unwrapped, flags); ret = ObjDisp(device)->CreateGraphicsPipelines(Unwrap(device), Unwrap(pipelineCache), 1, unwrapped, NULL, &pipeInfo.subpass0pipe); RDCASSERTEQUAL(ret, VK_SUCCESS); @@ -774,7 +778,7 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines( DerivedResource(device, Pipeline); if(origCache != VK_NULL_HANDLE) DerivedResource(origCache, Pipeline); - if(CreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) DerivedResource(CreateInfo.basePipelineHandle, Pipeline); @@ -841,7 +845,9 @@ VkResult WrappedVulkan::vkCreateGraphicsPipelines(VkDevice device, VkPipelineCac VkGraphicsPipelineCreateInfo modifiedCreateInfo; const VkGraphicsPipelineCreateInfo *createInfo = &pCreateInfos[i]; - if(createInfo->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(createInfo); + + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { // since we serialise one by one, we need to fixup basePipelineIndex if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) @@ -864,7 +870,9 @@ VkResult WrappedVulkan::vkCreateGraphicsPipelines(VkDevice device, VkPipelineCac VkResourceRecord *record = GetResourceManager()->AddResourceRecord(pPipelines[i]); record->AddChunk(chunk); - if(pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(&pCreateInfos[i]); + + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) { @@ -957,11 +965,13 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe // don't use pipeline caches on replay pipelineCache = VK_NULL_HANDLE; + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(&CreateInfo); + // if we have pipeline executable properties, capture the data if(GetExtensions(NULL).ext_KHR_pipeline_executable_properties) { - CreateInfo.flags |= (VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | - VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); + flags |= (VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | + VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); } // don't fail when a compile is required because we don't currently replay caches so this will @@ -970,6 +980,7 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe CreateInfo.flags &= ~VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT; VkComputePipelineCreateInfo *unwrapped = UnwrapInfos(m_State, &CreateInfo, 1); + SetPipelineCreateFlags(unwrapped, flags); VkResult ret = ObjDisp(device)->CreateComputePipelines(Unwrap(device), Unwrap(pipelineCache), 1, unwrapped, NULL, &pipe); @@ -1048,7 +1059,7 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe DerivedResource(device, Pipeline); if(origCache != VK_NULL_HANDLE) DerivedResource(origCache, Pipeline); - if(CreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { if(CreateInfo.basePipelineHandle != VK_NULL_HANDLE) DerivedResource(CreateInfo.basePipelineHandle, Pipeline); @@ -1088,7 +1099,9 @@ VkResult WrappedVulkan::vkCreateComputePipelines(VkDevice device, VkPipelineCach VkComputePipelineCreateInfo modifiedCreateInfo; const VkComputePipelineCreateInfo *createInfo = &pCreateInfos[i]; - if(createInfo->flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(createInfo); + + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { // since we serialise one by one, we need to fixup basePipelineIndex if(createInfo->basePipelineIndex != -1 && createInfo->basePipelineIndex < (int)i) @@ -1117,7 +1130,9 @@ VkResult WrappedVulkan::vkCreateComputePipelines(VkDevice device, VkPipelineCach record->AddParent(cacherecord); } - if(pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) + VkPipelineCreateFlags2KHR flags = GetPipelineCreateFlags(&pCreateInfos[i]); + + if(flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) { if(pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) { diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index ac4a279a20..bc6838204c 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -1954,9 +1954,10 @@ void DoSerialise(SerialiserType &ser, VKPipe::IndexBuffer &el) { SERIALISE_MEMBER(resourceId); SERIALISE_MEMBER(byteOffset); + SERIALISE_MEMBER(byteSize); SERIALISE_MEMBER(byteStride); - SIZE_CHECK(24); + SIZE_CHECK(32); } template @@ -1966,7 +1967,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::InputAssembly &el) SERIALISE_MEMBER(indexBuffer); SERIALISE_MEMBER(topology); - SIZE_CHECK(40); + SIZE_CHECK(48); } template @@ -2289,7 +2290,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::State &el) SERIALISE_MEMBER(conditionalRendering); - SIZE_CHECK(1808); + SIZE_CHECK(1816); } #pragma endregion Vulkan pipeline state