diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 31cc6b615..6b8fa5a21 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -611,6 +611,16 @@ void VulkanPipelineStateViewer::setEmptyRow(RDTreeWidgetItem *node) node->setForegroundColor(QColor(0, 0, 0)); } +float minLOD(const VKPipe::Attachment &view) +{ + return 0.0f; +} + +float minLOD(const VKPipe::BindingElement &view) +{ + return view.minLOD; +} + template bool VulkanPipelineStateViewer::setViewDetails(RDTreeWidgetItem *node, const bindType &view, TextureDescription *tex, bool stageBitsIncluded, @@ -684,6 +694,11 @@ bool VulkanPipelineStateViewer::setViewDetails(RDTreeWidgetItem *node, const bin } } + if(minLOD(view) != 0.0f) + { + text += tr("Clamped to a minimum LOD of %1\n").arg(minLOD(view)); + } + if(includeSampleLocations && state.multisample.rasterSamples > 1 && !state.multisample.sampleLocations.customLocations.isEmpty()) { diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 442ca870c..ac5f26da2 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -179,7 +179,7 @@ set's inline block data. float maxAnisotropy = 0.0f; DOCUMENT("For samplers - the :class:`CompareFunction` for comparison samplers."); CompareFunction compareFunction = CompareFunction::AlwaysTrue; - DOCUMENT("For samplers - the minimum mip level that can be used."); + DOCUMENT("For samplers and image views - the minimum mip level that can be used."); float minLOD = 0.0f; DOCUMENT("For samplers - the maximum mip level that can be used."); float maxLOD = 0.0f; diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 2957ce547..5317f0580 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -62,6 +62,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_headless_surface` * `VK_EXT_host_query_reset` * `VK_EXT_image_robustness` +* `VK_EXT_image_view_min_lod` * `VK_EXT_index_type_uint8` * `VK_EXT_inline_uniform_block` * `VK_EXT_line_rasterization` @@ -255,7 +256,6 @@ Ray tracing extensions are now standard and will likely be supported at some poi * `VK_EXT_image_compression_control` * `VK_EXT_image_compression_control_swapchain` * `VK_EXT_image_drm_format_modifier` -* `VK_EXT_image_view_min_lod` * `VK_EXT_legacy_dithering` * `VK_EXT_mesh_shader` * `VK_EXT_metal_objects` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 17a00e10c..81fbf1141 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1106,6 +1106,7 @@ DECLARE_REFLECTION_STRUCT(VkImageSwapchainCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT); DECLARE_REFLECTION_STRUCT(VkImageViewCreateInfo); DECLARE_REFLECTION_STRUCT(VkImageViewUsageCreateInfo); +DECLARE_REFLECTION_STRUCT(VkImageViewMinLodCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkImportFenceFdInfoKHR); DECLARE_REFLECTION_STRUCT(VkImportMemoryFdInfoKHR); DECLARE_REFLECTION_STRUCT(VkImportSemaphoreFdInfoKHR); @@ -1185,6 +1186,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageFormatInfo2); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImagelessFramebufferFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageRobustnessFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageViewImageFormatInfoEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageViewMinLodFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceIndexTypeUint8FeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceInlineUniformBlockFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceInlineUniformBlockProperties); @@ -1510,6 +1512,7 @@ DECLARE_DESERIALISE_TYPE(VkImageSwapchainCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkImageViewASTCDecodeModeEXT); DECLARE_DESERIALISE_TYPE(VkImageViewCreateInfo); DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfo); +DECLARE_DESERIALISE_TYPE(VkImageViewMinLodCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkImportFenceFdInfoKHR); DECLARE_DESERIALISE_TYPE(VkImportMemoryFdInfoKHR); DECLARE_DESERIALISE_TYPE(VkImportSemaphoreFdInfoKHR); @@ -1586,6 +1589,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImagelessFramebufferFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageRobustnessFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageViewImageFormatInfoEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageViewMinLodFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceIndexTypeUint8FeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceInlineUniformBlockFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceInlineUniformBlockProperties); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index ad8d0b45b..f65c91062 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1008,6 +1008,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION, }, + { + VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME, VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION, + }, { VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index d0bfc79b0..31b3a93d2 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -2090,6 +2090,16 @@ void VulkanCreationInfo::ImageView::Init(VulkanResourceManager *resourceMan, Vul range.layerCount = info.m_Image[image].arrayLayers - range.baseArrayLayer; componentMapping = pCreateInfo->components; + + minLOD = 0.0f; + + const VkImageViewMinLodCreateInfoEXT *minLODInfo = + (const VkImageViewMinLodCreateInfoEXT *)FindNextStruct( + pCreateInfo, VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT); + if(minLODInfo) + { + minLOD = minLODInfo->minLod; + } } void VulkanCreationInfo::ShaderModule::Init(VulkanResourceManager *resourceMan, diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index f292610e6..929dc20bd 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -713,6 +713,9 @@ struct VulkanCreationInfo VkFormat format; VkImageSubresourceRange range; VkComponentMapping componentMapping; + + // VkImageViewMinLodCreateInfoEXT + float minLOD; }; std::unordered_map m_ImageView; diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 7a2bae9aa..984f7c626 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -183,6 +183,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, VkImageResolve2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO, VkImageStencilUsageCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT, VkImageViewMinLodCreateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, VkInstanceCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, VkMemoryAllocateFlagsInfo); \ @@ -312,6 +313,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceImageRobustnessFeatures) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, \ VkPhysicalDeviceIndexTypeUint8FeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, \ + VkPhysicalDeviceImageViewMinLodFeaturesEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, \ VkPhysicalDeviceInlineUniformBlockFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES, \ @@ -836,7 +839,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX: \ case VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX: \ - case VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM: \ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: \ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: \ @@ -903,7 +905,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT: \ diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index e244a1a5f..8f01cf6f7 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -2153,6 +2153,8 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) // temporary hack, store image layout enum in byteOffset as it's not used for images destSlots.binds[a].byteOffset = convert(srcel.imageLayout); + + destSlots.binds[a].minLOD = c.m_ImageView[viewid].minLOD; } else { @@ -2162,6 +2164,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) destSlots.binds[a].firstSlice = 0; destSlots.binds[a].numMips = 1; destSlots.binds[a].numSlices = 1; + destSlots.binds[a].minLOD = 0.0f; } } else if(descriptorType == DescriptorSlotType::UniformTexelBuffer || diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index a515301e8..cf555844a 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -724,6 +724,11 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, \ VkPhysicalDeviceImageRobustnessFeatures) \ \ + /* VK_EXT_image_view_min_lod */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT, \ + VkPhysicalDeviceImageViewMinLodFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT, VkImageViewMinLodCreateInfoEXT) \ + \ /* VK_EXT_index_type_uint8 */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, \ VkPhysicalDeviceIndexTypeUint8FeaturesEXT) \ @@ -1471,10 +1476,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT) \ \ - /* VK_EXT_image_view_min_lod */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT) \ - \ /* VK_EXT_legacy_dithering */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT) \ \ @@ -9336,6 +9337,37 @@ void Deserialise(const VkPhysicalDeviceIndexTypeUint8FeaturesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceImageViewMinLodFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(minLod); +} + +template <> +void Deserialise(const VkPhysicalDeviceImageViewMinLodFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkImageViewMinLodCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(minLod); +} + +template <> +void Deserialise(const VkImageViewMinLodCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceInlineUniformBlockFeatures &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 66be9d8f6..e4ad4a510 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3058,6 +3058,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(depthClampZeroOne); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceImageViewMinLodFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(minLod); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp)