diff --git a/renderdoc/driver/vulkan/official/vulkan_core.h b/renderdoc/driver/vulkan/official/vulkan_core.h index f41ccf4a4..7bfacbe91 100644 --- a/renderdoc/driver/vulkan/official/vulkan_core.h +++ b/renderdoc/driver/vulkan/official/vulkan_core.h @@ -44,7 +44,7 @@ extern "C" { #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 129 +#define VK_HEADER_VERSION 130 #define VK_NULL_HANDLE 0 @@ -518,6 +518,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = 1000241002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000, VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = 1000245000, VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000, @@ -9905,6 +9906,41 @@ VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT( #endif +#define VK_EXT_tooling_info 1 +#define VK_EXT_TOOLING_INFO_SPEC_VERSION 1 +#define VK_EXT_TOOLING_INFO_EXTENSION_NAME "VK_EXT_tooling_info" + +typedef enum VkToolPurposeFlagBitsEXT { + VK_TOOL_PURPOSE_VALIDATION_BIT_EXT = 0x00000001, + VK_TOOL_PURPOSE_PROFILING_BIT_EXT = 0x00000002, + VK_TOOL_PURPOSE_TRACING_BIT_EXT = 0x00000004, + VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT = 0x00000008, + VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT = 0x00000010, + VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT = 0x00000020, + VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT = 0x00000040, + VK_TOOL_PURPOSE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkToolPurposeFlagBitsEXT; +typedef VkFlags VkToolPurposeFlagsEXT; +typedef struct VkPhysicalDeviceToolPropertiesEXT { + VkStructureType sType; + void* pNext; + char name[VK_MAX_EXTENSION_NAME_SIZE]; + char version[VK_MAX_EXTENSION_NAME_SIZE]; + VkToolPurposeFlagsEXT purposes; + char description[VK_MAX_DESCRIPTION_SIZE]; + char layer[VK_MAX_EXTENSION_NAME_SIZE]; +} VkPhysicalDeviceToolPropertiesEXT; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolPropertiesEXT)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolPropertiesEXT* pToolProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolPropertiesEXT( + VkPhysicalDevice physicalDevice, + uint32_t* pToolCount, + VkPhysicalDeviceToolPropertiesEXT* pToolProperties); +#endif + + #define VK_EXT_separate_stencil_usage 1 #define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1 #define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage" diff --git a/renderdoc/driver/vulkan/renderdoc.json b/renderdoc/driver/vulkan/renderdoc.json index c97608f8c..305efb948 100644 --- a/renderdoc/driver/vulkan/renderdoc.json +++ b/renderdoc/driver/vulkan/renderdoc.json @@ -31,6 +31,11 @@ "vkCmdDebugMarkerEndEXT", "vkCmdDebugMarkerInsertEXT" ] + }, + { + "name": "VK_EXT_tooling_info", + "spec_version": "1", + "entrypoints": ["vkGetPhysicalDeviceToolPropertiesEXT"] } ], "enable_environment": { diff --git a/renderdoc/driver/vulkan/vk.xml b/renderdoc/driver/vulkan/vk.xml index 9d98e9d2b..1a3d613eb 100644 --- a/renderdoc/driver/vulkan/vk.xml +++ b/renderdoc/driver/vulkan/vk.xml @@ -154,7 +154,7 @@ server. // Vulkan 1.1 version number #define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 129 +#define VK_HEADER_VERSION 130 #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; @@ -339,6 +339,7 @@ typedef void CAMetalLayer; typedef VkFlags VkPipelineRasterizationStateStreamCreateFlagsEXT; typedef VkFlags VkPipelineRasterizationDepthClipStateCreateFlagsEXT; typedef VkFlags VkSwapchainImageUsageFlagsANDROID; + typedef VkFlags VkToolPurposeFlagsEXT; Types which can be void pointers or class pointers, selected at compile time VK_DEFINE_HANDLE(VkInstance) @@ -524,6 +525,7 @@ typedef void CAMetalLayer; + WSI extensions @@ -2851,7 +2853,7 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext - VkDeviceQueueCreateFlags flags + VkDeviceQueueCreateFlags flags uint32_t queueFamilyIndex uint32_t queueIndex @@ -4213,7 +4215,7 @@ typedef void CAMetalLayer; VkPipelineExecutableStatisticFormatKHR format VkPipelineExecutableStatisticValueKHR value - + VkStructureType sType void* pNext char name[VK_MAX_DESCRIPTION_SIZE] @@ -4302,6 +4304,15 @@ typedef void CAMetalLayer; void* pNext VkBool32 deviceCoherentMemory + + VkStructureType sType + void* pNext + char name[VK_MAX_EXTENSION_NAME_SIZE] + char version[VK_MAX_EXTENSION_NAME_SIZE] + VkToolPurposeFlagsEXT purposes + char description[VK_MAX_DESCRIPTION_SIZE] + char layer[VK_MAX_EXTENSION_NAME_SIZE] + Vulkan enumerant (token) definitions @@ -5632,6 +5643,13 @@ typedef void CAMetalLayer; + + + + + + + @@ -8010,6 +8028,12 @@ typedef void CAMetalLayer; uint32_t lineStippleFactor uint16_t lineStipplePattern + + VkResult vkGetPhysicalDeviceToolPropertiesEXT + VkPhysicalDevice physicalDevice + uint32_t* pToolCount + VkPhysicalDeviceToolPropertiesEXT* pToolProperties + @@ -10400,8 +10424,12 @@ typedef void CAMetalLayer; - + + + + + @@ -11452,10 +11480,25 @@ typedef void CAMetalLayer; - + - - + + + + + + + + + + + + + + + + + diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 947b8e181..b82dc2510 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -841,6 +841,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTimelineSemaphoreFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTimelineSemaphorePropertiesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceToolPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTransformFeedbackFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTransformFeedbackPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR); @@ -1114,6 +1115,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphorePropertiesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceToolPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR); @@ -1449,6 +1451,7 @@ DECLARE_REFLECTION_ENUM(VkSurfaceTransformFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkSwapchainCreateFlagBitsKHR); DECLARE_REFLECTION_ENUM(VkTessellationDomainOrigin); DECLARE_REFLECTION_ENUM(VkTimeDomainEXT); +DECLARE_REFLECTION_ENUM(VkToolPurposeFlagBitsEXT); DECLARE_REFLECTION_ENUM(VkValidationCheckEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureDisableEXT); DECLARE_REFLECTION_ENUM(VkValidationFeatureEnableEXT); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index a9d974a68..027dd779d 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -778,6 +778,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, }, + { + VK_EXT_TOOLING_INFO_EXTENSION_NAME, VK_EXT_TOOLING_INFO_SPEC_VERSION, + }, { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, }, @@ -1111,6 +1114,7 @@ static const VkExtensionProperties supportedExtensions[] = { // this is the list of extensions we provide - regardless of whether the ICD supports them static const VkExtensionProperties renderdocProvidedDeviceExtensions[] = { {VK_EXT_DEBUG_MARKER_EXTENSION_NAME, VK_EXT_DEBUG_MARKER_SPEC_VERSION}, + {VK_EXT_TOOLING_INFO_EXTENSION_NAME, VK_EXT_TOOLING_INFO_SPEC_VERSION}, }; static const VkExtensionProperties renderdocProvidedInstanceExtensions[] = { diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 62e8940fc..752a88cc6 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -2211,4 +2211,9 @@ public: uint64_t vkGetBufferOpaqueCaptureAddressKHR(VkDevice device, VkBufferDeviceAddressInfoKHR *pInfo); uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR(VkDevice device, VkDeviceMemoryOpaqueCaptureAddressInfoKHR *pInfo); + + // VK_EXT_tooling_info + + VkResult vkGetPhysicalDeviceToolPropertiesEXT(VkPhysicalDevice physicalDevice, uint32_t *pToolCount, + VkPhysicalDeviceToolPropertiesEXT *pToolProperties); }; diff --git a/renderdoc/driver/vulkan/vk_dispatch_defs.h b/renderdoc/driver/vulkan/vk_dispatch_defs.h index 10228123f..0f9f96de5 100644 --- a/renderdoc/driver/vulkan/vk_dispatch_defs.h +++ b/renderdoc/driver/vulkan/vk_dispatch_defs.h @@ -258,6 +258,9 @@ struct VkInstDispatchTable PFN_vkCreateMetalSurfaceEXT CreateMetalSurfaceEXT; #endif // VK_USE_PLATFORM_METAL_EXT + // VK_EXT_tooling_info + PFN_vkGetPhysicalDeviceToolPropertiesEXT GetPhysicalDeviceToolPropertiesEXT; + // VK_NV_cooperative_matrix PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV GetPhysicalDeviceCooperativeMatrixPropertiesNV; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 9c01e80e6..5d5293d8d 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -214,7 +214,7 @@ HookInitExtension(VK_KHR_xlib_surface, GetPhysicalDeviceXlibPresentationSupportKHR); \ HookInitExtension(VK_EXT_acquire_xlib_display, AcquireXlibDisplayEXT); \ HookInitExtension(VK_EXT_acquire_xlib_display, GetRandROutputDisplayEXT); -#define HookInitInstance_PlatformSpecific_XLib_PhysDev() \ +#define HookInitInstance_PlatformSpecific_Xlib_PhysDev() \ HookInitExtension(VK_KHR_xlib_surface, GetPhysicalDeviceXlibPresentationSupportKHR); \ HookInitExtension(VK_EXT_acquire_xlib_display, AcquireXlibDisplayEXT); \ HookInitExtension(VK_EXT_acquire_xlib_display, GetRandROutputDisplayEXT); @@ -233,8 +233,8 @@ #else #define HookInitInstance_PlatformSpecific_Xlib() +#define HookInitInstance_PlatformSpecific_Xlib_PhysDev() #define HookDefine_PlatformSpecific_Xlib() -#define HookInitInstance_PlatformSpecific_XLib_PhysDev() #endif @@ -484,7 +484,8 @@ DeclExt(GOOGLE_display_timing); \ DeclExt(KHR_timeline_semaphore); \ DeclExt(KHR_performance_query); \ - DeclExt(KHR_buffer_device_address); + DeclExt(KHR_buffer_device_address); \ + DeclExt(EXT_tooling_info); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -573,7 +574,8 @@ CheckExt(GOOGLE_display_timing, VKXX); \ CheckExt(KHR_timeline_semaphore, VKXX); \ CheckExt(KHR_performance_query, VKXX); \ - CheckExt(KHR_buffer_device_address, VKXX); + CheckExt(KHR_buffer_device_address, VKXX); \ + CheckExt(EXT_tooling_info, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -618,6 +620,7 @@ HookInitExtension(KHR_performance_query, \ EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR); \ HookInitExtension(KHR_performance_query, GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR); \ + HookInitExtension(EXT_tooling_info, GetPhysicalDeviceToolPropertiesEXT); \ HookInitInstance_PlatformSpecific_PhysDev() #define HookInitVulkanInstanceExts() \ @@ -678,6 +681,7 @@ HookInitExtension(KHR_performance_query, \ EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR); \ HookInitExtension(KHR_performance_query, GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR); \ + HookInitExtension(EXT_tooling_info, GetPhysicalDeviceToolPropertiesEXT); \ HookInitInstance_PlatformSpecific() #define HookInitVulkanDeviceExts() \ @@ -1393,4 +1397,6 @@ VkBufferDeviceAddressInfoKHR *, pInfo); \ HookDefine2(uint64_t, vkGetDeviceMemoryOpaqueCaptureAddressKHR, VkDevice, device, \ VkDeviceMemoryOpaqueCaptureAddressInfoKHR *, pInfo); \ + HookDefine3(VkResult, vkGetPhysicalDeviceToolPropertiesEXT, VkPhysicalDevice, physicalDevice, \ + uint32_t *, pToolCount, VkPhysicalDeviceToolPropertiesEXT *, pToolProperties); \ HookDefine_PlatformSpecific() diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 94a37b71e..e2a9738be 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -285,6 +285,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceTimelineSemaphoreFeaturesKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR, \ VkPhysicalDeviceTimelineSemaphorePropertiesKHR); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT, \ + VkPhysicalDeviceToolPropertiesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, \ VkPhysicalDeviceTransformFeedbackFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 7a655b9c6..6c2a9f6a5 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -155,6 +155,7 @@ DECL_VKFLAG_EMPTY_EXT(VkValidationCacheCreate, EXT); DECL_VKFLAG_EMPTY_EXT(VkPipelineRasterizationDepthClipStateCreate, EXT); DECL_VKFLAG_EXT(VkDescriptorBinding, EXT); DECL_VKFLAG_EXT(VkSemaphoreWait, KHR); +DECL_VKFLAG_EXT(VkToolPurpose, 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 @@ -627,6 +628,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, \ VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT) \ \ + /* VK_EXT_tooling_info */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT, \ + VkPhysicalDeviceToolPropertiesEXT) \ + \ /* VK_EXT_transform_feedback */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, \ VkPhysicalDeviceTransformFeedbackFeaturesEXT) \ @@ -5334,6 +5339,25 @@ void Deserialise(const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceToolPropertiesEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(name); + SERIALISE_MEMBER(version); + SERIALISE_MEMBER_VKFLAGS(VkToolPurposeFlagsEXT, purposes); + SERIALISE_MEMBER(description); + SERIALISE_MEMBER(layer); +} + +template <> +void Deserialise(const VkPhysicalDeviceToolPropertiesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPipelineSampleLocationsStateCreateInfoEXT &el) { @@ -7796,6 +7820,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphorePropertiesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceToolPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index ad5b39173..2fea37bbd 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -1715,6 +1715,7 @@ rdcstr DoStringise(const VkStructureType &el) STRINGISE_ENUM(VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR) STRINGISE_ENUM(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT) STRINGISE_ENUM(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT) + STRINGISE_ENUM(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT) STRINGISE_ENUM(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT) STRINGISE_ENUM(VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT) STRINGISE_ENUM(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV) @@ -2657,6 +2658,22 @@ rdcstr DoStringise(const VkSemaphoreWaitFlagBitsKHR &el) END_BITFIELD_STRINGISE(); } +template <> +rdcstr DoStringise(const VkToolPurposeFlagBitsEXT &el) +{ + BEGIN_BITFIELD_STRINGISE(VkToolPurposeFlagBitsEXT); + { + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_VALIDATION_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_PROFILING_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_TRACING_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT); + STRINGISE_BITFIELD_BIT(VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT); + } + END_BITFIELD_STRINGISE(); +} + template <> rdcstr DoStringise(const VkExtent3D &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 12833b5cc..ac888c56f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "../vk_core.h" +#include "api/replay/version.h" static char fakeRenderDocUUID[VK_UUID_SIZE + 1] = {}; @@ -722,3 +723,78 @@ uint64_t WrappedVulkan::vkGetDeviceMemoryOpaqueCaptureAddressKHR( unwrappedInfo.memory = Unwrap(unwrappedInfo.memory); return ObjDisp(device)->GetDeviceMemoryOpaqueCaptureAddressKHR(Unwrap(device), &unwrappedInfo); } + +VkResult WrappedVulkan::vkGetPhysicalDeviceToolPropertiesEXT( + VkPhysicalDevice physicalDevice, uint32_t *pToolCount, + VkPhysicalDeviceToolPropertiesEXT *pToolProperties) +{ + // check how many tools are downstream. The function pointer will be NULL if no-one else supports + // this extension except us. + uint32_t downstreamCount = 0; + if(ObjDisp(physicalDevice)->GetPhysicalDeviceToolPropertiesEXT != NULL) + ObjDisp(physicalDevice) + ->GetPhysicalDeviceToolPropertiesEXT(Unwrap(physicalDevice), &downstreamCount, NULL); + + // if we're just enumerating, pToolProperties is NULL, so set the tool count and return + if(pToolCount && pToolProperties == NULL) + { + *pToolCount = downstreamCount + 1; + return VK_SUCCESS; + } + + // otherwise we expect both to be non-NULL + if(pToolCount == NULL || pToolProperties == NULL) + return VK_INCOMPLETE; + + // this is how much space is in the array, don't forget it + uint32_t availableCount = *pToolCount; + + VkResult vkr = VK_SUCCESS; + + if(ObjDisp(physicalDevice)->GetPhysicalDeviceToolPropertiesEXT != NULL) + { + // call downstream to populate the array (up to what's available) + // this writes up to availableCount properties into pToolProperties, and sets the number written + // in pToolCount + vkr = ObjDisp(physicalDevice) + ->GetPhysicalDeviceToolPropertiesEXT(Unwrap(physicalDevice), pToolCount, + pToolProperties); + } + else + { + // nothing written downstream + *pToolCount = 0; + } + + // if available isn't enough, return VK_INCOMPLETE now + if(vkr == VK_INCOMPLETE || availableCount < downstreamCount + 1) + return VK_INCOMPLETE; + + // otherwise we write our own properties in after any downstream properties, then increment + // pToolCount + + VkPhysicalDeviceToolPropertiesEXT &props = *(pToolProperties + *pToolCount); + + const rdcstr name = "RenderDoc"_lit; + const rdcstr version = StringFormat::Fmt( + "%s (%s)", FULL_VERSION_STRING, GitVersionHash[0] == 'N' ? "Unknown revision" : GitVersionHash); + const rdcstr description = "Debugging capture layer for RenderDoc"_lit; + + RDCASSERTMSG("Name is too long for VkPhysicalDeviceToolPropertiesEXT", + name.length() < sizeof(props.name)); + RDCASSERTMSG("Version is too long for VkPhysicalDeviceToolPropertiesEXT", + version.length() < sizeof(props.version)); + RDCASSERTMSG("Description is too long for VkPhysicalDeviceToolPropertiesEXT", + description.length() < sizeof(props.description)); + + memcpy(props.name, name.c_str(), name.length() + 1); + memcpy(props.version, version.c_str(), version.length() + 1); + props.purposes = VK_TOOL_PURPOSE_TRACING_BIT_EXT | VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT | + VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT; + memcpy(props.description, description.c_str(), description.length() + 1); + // do not tell people about the layer + RDCEraseEl(props.layer); + + (*pToolCount)++; + return VK_SUCCESS; +} diff --git a/util/test/demos/3rdparty/volk/README.md b/util/test/demos/3rdparty/volk/README.md index bb5bb9b41..bc0ad4068 100644 --- a/util/test/demos/3rdparty/volk/README.md +++ b/util/test/demos/3rdparty/volk/README.md @@ -1 +1 @@ -volk from https://github.com/zeux/volk at commit b1128a0df781cb41f47342925177fdf5b8d112bd +volk from https://github.com/zeux/volk at commit b7ea0c3d15591a9c84f16b0c628443b1a06a302d (built against 1.1.130) diff --git a/util/test/demos/3rdparty/volk/volk.c b/util/test/demos/3rdparty/volk/volk.c index c93a3eda0..549cccbda 100644 --- a/util/test/demos/3rdparty/volk/volk.c +++ b/util/test/demos/3rdparty/volk/volk.c @@ -197,6 +197,9 @@ static void volkGenLoadInstance(void* context, PFN_vkVoidFunction (*load)(void*, #if defined(VK_EXT_sample_locations) vkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)load(context, "vkGetPhysicalDeviceMultisamplePropertiesEXT"); #endif /* defined(VK_EXT_sample_locations) */ +#if defined(VK_EXT_tooling_info) + vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)load(context, "vkGetPhysicalDeviceToolPropertiesEXT"); +#endif /* defined(VK_EXT_tooling_info) */ #if defined(VK_FUCHSIA_imagepipe_surface) vkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)load(context, "vkCreateImagePipeSurfaceFUCHSIA"); #endif /* defined(VK_FUCHSIA_imagepipe_surface) */ @@ -1378,6 +1381,9 @@ PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT; PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT; #endif /* defined(VK_EXT_sample_locations) */ +#if defined(VK_EXT_tooling_info) +PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT; +#endif /* defined(VK_EXT_tooling_info) */ #if defined(VK_EXT_transform_feedback) PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT; PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT; diff --git a/util/test/demos/3rdparty/volk/volk.h b/util/test/demos/3rdparty/volk/volk.h index 7944a02d1..58576c521 100644 --- a/util/test/demos/3rdparty/volk/volk.h +++ b/util/test/demos/3rdparty/volk/volk.h @@ -14,7 +14,7 @@ #endif /* VOLK_GENERATE_VERSION_DEFINE */ -#define VOLK_HEADER_VERSION 129 +#define VOLK_HEADER_VERSION 130 /* VOLK_GENERATE_VERSION_DEFINE */ #ifndef VK_NO_PROTOTYPES @@ -769,6 +769,9 @@ extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; extern PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT; extern PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT; #endif /* defined(VK_EXT_sample_locations) */ +#if defined(VK_EXT_tooling_info) +extern PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT; +#endif /* defined(VK_EXT_tooling_info) */ #if defined(VK_EXT_transform_feedback) extern PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT; extern PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT; diff --git a/util/test/demos/vk/official/vulkan/vulkan_core.h b/util/test/demos/vk/official/vulkan/vulkan_core.h index f41ccf4a4..7bfacbe91 100644 --- a/util/test/demos/vk/official/vulkan/vulkan_core.h +++ b/util/test/demos/vk/official/vulkan/vulkan_core.h @@ -44,7 +44,7 @@ extern "C" { #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 129 +#define VK_HEADER_VERSION 130 #define VK_NULL_HANDLE 0 @@ -518,6 +518,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = 1000241002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000, VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = 1000245000, VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000, @@ -9905,6 +9906,41 @@ VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT( #endif +#define VK_EXT_tooling_info 1 +#define VK_EXT_TOOLING_INFO_SPEC_VERSION 1 +#define VK_EXT_TOOLING_INFO_EXTENSION_NAME "VK_EXT_tooling_info" + +typedef enum VkToolPurposeFlagBitsEXT { + VK_TOOL_PURPOSE_VALIDATION_BIT_EXT = 0x00000001, + VK_TOOL_PURPOSE_PROFILING_BIT_EXT = 0x00000002, + VK_TOOL_PURPOSE_TRACING_BIT_EXT = 0x00000004, + VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT = 0x00000008, + VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT = 0x00000010, + VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT = 0x00000020, + VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT = 0x00000040, + VK_TOOL_PURPOSE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkToolPurposeFlagBitsEXT; +typedef VkFlags VkToolPurposeFlagsEXT; +typedef struct VkPhysicalDeviceToolPropertiesEXT { + VkStructureType sType; + void* pNext; + char name[VK_MAX_EXTENSION_NAME_SIZE]; + char version[VK_MAX_EXTENSION_NAME_SIZE]; + VkToolPurposeFlagsEXT purposes; + char description[VK_MAX_DESCRIPTION_SIZE]; + char layer[VK_MAX_EXTENSION_NAME_SIZE]; +} VkPhysicalDeviceToolPropertiesEXT; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolPropertiesEXT)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolPropertiesEXT* pToolProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolPropertiesEXT( + VkPhysicalDevice physicalDevice, + uint32_t* pToolCount, + VkPhysicalDeviceToolPropertiesEXT* pToolProperties); +#endif + + #define VK_EXT_separate_stencil_usage 1 #define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1 #define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage"