diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 3c7eb71f2..d4deac623 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -618,8 +618,11 @@ DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationImageCreateInfoNV); DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationMemoryAllocateInfoNV); DECLARE_REFLECTION_STRUCT(VkDescriptorPoolCreateInfo); DECLARE_REFLECTION_STRUCT(VkDescriptorSetAllocateInfo); +DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutBindingFlagsCreateInfoEXT) DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutCreateInfo); DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutSupport); +DECLARE_REFLECTION_STRUCT(VkDescriptorSetVariableDescriptorCountAllocateInfoEXT) +DECLARE_REFLECTION_STRUCT(VkDescriptorSetVariableDescriptorCountLayoutSupportEXT) DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateCreateInfo); DECLARE_REFLECTION_STRUCT(VkDeviceCreateInfo); DECLARE_REFLECTION_STRUCT(VkDeviceEventInfoEXT); @@ -696,6 +699,8 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceConditionalRenderingFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceConservativeRasterizationPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDepthClipEnableFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDepthStencilResolvePropertiesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDescriptorIndexingFeaturesEXT) +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDescriptorIndexingPropertiesEXT) DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDiscardRectanglePropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDriverPropertiesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceExternalBufferInfo); @@ -843,8 +848,11 @@ DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV); DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV); DECLARE_DESERIALISE_TYPE(VkDescriptorPoolCreateInfo); DECLARE_DESERIALISE_TYPE(VkDescriptorSetAllocateInfo); +DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutBindingFlagsCreateInfoEXT) DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo); DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutSupport); +DECLARE_DESERIALISE_TYPE(VkDescriptorSetVariableDescriptorCountAllocateInfoEXT) +DECLARE_DESERIALISE_TYPE(VkDescriptorSetVariableDescriptorCountLayoutSupportEXT) DECLARE_DESERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo); DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo); DECLARE_DESERIALISE_TYPE(VkDeviceEventInfoEXT); @@ -920,6 +928,8 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceConditionalRenderingFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceConservativeRasterizationPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDepthClipEnableFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDepthStencilResolvePropertiesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDescriptorIndexingFeaturesEXT) +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDescriptorIndexingPropertiesEXT) DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDiscardRectanglePropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDriverPropertiesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceExternalBufferInfo); @@ -1173,6 +1183,7 @@ DECLARE_REFLECTION_ENUM(VkDebugReportFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkDebugUtilsMessageSeverityFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkDebugUtilsMessageTypeFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkDependencyFlagBits); +DECLARE_REFLECTION_ENUM(VkDescriptorBindingFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkDescriptorPoolCreateFlagBits); DECLARE_REFLECTION_ENUM(VkDescriptorSetLayoutCreateFlagBits); DECLARE_REFLECTION_ENUM(VkDescriptorType); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 172347aeb..bd3cc66ef 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -660,6 +660,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION, }, + { + VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, + }, { VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 200930cbf..9fa2185b6 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -99,7 +99,13 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, \ VkDedicatedAllocationImageCreateInfoNV); \ COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, VkDescriptorPoolCreateInfo); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, \ + VkDescriptorSetLayoutBindingFlagsCreateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT, VkDescriptorSetLayoutSupport); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT, \ + VkDescriptorSetVariableDescriptorCountAllocateInfoEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT, \ + VkDescriptorSetVariableDescriptorCountLayoutSupportEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, VkDeviceCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO, VkDeviceGroupBindSparseInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, \ @@ -164,6 +170,10 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceDepthClipEnableFeaturesEXT) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR, \ VkPhysicalDeviceDepthStencilResolvePropertiesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, \ + VkPhysicalDeviceDescriptorIndexingFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, \ + VkPhysicalDeviceDescriptorIndexingPropertiesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, \ VkPhysicalDeviceDiscardRectanglePropertiesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR, \ @@ -452,9 +462,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX: \ case VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT: \ - case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT: \ case VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX: \ case VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX: \ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: \ @@ -482,8 +489,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 099e51e54..bfc9f5136 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -153,6 +153,7 @@ DECL_VKFLAG_EXT(VkSurfaceTransform, KHR); DECL_VKFLAG_EXT(VkSwapchainCreate, KHR); DECL_VKFLAG_EMPTY_EXT(VkValidationCacheCreate, EXT); DECL_VKFLAG_EMPTY_EXT(VkPipelineRasterizationDepthClipStateCreate, EXT); +DECL_VKFLAG_EXT(VkDescriptorBinding, EXT); // 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 @@ -160,6 +161,9 @@ DECL_VKFLAG_EMPTY_EXT(VkPipelineRasterizationDepthClipStateCreate, EXT); #define SERIALISE_MEMBER_VKFLAGS(flagstype, name) \ SERIALISE_MEMBER_TYPED(CONCAT(flagstype, Bits), name).TypedAs(STRINGIZE(flagstype)) +#define SERIALISE_MEMBER_ARRAY_VKFLAGS(flagstype, name, count) \ + SERIALISE_MEMBER_ARRAY_TYPED(CONCAT(flagstype, Bits), name, count).TypedAs(STRINGIZE(flagstype)) + // simple way to express "resources referenced from this struct don't have to be present." // since this is used during read when the processing is single-threaded, we make it a static // flag. @@ -462,6 +466,18 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT, \ VkPipelineRasterizationDepthClipStateCreateInfoEXT) \ \ + /* VK_EXT_descriptor_indexing */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, \ + VkDescriptorSetLayoutBindingFlagsCreateInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, \ + VkPhysicalDeviceDescriptorIndexingFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, \ + VkPhysicalDeviceDescriptorIndexingPropertiesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT, \ + VkDescriptorSetVariableDescriptorCountAllocateInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT, \ + VkDescriptorSetVariableDescriptorCountLayoutSupportEXT) \ + \ /* VK_EXT_discard_rectangles */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, \ VkPhysicalDeviceDiscardRectanglePropertiesEXT) \ @@ -834,13 +850,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT) \ \ - /* VK_EXT_descriptor_indexing */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT) \ - \ /* VK_EXT_external_memory_host */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT) \ @@ -5187,6 +5196,131 @@ void Deserialise(const VkFenceGetFdInfoKHR &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkDescriptorSetLayoutBindingFlagsCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(bindingCount); + SERIALISE_MEMBER_ARRAY_VKFLAGS(VkDescriptorBindingFlagsEXT, pBindingFlags, bindingCount); +} + +template <> +void Deserialise(const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pBindingFlags; +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceDescriptorIndexingFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(shaderInputAttachmentArrayDynamicIndexing); + SERIALISE_MEMBER(shaderUniformTexelBufferArrayDynamicIndexing); + SERIALISE_MEMBER(shaderStorageTexelBufferArrayDynamicIndexing); + SERIALISE_MEMBER(shaderUniformBufferArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderSampledImageArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderStorageBufferArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderStorageImageArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderInputAttachmentArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderUniformTexelBufferArrayNonUniformIndexing); + SERIALISE_MEMBER(shaderStorageTexelBufferArrayNonUniformIndexing); + SERIALISE_MEMBER(descriptorBindingUniformBufferUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingSampledImageUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingStorageImageUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingStorageBufferUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingUniformTexelBufferUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingStorageTexelBufferUpdateAfterBind); + SERIALISE_MEMBER(descriptorBindingUpdateUnusedWhilePending); + SERIALISE_MEMBER(descriptorBindingPartiallyBound); + SERIALISE_MEMBER(descriptorBindingVariableDescriptorCount); + SERIALISE_MEMBER(runtimeDescriptorArray); +} + +template <> +void Deserialise(const VkPhysicalDeviceDescriptorIndexingFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceDescriptorIndexingPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(maxUpdateAfterBindDescriptorsInAllPools); + SERIALISE_MEMBER(shaderUniformBufferArrayNonUniformIndexingNative); + SERIALISE_MEMBER(shaderSampledImageArrayNonUniformIndexingNative); + SERIALISE_MEMBER(shaderStorageBufferArrayNonUniformIndexingNative); + SERIALISE_MEMBER(shaderStorageImageArrayNonUniformIndexingNative); + SERIALISE_MEMBER(shaderInputAttachmentArrayNonUniformIndexingNative); + SERIALISE_MEMBER(robustBufferAccessUpdateAfterBind); + SERIALISE_MEMBER(quadDivergentImplicitLod); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindSamplers); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindUniformBuffers); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindStorageBuffers); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindSampledImages); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindStorageImages); + SERIALISE_MEMBER(maxPerStageDescriptorUpdateAfterBindInputAttachments); + SERIALISE_MEMBER(maxPerStageUpdateAfterBindResources); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindSamplers); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindUniformBuffers); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindUniformBuffersDynamic); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindStorageBuffers); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindStorageBuffersDynamic); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindSampledImages); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindStorageImages); + SERIALISE_MEMBER(maxDescriptorSetUpdateAfterBindInputAttachments); +} + +template <> +void Deserialise(const VkPhysicalDeviceDescriptorIndexingPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkDescriptorSetVariableDescriptorCountAllocateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(descriptorSetCount); + SERIALISE_MEMBER_ARRAY(pDescriptorCounts, descriptorSetCount); +} + +template <> +void Deserialise(const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pDescriptorCounts; +} + +template +void DoSerialise(SerialiserType &ser, VkDescriptorSetVariableDescriptorCountLayoutSupportEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(maxVariableDescriptorCount); +} + +template <> +void Deserialise(const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceDiscardRectanglePropertiesEXT &el) { @@ -6467,8 +6601,11 @@ INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV); INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV); INSTANTIATE_SERIALISE_TYPE(VkDescriptorPoolCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetAllocateInfo); +INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutBindingFlagsCreateInfoEXT) INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutSupport); +INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetVariableDescriptorCountAllocateInfoEXT) +INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetVariableDescriptorCountLayoutSupportEXT) INSTANTIATE_SERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkDeviceCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkDeviceEventInfoEXT); @@ -6545,6 +6682,8 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceConditionalRenderingFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceConservativeRasterizationPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDepthStencilResolvePropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDepthClipEnableFeaturesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDescriptorIndexingFeaturesEXT) +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDescriptorIndexingPropertiesEXT) INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDiscardRectanglePropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDriverPropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceExternalBufferInfo); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index d7ed37ff1..56bbdf8e5 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -2448,6 +2448,19 @@ std::string DoStringise(const VkPipelineCreationFeedbackFlagBitsEXT &el) END_BITFIELD_STRINGISE(); } +template <> +std::string DoStringise(const VkDescriptorBindingFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkDescriptorBindingFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) + STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT) + STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT) + STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT) + } + END_BITFIELD_STRINGISE(); +} + template <> std::string DoStringise(const VkExtent3D &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index adc15b66b..e3a07ed55 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1759,6 +1759,8 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi return false; \ } + VkPhysicalDeviceDescriptorIndexingFeaturesEXT descIndexingFeatures = {}; + if(ObjDisp(physicalDevice)->GetPhysicalDeviceFeatures2) { BEGIN_PHYS_EXT_CHECK(VkPhysicalDevice8BitStorageFeaturesKHR, @@ -1927,6 +1929,34 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi } } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceDescriptorIndexingFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT); + { + descIndexingFeatures = *ext; + + CHECK_PHYS_EXT_FEATURE(shaderInputAttachmentArrayDynamicIndexing); + CHECK_PHYS_EXT_FEATURE(shaderUniformTexelBufferArrayDynamicIndexing); + CHECK_PHYS_EXT_FEATURE(shaderStorageTexelBufferArrayDynamicIndexing); + CHECK_PHYS_EXT_FEATURE(shaderUniformBufferArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderSampledImageArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderStorageBufferArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderStorageImageArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderInputAttachmentArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderUniformTexelBufferArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(shaderStorageTexelBufferArrayNonUniformIndexing); + CHECK_PHYS_EXT_FEATURE(descriptorBindingUniformBufferUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingSampledImageUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingStorageImageUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingStorageBufferUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingUniformTexelBufferUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingStorageTexelBufferUpdateAfterBind); + CHECK_PHYS_EXT_FEATURE(descriptorBindingUpdateUnusedWhilePending); + CHECK_PHYS_EXT_FEATURE(descriptorBindingPartiallyBound); + CHECK_PHYS_EXT_FEATURE(descriptorBindingVariableDescriptorCount); + CHECK_PHYS_EXT_FEATURE(runtimeDescriptorArray); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp) @@ -1947,12 +1977,44 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi "geometryShader = false, lit mesh rendering will not be available if rendering on this " "device."); - if(availFeatures.robustBufferAccess) - enabledFeatures.robustBufferAccess = true; - else + bool descIndexingAllowsRBA = true; + + if(descIndexingFeatures.descriptorBindingUniformBufferUpdateAfterBind || + descIndexingFeatures.descriptorBindingStorageBufferUpdateAfterBind || + descIndexingFeatures.descriptorBindingUniformTexelBufferUpdateAfterBind || + descIndexingFeatures.descriptorBindingStorageTexelBufferUpdateAfterBind) + { + // if any update after bind feature is enabled, check robustBufferAccessUpdateAfterBind + VkPhysicalDeviceDescriptorIndexingPropertiesEXT descIndexingProps = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, + }; + + VkPhysicalDeviceProperties2 availBase = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; + availBase.pNext = &descIndexingProps; + ObjDisp(physicalDevice)->GetPhysicalDeviceProperties2(Unwrap(physicalDevice), &availBase); + + descIndexingAllowsRBA = descIndexingProps.robustBufferAccessUpdateAfterBind != VK_FALSE; + } + + if(availFeatures.robustBufferAccess && !descIndexingAllowsRBA) + { + // if the feature is available but we can't use it, warn RDCWARN( - "robustBufferAccess = false, out of bounds access due to bugs in application or " - "RenderDoc may cause crashes"); + "robustBufferAccess is available, but cannot be enabled due to " + "robustBufferAccessUpdateAfterBind not being avilable and some UpdateAfterBind features " + "being enabled. " + "out of bounds access due to bugs in application or RenderDoc may cause crashes"); + } + else + { + // either the feature is available, and we enable it, or it's not available at all. + if(availFeatures.robustBufferAccess) + enabledFeatures.robustBufferAccess = true; + else + RDCWARN( + "robustBufferAccess = false, out of bounds access due to bugs in application or " + "RenderDoc may cause crashes"); + } if(availFeatures.shaderInt64) enabledFeatures.shaderInt64 = true; diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index f89f5904e..fbb8f29cd 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -2020,6 +2020,18 @@ struct ScopedDeserialiseArray #define SERIALISE_MEMBER_ARRAY(arrayObj, countObj) \ ser.Serialise(#arrayObj, el.arrayObj, el.countObj, SerialiserFlags::AllocateMemory) +#define SERIALISE_MEMBER_ARRAY_TYPED(type, arrayObj, countObj) \ + if(ser.IsReading()) \ + el.arrayObj = NULL; \ + union \ + { \ + type **t; \ + decltype(el.arrayObj) *o; \ + } CONCAT(union, __LINE__); \ + CONCAT(union, __LINE__).o = &el.arrayObj; \ + ser.template Serialise(#arrayObj, *CONCAT(union, __LINE__).t, el.countObj, \ + SerialiserFlags::AllocateMemory) + // a member that is a pointer and could be NULL, so needs a hidden 'present' // flag serialised out #define SERIALISE_MEMBER_OPT(obj) ser.SerialiseNullable(#obj, el.obj)