diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 6c28811d9..6f39e23fd 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -423,6 +423,9 @@ struct Tessellation { DOCUMENT("The number of control points in each input patch."); uint32_t numControlPoints = 0; + + DOCUMENT("``True`` if the tessellation domain origin is upper-left, ``False`` if lower-left."); + bool domainOriginUpperLeft = true; }; DOCUMENT("Describes a combined viewport and scissor region."); diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 78339cdfd..9029c9deb 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -618,6 +618,10 @@ DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryInfoKHR); DECLARE_REFLECTION_STRUCT(VkBindImageMemoryInfoKHR); DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationConservativeStateCreateInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPipelineTessellationDomainOriginStateCreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkImageViewUsageCreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkInputAttachmentAspectReference); +DECLARE_REFLECTION_STRUCT(VkRenderPassInputAttachmentAspectCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo); DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo); @@ -658,6 +662,9 @@ DECLARE_DESERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT); DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryInfoKHR); DECLARE_DESERIALISE_TYPE(VkBindImageMemoryInfoKHR); DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfoKHR); +DECLARE_DESERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfoKHR); DECLARE_REFLECTION_ENUM(VkFlagWithNoBits); DECLARE_REFLECTION_ENUM(VkQueueFlagBits); @@ -724,3 +731,4 @@ DECLARE_REFLECTION_ENUM(VkColorSpaceKHR); DECLARE_REFLECTION_ENUM(VkPresentModeKHR); DECLARE_REFLECTION_ENUM(VkDescriptorUpdateTemplateType); DECLARE_REFLECTION_ENUM(VkConservativeRasterizationModeEXT); +DECLARE_REFLECTION_ENUM(VkTessellationDomainOriginKHR); \ No newline at end of file diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index a2f1113ae..ab56f000c 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -637,6 +637,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_KHR_MAINTENANCE1_EXTENSION_NAME, VK_KHR_MAINTENANCE1_SPEC_VERSION, }, + { + VK_KHR_MAINTENANCE2_EXTENSION_NAME, VK_KHR_MAINTENANCE2_SPEC_VERSION, + }, { VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index c97f8cace..a515a6244 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -298,6 +298,7 @@ CheckExt(NV_external_memory_win32, VKXX); \ CheckExt(NV_win32_keyed_mutex, VKXX); \ CheckExt(KHR_maintenance1, VK11); \ + CheckExt(KHR_maintenance2, VK11); \ CheckExt(EXT_display_control, VKXX); \ CheckExt(KHR_external_memory, VK11); \ CheckExt(KHR_external_memory_win32, VKXX); \ diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index ce11034f5..bc950cd6c 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -228,6 +228,15 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk else patchControlPoints = 0; + tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; + + const VkPipelineTessellationDomainOriginStateCreateInfoKHR *tessDomain = + (const VkPipelineTessellationDomainOriginStateCreateInfoKHR *)FindNextStruct( + pCreateInfo->pTessellationState, + VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO); + if(tessDomain) + tessellationDomainOrigin = tessDomain->domainOrigin; + if(pCreateInfo->pViewportState) viewportCount = pCreateInfo->pViewportState->viewportCount; else @@ -421,6 +430,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk patchControlPoints = 0; + tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; + viewportCount = 0; // VkPipelineRasterStateCreateInfo diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index fe138867d..874009475 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -174,6 +174,9 @@ struct VulkanCreationInfo // VkPipelineTessellationStateCreateInfo uint32_t patchControlPoints; + // VkPipelineTessellationDomainOriginStateCreateInfoKHR + VkTessellationDomainOriginKHR tessellationDomainOrigin; + // VkPipelineViewportStateCreateInfo uint32_t viewportCount; vector viewports; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 1bc5b94b1..23ff840e7 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -910,6 +910,9 @@ void VulkanReplay::SavePipelineState() // Tessellation m_VulkanPipelineState.tessellation.numControlPoints = p.patchControlPoints; + m_VulkanPipelineState.tessellation.domainOriginUpperLeft = + p.tessellationDomainOrigin == VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; + // Viewport/Scissors size_t numViewScissors = p.viewportCount; m_VulkanPipelineState.viewportScissor.viewportScissors.resize(numViewScissors); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 6fd73d2dc..ff2ccb08a 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -120,51 +120,58 @@ void DoSerialiseViaResourceId(SerialiserType &ser, type &el) SERIALISE_VK_HANDLES(); // pNext structure type dispatch -#define HANDLE_PNEXT() \ - /* we can ignore all external memory extension structs entirely. We don't need to */ \ - /* serialise or replay it as we won't actually use external memory and will just create */ \ - /* normal memory to replay with. */ \ - \ - /* VK_NV_external_memory / VK_NV_external_memory_win32 */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV) \ - \ - /* VK_NV_win32_keyed_mutex */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV) \ - \ - /* VK_KHR_external_memory / ..._fd / .._win32 */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR) \ - \ - /* VK_KHR_external_semaphore / .._fd / ..._win32 */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \ - \ - /* we don't create real swapchains on replay, so we can ignore surface counters */ \ - /* VK_EXT_display_control */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT) \ - \ - /* for now we don't serialise dedicated memory on replay as it's only a performance */ \ - /* hint, and is only required in conjunction with shared memory (which we don't */ \ - /* replay). In future it might be helpful to serialise this for informational purposes. */ \ - \ - /* VK_NV_dedicated_allocation */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV) \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV) \ - \ - /* VK_KHR_dedicated_allocation */ \ - PNEXT_IGNORE(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR) \ - \ - /* VK_EXT_conservative_rasterization */ \ - PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \ - VkPipelineRasterizationConservativeStateCreateInfoEXT) +#define HANDLE_PNEXT() \ + /* we can ignore all external memory extension structs entirely. We don't need to */ \ + /* serialise or replay it as we won't actually use external memory and will just create */ \ + /* normal memory to replay with. */ \ + \ + /* VK_NV_external_memory / VK_NV_external_memory_win32 */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV) \ + \ + /* VK_NV_win32_keyed_mutex */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV) \ + \ + /* VK_KHR_external_memory / ..._fd / .._win32 */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR) \ + \ + /* VK_KHR_external_semaphore / .._fd / ..._win32 */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \ + \ + /* we don't create real swapchains on replay, so we can ignore surface counters */ \ + /* VK_EXT_display_control */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT) \ + \ + /* for now we don't serialise dedicated memory on replay as it's only a performance */ \ + /* hint, and is only required in conjunction with shared memory (which we don't */ \ + /* replay). In future it might be helpful to serialise this for informational purposes. */ \ + \ + /* VK_NV_dedicated_allocation */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV) \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV) \ + \ + /* VK_KHR_dedicated_allocation */ \ + PNEXT_IGNORE(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR) \ + \ + /* VK_EXT_conservative_rasterization */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \ + VkPipelineRasterizationConservativeStateCreateInfoEXT) \ + \ + /* VK_KHR_maintenance2 */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR, \ + VkPipelineTessellationDomainOriginStateCreateInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, VkImageViewUsageCreateInfoKHR) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR, \ + VkRenderPassInputAttachmentAspectCreateInfoKHR) template static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext) @@ -1981,7 +1988,7 @@ void DoSerialise(SerialiserType &ser, VkClearRect &el) template void DoSerialise(SerialiserType &ser, VkClearAttachment &el) { - SERIALISE_MEMBER(aspectMask); + SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask); SERIALISE_MEMBER(colorAttachment); SERIALISE_MEMBER(clearValue); } @@ -2230,6 +2237,63 @@ void Deserialise(const VkPipelineRasterizationConservativeStateCreateInfoEXT &el DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPipelineTessellationDomainOriginStateCreateInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(domainOrigin); +} + +template <> +void Deserialise(const VkPipelineTessellationDomainOriginStateCreateInfoKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkImageViewUsageCreateInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER_TYPED(VkImageUsageFlagBits, usage); +} + +template <> +void Deserialise(const VkImageViewUsageCreateInfoKHR &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkInputAttachmentAspectReference &el) +{ + SERIALISE_MEMBER(subpass); + SERIALISE_MEMBER(inputAttachmentIndex); + SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask); +} + +template +void DoSerialise(SerialiserType &ser, VkRenderPassInputAttachmentAspectCreateInfoKHR &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(aspectReferenceCount); + SERIALISE_MEMBER_ARRAY(pAspectReferences, aspectReferenceCount); +} + +template <> +void Deserialise(const VkRenderPassInputAttachmentAspectCreateInfoKHR &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pAspectReferences; +} + INSTANTIATE_SERIALISE_TYPE(VkOffset2D); INSTANTIATE_SERIALISE_TYPE(VkExtent2D); INSTANTIATE_SERIALISE_TYPE(VkMemoryType); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index ad8bb7f92..76b69c155 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -1700,6 +1700,17 @@ std::string DoStringise(const VkConservativeRasterizationModeEXT &el) END_ENUM_STRINGISE(); } +template <> +std::string DoStringise(const VkTessellationDomainOriginKHR &el) +{ + BEGIN_ENUM_STRINGISE(VkTessellationDomainOriginKHR); + { + STRINGISE_ENUM(VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT) + STRINGISE_ENUM(VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT) + } + END_ENUM_STRINGISE(); +} + template <> std::string DoStringise(const VkExtent3D &el) { diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 7fa83708d..b6e7d41b2 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -1871,8 +1871,9 @@ template void DoSerialise(SerialiserType &ser, VKPipe::Tessellation &el) { SERIALISE_MEMBER(numControlPoints); + SERIALISE_MEMBER(domainOriginUpperLeft); - SIZE_CHECK(4); + SIZE_CHECK(8); } template