diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index e78a90c72..31cc6b615 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -1051,6 +1051,9 @@ QVariantList VulkanPipelineStateViewer::makeSampler(const QString &bindset, cons .arg(ToQStr(descriptor.swizzle.alpha)); } + if(!descriptor.seamless) + addressing += tr(" Non-Seamless"); + if(descriptor.ycbcrSampler != ResourceId()) { obj += lit(" ") + ToQStr(descriptor.ycbcrSampler); diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index b17fe434d..442ca870c 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -48,7 +48,7 @@ struct BindingElement addressW == o.addressW && mipBias == o.mipBias && maxAnisotropy == o.maxAnisotropy && compareFunction == o.compareFunction && minLOD == o.minLOD && maxLOD == o.maxLOD && borderColor == o.borderColor && unnormalized == o.unnormalized && - srgbBorder == o.srgbBorder; + srgbBorder == o.srgbBorder && seamless == o.seamless; } bool operator<(const BindingElement &o) const { @@ -106,6 +106,8 @@ struct BindingElement return unnormalized < o.unnormalized; if(!(srgbBorder == o.srgbBorder)) return srgbBorder < o.srgbBorder; + if(!(seamless == o.seamless)) + return seamless < o.seamless; return false; } @@ -202,6 +204,9 @@ information for border colors. DOCUMENT("``True`` if this is an inline uniform block binding."); bool inlineBlock = false; + DOCUMENT("``True`` if this sampler is seamless across cubemap boundaries (the default)."); + bool seamless = true; + DOCUMENT(R"(For samplers - the :class:`ResourceId` of the ycbcr conversion object associated with this sampler. )"); diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 26a651b03..cc87f4134 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -70,6 +70,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_metal_surface` * `VK_EXT_multisampled_render_to_single_sampled` * `VK_EXT_mutable_descriptor_type` +* `VK_EXT_non_seamless_cube_map` * `VK_EXT_pageable_device_local_memory` * `VK_EXT_pci_bus_info` * `VK_EXT_pipeline_creation_cache_control` @@ -259,7 +260,6 @@ Ray tracing extensions are now standard and will likely be supported at some poi * `VK_EXT_mesh_shader` * `VK_EXT_metal_objects` * `VK_EXT_multi_draw` -* `VK_EXT_non_seamless_cube_map` * `VK_EXT_opacity_micromap` * `VK_EXT_physical_device_drm` * `VK_EXT_pipeline_protected_access` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 49308eac5..ee1341070 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1199,6 +1199,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultisampledRenderToSingleSampledFeatu DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePCIBusInfoPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePerformanceQueryFeaturesKHR); @@ -1598,6 +1599,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultisampledRenderToSingleSampledFeatur DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePerformanceQueryFeaturesKHR); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index a8070ccc3..d1be23f71 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1035,6 +1035,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION, }, + { + VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION, + }, { VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index c3deb4afd..d0bfc79b0 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1984,6 +1984,10 @@ void VulkanCreationInfo::Sampler::Init(VulkanResourceManager *resourceMan, Vulka borderColor = pCreateInfo->borderColor; unnormalizedCoordinates = pCreateInfo->unnormalizedCoordinates != 0; + seamless = true; + if((pCreateInfo->flags & VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT) != 0) + seamless = false; + reductionMode = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE; const VkSamplerReductionModeCreateInfo *reduction = diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 4b7344a45..f292610e6 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -682,6 +682,9 @@ struct VulkanCreationInfo // VkSamplerBorderColorComponentMappingCreateInfoEXT VkComponentMapping componentMapping; bool srgbBorder; + + // VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT + bool seamless; }; std::unordered_map m_Sampler; diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 901f7bfd9..23bebcc00 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -334,6 +334,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceMultiviewProperties); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, \ VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, \ + VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, \ VkPhysicalDeviceLineRasterizationFeaturesEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, \ @@ -915,7 +917,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV: \ diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2ac82e028..e244a1a5f 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -2094,6 +2094,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) el.maxLOD = sampl.maxLod; MakeBorderColor(sampl.borderColor, el.borderColor); el.unnormalized = sampl.unnormalizedCoordinates; + el.seamless = sampl.seamless; if(sampl.ycbcr != ResourceId()) { diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index bdf73421e..292d5c6fb 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -757,6 +757,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, \ VkMutableDescriptorTypeCreateInfoEXT) \ \ + /* VK_EXT_non_seamless_cube_map */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT, \ + VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT) \ + \ /* VK_EXT_pageable_device_local_memory */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT, \ VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT) \ @@ -1495,9 +1499,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT) \ \ - /* VK_EXT_non_seamless_cube_map */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT) \ - \ /* VK_EXT_opacity_micromap */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT) \ @@ -9601,6 +9602,22 @@ void Deserialise(const VkDeviceMemoryOverallocationCreateInfoAMD &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(nonSeamlessCubeMap); +} + +template <> +void Deserialise(const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT &el) { @@ -11292,6 +11309,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultisampledRenderToSingleSampledFeat INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePerformanceQueryFeaturesKHR); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 814f02397..dd2b41150 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3044,6 +3044,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(borderColorSwizzleFromImage); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(nonSeamlessCubeMap); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp)