From 4a9212861ecb23a53d31e8bb740699765f4e0268 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 5 Feb 2019 17:08:44 +0000 Subject: [PATCH] Add support for VK_EXT_separate_stencil_usage --- renderdoc/driver/vulkan/vk_common.h | 2 + renderdoc/driver/vulkan/vk_core.cpp | 3 ++ renderdoc/driver/vulkan/vk_next_chains.cpp | 3 +- renderdoc/driver/vulkan/vk_serialise.cpp | 23 +++++++++-- .../vulkan/wrappers/vk_resource_funcs.cpp | 38 +++++++++++++++++++ 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 5d68018b9..076fb5599 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -653,6 +653,7 @@ DECLARE_REFLECTION_STRUCT(VkImageFormatProperties2); DECLARE_REFLECTION_STRUCT(VkImageMemoryBarrier); DECLARE_REFLECTION_STRUCT(VkImageMemoryRequirementsInfo2); DECLARE_REFLECTION_STRUCT(VkImagePlaneMemoryRequirementsInfo); +DECLARE_REFLECTION_STRUCT(VkImageStencilUsageCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkImageSparseMemoryRequirementsInfo2); DECLARE_REFLECTION_STRUCT(VkImageSwapchainCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT); @@ -865,6 +866,7 @@ DECLARE_DESERIALISE_TYPE(VkImageFormatProperties2); DECLARE_DESERIALISE_TYPE(VkImageMemoryBarrier); DECLARE_DESERIALISE_TYPE(VkImageMemoryRequirementsInfo2); DECLARE_DESERIALISE_TYPE(VkImagePlaneMemoryRequirementsInfo); +DECLARE_DESERIALISE_TYPE(VkImageStencilUsageCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkImageSparseMemoryRequirementsInfo2); DECLARE_DESERIALISE_TYPE(VkImageSwapchainCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkImageViewASTCDecodeModeEXT); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 3964417d4..582c3ed7a 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -696,6 +696,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION, }, + { + VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION, + }, { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index b9cca8c53..a381340ee 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -133,6 +133,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, VkImageFormatProperties2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, \ VkImagePlaneMemoryRequirementsInfo); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT, \ + VkImageStencilUsageCreateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, VkInstanceCreateInfo); \ @@ -450,7 +452,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: \ 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_STENCIL_USAGE_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: \ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: \ case VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 196d06f76..09c0c256b 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -493,6 +493,10 @@ SERIALISE_VK_HANDLES(); VkPhysicalDeviceSampleLocationsPropertiesEXT) \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT, VkMultisamplePropertiesEXT) \ \ + /* VK_EXT_separate_stencil_usage */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT, \ + VkImageStencilUsageCreateInfoEXT) \ + \ /* VK_EXT_transform_feedback */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, \ VkPhysicalDeviceTransformFeedbackFeaturesEXT) \ @@ -828,9 +832,6 @@ SERIALISE_VK_HANDLES(); /* VK_EXT_scalar_block_layout */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT) \ \ - /* VK_EXT_separate_stencil_usage */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT) \ - \ /* VK_EXT_validation_features */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT) \ \ @@ -4177,6 +4178,21 @@ void Deserialise(const VkMultisamplePropertiesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkImageStencilUsageCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(stencilUsage); +} + +template <> +void Deserialise(const VkImageStencilUsageCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceTransformFeedbackFeaturesEXT &el) { @@ -6185,6 +6201,7 @@ INSTANTIATE_SERIALISE_TYPE(VkImageFormatProperties2); INSTANTIATE_SERIALISE_TYPE(VkImageMemoryBarrier); INSTANTIATE_SERIALISE_TYPE(VkImageMemoryRequirementsInfo2); INSTANTIATE_SERIALISE_TYPE(VkImagePlaneMemoryRequirementsInfo); +INSTANTIATE_SERIALISE_TYPE(VkImageStencilUsageCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkImageSparseMemoryRequirementsInfo2); INSTANTIATE_SERIALISE_TYPE(VkImageSwapchainCreateInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkImageViewASTCDecodeModeEXT); diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 471d8cbf9..69f8aa06b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1357,6 +1357,23 @@ bool WrappedVulkan::Serialise_vkCreateImage(SerialiserType &ser, VkDevice device APIProps.SparseResources = true; } + // we search for the separate stencil usage struct now that it's in patchable memory + VkImageStencilUsageCreateInfoEXT *separateStencilUsage = + (VkImageStencilUsageCreateInfoEXT *)FindNextStruct( + &CreateInfo, VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT); + if(separateStencilUsage) + { + separateStencilUsage->stencilUsage |= VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT; + separateStencilUsage->stencilUsage &= ~VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; + + if(CreateInfo.samples != VK_SAMPLE_COUNT_1_BIT) + { + separateStencilUsage->stencilUsage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + } + } + VkImageCreateInfo patched = CreateInfo; byte *tempMem = GetTempMemory(GetNextPatchSize(patched.pNext)); @@ -1487,6 +1504,27 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * UnwrapNextChain(m_State, "VkImageCreateInfo", tempMem, (VkBaseInStructure *)&createInfo_adjusted); + // we search for the separate stencil usage struct now that it's in patchable memory + VkImageStencilUsageCreateInfoEXT *separateStencilUsage = + (VkImageStencilUsageCreateInfoEXT *)FindNextStruct( + &createInfo_adjusted, VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT); + if(separateStencilUsage) + { + separateStencilUsage->stencilUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + + if(IsCaptureMode(m_State)) + { + createInfo_adjusted.usage |= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + createInfo_adjusted.usage &= ~VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; + } + + if(createInfo_adjusted.samples != VK_SAMPLE_COUNT_1_BIT) + { + separateStencilUsage->stencilUsage |= + VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + } + } + VkResult ret; SERIALISE_TIME_CALL( ret = ObjDisp(device)->CreateImage(Unwrap(device), &createInfo_adjusted, pAllocator, pImage));