diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index c0ea9ade8..cffd979fd 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1081,6 +1081,8 @@ enum class VulkanChunk : uint32_t vkCmdCopyAccelerationStructureToMemoryKHR, vkCmdCopyMemoryToAccelerationStructureKHR, vkCreateAccelerationStructureKHR, + vkCmdBindShadersEXT, + vkCreateShadersEXT, Max, }; @@ -1120,7 +1122,8 @@ DECLARE_REFLECTION_ENUM(VulkanChunk); SERIALISE_HANDLE(VkSurfaceKHR) \ SERIALISE_HANDLE(VkDescriptorUpdateTemplate) \ SERIALISE_HANDLE(VkSamplerYcbcrConversion) \ - SERIALISE_HANDLE(VkAccelerationStructureKHR) + SERIALISE_HANDLE(VkAccelerationStructureKHR) \ + SERIALISE_HANDLE(VkShaderEXT) #define SERIALISE_HANDLE(type) DECLARE_REFLECTION_STRUCT(type) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 63b2f8efc..43d89464b 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -4057,6 +4057,11 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) case VulkanChunk::vkCreateAccelerationStructureKHR: return Serialise_vkCreateAccelerationStructureKHR(ser, VK_NULL_HANDLE, NULL, NULL, NULL); + case VulkanChunk::vkCmdBindShadersEXT: + return Serialise_vkCmdBindShadersEXT(ser, VK_NULL_HANDLE, 0, NULL, NULL); + case VulkanChunk::vkCreateShadersEXT: + return Serialise_vkCreateShadersEXT(ser, VK_NULL_HANDLE, 0, NULL, NULL, NULL); + // chunks that are reserved but not yet serialised case VulkanChunk::vkResetCommandPool: case VulkanChunk::vkCreateDepthTargetView: diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 6817bc376..f4e0b2080 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -481,6 +481,7 @@ private: bool m_TaskShaders = false; bool m_ListRestart = false; bool m_AccelerationStructures = false; + bool m_ShaderObject = false; PFN_vkSetDeviceLoaderData m_SetDeviceLoaderData; @@ -2939,4 +2940,19 @@ public: VkDevice device, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, size_t dataSize, void *pData, size_t stride); + + // VK_EXT_shader_object + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindShadersEXT, VkCommandBuffer commandBuffer, + uint32_t stageCount, const VkShaderStageFlagBits *pStages, + const VkShaderEXT *pShaders); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateShadersEXT, VkDevice device, + uint32_t createInfoCount, const VkShaderCreateInfoEXT *pCreateInfos, + const VkAllocationCallbacks *pAllocator, VkShaderEXT *pShaders); + + void vkDestroyShaderEXT(VkDevice device, VkShaderEXT shader, + const VkAllocationCallbacks *pAllocator); + + VkResult vkGetShaderBinaryDataEXT(VkDevice device, VkShaderEXT shader, size_t *pDataSize, + void *pData); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 880064b07..8d072f86d 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -558,7 +558,8 @@ DeclExt(KHR_deferred_host_operations); \ DeclExt(KHR_acceleration_structure); \ DeclExt(KHR_ray_query); \ - DeclExt(EXT_nested_command_buffer); + DeclExt(EXT_nested_command_buffer); \ + DeclExt(EXT_shader_object); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -687,7 +688,8 @@ CheckExt(KHR_calibrated_timestamps, VKXX); \ CheckExt(KHR_deferred_host_operations, VKXX); \ CheckExt(KHR_acceleration_structure, VKXX); \ - CheckExt(KHR_ray_query, VKXX); + CheckExt(KHR_ray_query, VKXX); \ + CheckExt(EXT_shader_object, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -810,211 +812,244 @@ HookInitExtension_Instance_Android(); \ HookInitExtension_Instance_Mac(); -#define HookInitVulkanDeviceExts() \ - HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectTagEXT); \ - HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectNameEXT); \ - HookInitExtension(EXT_debug_marker, CmdDebugMarkerBeginEXT); \ - HookInitExtension(EXT_debug_marker, CmdDebugMarkerEndEXT); \ - HookInitExtension(EXT_debug_marker, CmdDebugMarkerInsertEXT); \ - HookInitExtension(KHR_swapchain, CreateSwapchainKHR); \ - HookInitExtension(KHR_swapchain, DestroySwapchainKHR); \ - HookInitExtension(KHR_swapchain, GetSwapchainImagesKHR); \ - HookInitExtension(KHR_swapchain, AcquireNextImageKHR); \ - HookInitExtension(KHR_swapchain, QueuePresentKHR); \ - HookInitExtension(KHR_display_swapchain, CreateSharedSwapchainsKHR); \ - HookInitPromotedExtension(KHR_maintenance1, TrimCommandPool, KHR); \ - HookInitExtension(EXT_display_control, DisplayPowerControlEXT); \ - HookInitExtension(EXT_display_control, RegisterDeviceEventEXT); \ - HookInitExtension(EXT_display_control, RegisterDisplayEventEXT); \ - HookInitExtension(EXT_display_control, GetSwapchainCounterEXT); \ - HookInitExtension(KHR_external_memory_fd, GetMemoryFdKHR); \ - HookInitExtension(KHR_external_memory_fd, GetMemoryFdPropertiesKHR); \ - HookInitExtension(KHR_external_semaphore_fd, ImportSemaphoreFdKHR); \ - HookInitExtension(KHR_external_semaphore_fd, GetSemaphoreFdKHR); \ - HookInitExtension(KHR_external_fence_fd, ImportFenceFdKHR); \ - HookInitExtension(KHR_external_fence_fd, GetFenceFdKHR); \ - HookInitPromotedExtension(KHR_get_memory_requirements2, GetBufferMemoryRequirements2, KHR); \ - HookInitPromotedExtension(KHR_get_memory_requirements2, GetImageMemoryRequirements2, KHR); \ - HookInitPromotedExtension(KHR_get_memory_requirements2, GetImageSparseMemoryRequirements2, KHR); \ - HookInitExtension(AMD_shader_info, GetShaderInfoAMD); \ - HookInitExtension(KHR_push_descriptor, CmdPushDescriptorSetKHR); \ - HookInitPromotedExtension(KHR_descriptor_update_template, CreateDescriptorUpdateTemplate, KHR); \ - HookInitPromotedExtension(KHR_descriptor_update_template, DestroyDescriptorUpdateTemplate, KHR); \ - HookInitPromotedExtension(KHR_descriptor_update_template, UpdateDescriptorSetWithTemplate, KHR); \ - HookInitExtension(KHR_push_descriptor &&KHR_descriptor_update_template, \ - CmdPushDescriptorSetWithTemplateKHR); \ - HookInitPromotedExtension(KHR_bind_memory2, BindBufferMemory2, KHR); \ - HookInitPromotedExtension(KHR_bind_memory2, BindImageMemory2, KHR); \ - HookInitPromotedExtension(KHR_maintenance3, GetDescriptorSetLayoutSupport, KHR); \ - HookInitExtension(AMD_buffer_marker, CmdWriteBufferMarkerAMD); \ - HookInitExtension(EXT_debug_utils, SetDebugUtilsObjectNameEXT); \ - HookInitExtension(EXT_debug_utils, SetDebugUtilsObjectTagEXT); \ - HookInitExtension(EXT_debug_utils, QueueBeginDebugUtilsLabelEXT); \ - HookInitExtension(EXT_debug_utils, QueueEndDebugUtilsLabelEXT); \ - HookInitExtension(EXT_debug_utils, QueueInsertDebugUtilsLabelEXT); \ - HookInitExtension(EXT_debug_utils, CmdBeginDebugUtilsLabelEXT); \ - HookInitExtension(EXT_debug_utils, CmdEndDebugUtilsLabelEXT); \ - HookInitExtension(EXT_debug_utils, CmdInsertDebugUtilsLabelEXT); \ - HookInitPromotedExtension(KHR_sampler_ycbcr_conversion, CreateSamplerYcbcrConversion, KHR); \ - HookInitPromotedExtension(KHR_sampler_ycbcr_conversion, DestroySamplerYcbcrConversion, KHR); \ - HookInitPromotedExtension(KHR_device_group, GetDeviceGroupPeerMemoryFeatures, KHR); \ - HookInitPromotedExtension(KHR_device_group, CmdSetDeviceMask, KHR); \ - HookInitPromotedExtension(KHR_device_group, CmdDispatchBase, KHR); \ - HookInitExtension(KHR_device_group &&KHR_surface, GetDeviceGroupPresentCapabilitiesKHR); \ - HookInitExtension(KHR_device_group &&KHR_surface, GetDeviceGroupSurfacePresentModesKHR); \ - HookInitExtension(KHR_device_group &&KHR_swapchain, AcquireNextImage2KHR); \ - HookInitExtension(protected_memory, GetDeviceQueue2); \ - HookInitPromotedExtension(KHR_draw_indirect_count, CmdDrawIndirectCount, KHR); \ - HookInitPromotedExtension(KHR_draw_indirect_count, CmdDrawIndexedIndirectCount, KHR); \ - HookInitExtension(EXT_validation_cache, CreateValidationCacheEXT); \ - HookInitExtension(EXT_validation_cache, DestroyValidationCacheEXT); \ - HookInitExtension(EXT_validation_cache, MergeValidationCachesEXT); \ - HookInitExtension(EXT_validation_cache, GetValidationCacheDataEXT); \ - HookInitExtension(KHR_shared_presentable_image, GetSwapchainStatusKHR); \ - HookInitPromotedExtension(KHR_create_renderpass2, CreateRenderPass2, KHR); \ - HookInitPromotedExtension(KHR_create_renderpass2, CmdBeginRenderPass2, KHR); \ - HookInitPromotedExtension(KHR_create_renderpass2, CmdNextSubpass2, KHR); \ - HookInitPromotedExtension(KHR_create_renderpass2, CmdEndRenderPass2, KHR); \ - HookInitExtension(EXT_transform_feedback, CmdBindTransformFeedbackBuffersEXT); \ - HookInitExtension(EXT_transform_feedback, CmdBeginTransformFeedbackEXT); \ - HookInitExtension(EXT_transform_feedback, CmdEndTransformFeedbackEXT); \ - HookInitExtension(EXT_transform_feedback, CmdBeginQueryIndexedEXT); \ - HookInitExtension(EXT_transform_feedback, CmdEndQueryIndexedEXT); \ - HookInitExtension(EXT_transform_feedback, CmdDrawIndirectByteCountEXT); \ - HookInitExtension(EXT_conditional_rendering, CmdBeginConditionalRenderingEXT); \ - HookInitExtension(EXT_conditional_rendering, CmdEndConditionalRenderingEXT); \ - HookInitExtension(EXT_sample_locations, CmdSetSampleLocationsEXT); \ - HookInitExtension(EXT_discard_rectangles, CmdSetDiscardRectangleEXT); \ - HookInitExtension(EXT_calibrated_timestamps, GetCalibratedTimestampsEXT); \ - HookInitPromotedExtension(EXT_host_query_reset, ResetQueryPool, EXT); \ - HookInitExtension(EXT_buffer_device_address, GetBufferDeviceAddressEXT); \ - HookInitExtension(EXT_hdr_metadata, SetHdrMetadataEXT); \ - HookInitExtension(AMD_display_native_hdr, SetLocalDimmingAMD); \ - HookInitExtension(KHR_pipeline_executable_properties, GetPipelineExecutablePropertiesKHR); \ - HookInitExtension(KHR_pipeline_executable_properties, GetPipelineExecutableStatisticsKHR); \ - HookInitExtension(KHR_pipeline_executable_properties, \ - GetPipelineExecutableInternalRepresentationsKHR); \ - HookInitExtension(EXT_line_rasterization, CmdSetLineStippleEXT); \ - HookInitExtension(GOOGLE_display_timing, GetRefreshCycleDurationGOOGLE); \ - HookInitExtension(GOOGLE_display_timing, GetPastPresentationTimingGOOGLE); \ - HookInitPromotedExtension(KHR_timeline_semaphore, GetSemaphoreCounterValue, KHR); \ - HookInitPromotedExtension(KHR_timeline_semaphore, WaitSemaphores, KHR); \ - HookInitPromotedExtension(KHR_timeline_semaphore, SignalSemaphore, KHR); \ - HookInitExtension(KHR_performance_query, AcquireProfilingLockKHR); \ - HookInitExtension(KHR_performance_query, ReleaseProfilingLockKHR); \ - HookInitPromotedExtension(KHR_buffer_device_address, GetBufferDeviceAddress, KHR); \ - HookInitPromotedExtension(KHR_buffer_device_address, GetBufferOpaqueCaptureAddress, KHR); \ - HookInitPromotedExtension(KHR_buffer_device_address, GetDeviceMemoryOpaqueCaptureAddress, KHR); \ - HookInitPromotedExtension(EXT_private_data, CreatePrivateDataSlot, EXT); \ - HookInitPromotedExtension(EXT_private_data, DestroyPrivateDataSlot, EXT); \ - HookInitPromotedExtension(EXT_private_data, SetPrivateData, EXT); \ - HookInitPromotedExtension(EXT_private_data, GetPrivateData, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetCullMode, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetFrontFace, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetPrimitiveTopology, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetViewportWithCount, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetScissorWithCount, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdBindVertexBuffers2, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetDepthTestEnable, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetDepthWriteEnable, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetDepthCompareOp, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetDepthBoundsTestEnable, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetStencilTestEnable, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state, CmdSetStencilOp, EXT); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdCopyBuffer2, KHR); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdCopyImage2, KHR); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdCopyBufferToImage2, KHR); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdCopyImageToBuffer2, KHR); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdBlitImage2, KHR); \ - HookInitPromotedExtension(KHR_copy_commands2, CmdResolveImage2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, CmdSetEvent2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, CmdResetEvent2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, CmdWaitEvents2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, CmdPipelineBarrier2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, CmdWriteTimestamp2, KHR); \ - HookInitPromotedExtension(KHR_synchronization2, QueueSubmit2, KHR); \ - HookInitExtension(KHR_synchronization2 &&AMD_buffer_marker, CmdWriteBufferMarker2AMD); \ - /* No GetQueueCheckpointData2NV without VK_NV_device_diagnostic_checkpoints */ \ - HookInitExtension(KHR_present_wait, WaitForPresentKHR); \ - HookInitPromotedExtension(KHR_maintenance4, GetDeviceBufferMemoryRequirements, KHR); \ - HookInitPromotedExtension(KHR_maintenance4, GetDeviceImageMemoryRequirements, KHR); \ - HookInitPromotedExtension(KHR_maintenance4, GetDeviceImageSparseMemoryRequirements, KHR); \ - HookInitExtension(EXT_color_write_enable, CmdSetColorWriteEnableEXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state2, CmdSetDepthBiasEnable, EXT); \ - HookInitExtension(EXT_extended_dynamic_state2, CmdSetLogicOpEXT); \ - HookInitExtension(EXT_extended_dynamic_state2, CmdSetPatchControlPointsEXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state2, CmdSetPrimitiveRestartEnable, EXT); \ - HookInitPromotedExtension(EXT_extended_dynamic_state2, CmdSetRasterizerDiscardEnable, EXT); \ - HookInitExtension(EXT_vertex_input_dynamic_state, CmdSetVertexInputEXT); \ - HookInitPromotedExtension(KHR_dynamic_rendering, CmdBeginRendering, KHR); \ - HookInitPromotedExtension(KHR_dynamic_rendering, CmdEndRendering, KHR); \ - HookInitExtension(KHR_fragment_shading_rate, CmdSetFragmentShadingRateKHR); \ - HookInitExtension(EXT_pageable_device_local_memory, SetDeviceMemoryPriorityEXT); \ - HookInitExtension(EXT_swapchain_maintenance1, ReleaseSwapchainImagesEXT); \ - HookInitExtension(EXT_attachment_feedback_loop_dynamic_state, \ - CmdSetAttachmentFeedbackLoopEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetAlphaToCoverageEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetAlphaToOneEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetColorBlendAdvancedEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetColorBlendEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetColorBlendEquationEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetColorWriteMaskEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetConservativeRasterizationModeEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageModulationModeNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageModulationTableEnableNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageModulationTableNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageReductionModeNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageToColorEnableNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetCoverageToColorLocationNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetDepthClampEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetDepthClipEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetDepthClipNegativeOneToOneEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetExtraPrimitiveOverestimationSizeEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetLineRasterizationModeEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetLineStippleEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetLogicOpEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetPolygonModeEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetProvokingVertexModeEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetRasterizationSamplesEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetRasterizationStreamEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetRepresentativeFragmentTestEnableNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetSampleLocationsEnableEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetSampleMaskEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetShadingRateImageEnableNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetTessellationDomainOriginEXT); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetViewportSwizzleNV); \ - HookInitExtension(EXT_extended_dynamic_state3, CmdSetViewportWScalingEnableNV); \ - HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksEXT); \ - HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksIndirectEXT); \ - HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksIndirectCountEXT); \ - HookInitExtension(KHR_calibrated_timestamps, GetCalibratedTimestampsKHR); \ - HookInitExtension(KHR_line_rasterization, CmdSetLineStippleKHR); \ - HookInitExtensionEXTtoKHR(CmdSetLineStipple); \ - HookInitExtension(KHR_deferred_host_operations, CreateDeferredOperationKHR); \ - HookInitExtension(KHR_deferred_host_operations, DeferredOperationJoinKHR); \ - HookInitExtension(KHR_deferred_host_operations, DestroyDeferredOperationKHR); \ - HookInitExtension(KHR_deferred_host_operations, GetDeferredOperationMaxConcurrencyKHR); \ - HookInitExtension(KHR_deferred_host_operations, GetDeferredOperationResultKHR); \ - HookInitExtension(KHR_acceleration_structure, BuildAccelerationStructuresKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdBuildAccelerationStructuresIndirectKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdBuildAccelerationStructuresKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdCopyAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdCopyAccelerationStructureToMemoryKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdCopyMemoryToAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, CmdWriteAccelerationStructuresPropertiesKHR); \ - HookInitExtension(KHR_acceleration_structure, CopyAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, CopyAccelerationStructureToMemoryKHR); \ - HookInitExtension(KHR_acceleration_structure, CopyMemoryToAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, CreateAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, DestroyAccelerationStructureKHR); \ - HookInitExtension(KHR_acceleration_structure, GetAccelerationStructureBuildSizesKHR); \ - HookInitExtension(KHR_acceleration_structure, GetAccelerationStructureDeviceAddressKHR); \ - HookInitExtension(KHR_acceleration_structure, GetDeviceAccelerationStructureCompatibilityKHR); \ - HookInitExtension(KHR_acceleration_structure, WriteAccelerationStructuresPropertiesKHR); \ - HookInitExtension_Device_Win32(); \ - HookInitExtension_Device_Linux(); \ - HookInitExtension_Device_GGP(); \ - HookInitExtension_Device_Android(); \ +#define HookInitVulkanDeviceExts() \ + HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectTagEXT); \ + HookInitExtension(EXT_debug_marker, DebugMarkerSetObjectNameEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerBeginEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerEndEXT); \ + HookInitExtension(EXT_debug_marker, CmdDebugMarkerInsertEXT); \ + HookInitExtension(KHR_swapchain, CreateSwapchainKHR); \ + HookInitExtension(KHR_swapchain, DestroySwapchainKHR); \ + HookInitExtension(KHR_swapchain, GetSwapchainImagesKHR); \ + HookInitExtension(KHR_swapchain, AcquireNextImageKHR); \ + HookInitExtension(KHR_swapchain, QueuePresentKHR); \ + HookInitExtension(KHR_display_swapchain, CreateSharedSwapchainsKHR); \ + HookInitPromotedExtension(KHR_maintenance1, TrimCommandPool, KHR); \ + HookInitExtension(EXT_display_control, DisplayPowerControlEXT); \ + HookInitExtension(EXT_display_control, RegisterDeviceEventEXT); \ + HookInitExtension(EXT_display_control, RegisterDisplayEventEXT); \ + HookInitExtension(EXT_display_control, GetSwapchainCounterEXT); \ + HookInitExtension(KHR_external_memory_fd, GetMemoryFdKHR); \ + HookInitExtension(KHR_external_memory_fd, GetMemoryFdPropertiesKHR); \ + HookInitExtension(KHR_external_semaphore_fd, ImportSemaphoreFdKHR); \ + HookInitExtension(KHR_external_semaphore_fd, GetSemaphoreFdKHR); \ + HookInitExtension(KHR_external_fence_fd, ImportFenceFdKHR); \ + HookInitExtension(KHR_external_fence_fd, GetFenceFdKHR); \ + HookInitPromotedExtension(KHR_get_memory_requirements2, GetBufferMemoryRequirements2, KHR); \ + HookInitPromotedExtension(KHR_get_memory_requirements2, GetImageMemoryRequirements2, KHR); \ + HookInitPromotedExtension(KHR_get_memory_requirements2, GetImageSparseMemoryRequirements2, KHR); \ + HookInitExtension(AMD_shader_info, GetShaderInfoAMD); \ + HookInitExtension(KHR_push_descriptor, CmdPushDescriptorSetKHR); \ + HookInitPromotedExtension(KHR_descriptor_update_template, CreateDescriptorUpdateTemplate, KHR); \ + HookInitPromotedExtension(KHR_descriptor_update_template, DestroyDescriptorUpdateTemplate, KHR); \ + HookInitPromotedExtension(KHR_descriptor_update_template, UpdateDescriptorSetWithTemplate, KHR); \ + HookInitExtension(KHR_push_descriptor &&KHR_descriptor_update_template, \ + CmdPushDescriptorSetWithTemplateKHR); \ + HookInitPromotedExtension(KHR_bind_memory2, BindBufferMemory2, KHR); \ + HookInitPromotedExtension(KHR_bind_memory2, BindImageMemory2, KHR); \ + HookInitPromotedExtension(KHR_maintenance3, GetDescriptorSetLayoutSupport, KHR); \ + HookInitExtension(AMD_buffer_marker, CmdWriteBufferMarkerAMD); \ + HookInitExtension(EXT_debug_utils, SetDebugUtilsObjectNameEXT); \ + HookInitExtension(EXT_debug_utils, SetDebugUtilsObjectTagEXT); \ + HookInitExtension(EXT_debug_utils, QueueBeginDebugUtilsLabelEXT); \ + HookInitExtension(EXT_debug_utils, QueueEndDebugUtilsLabelEXT); \ + HookInitExtension(EXT_debug_utils, QueueInsertDebugUtilsLabelEXT); \ + HookInitExtension(EXT_debug_utils, CmdBeginDebugUtilsLabelEXT); \ + HookInitExtension(EXT_debug_utils, CmdEndDebugUtilsLabelEXT); \ + HookInitExtension(EXT_debug_utils, CmdInsertDebugUtilsLabelEXT); \ + HookInitPromotedExtension(KHR_sampler_ycbcr_conversion, CreateSamplerYcbcrConversion, KHR); \ + HookInitPromotedExtension(KHR_sampler_ycbcr_conversion, DestroySamplerYcbcrConversion, KHR); \ + HookInitPromotedExtension(KHR_device_group, GetDeviceGroupPeerMemoryFeatures, KHR); \ + HookInitPromotedExtension(KHR_device_group, CmdSetDeviceMask, KHR); \ + HookInitPromotedExtension(KHR_device_group, CmdDispatchBase, KHR); \ + HookInitExtension(KHR_device_group &&KHR_surface, GetDeviceGroupPresentCapabilitiesKHR); \ + HookInitExtension(KHR_device_group &&KHR_surface, GetDeviceGroupSurfacePresentModesKHR); \ + HookInitExtension(KHR_device_group &&KHR_swapchain, AcquireNextImage2KHR); \ + HookInitExtension(protected_memory, GetDeviceQueue2); \ + HookInitPromotedExtension(KHR_draw_indirect_count, CmdDrawIndirectCount, KHR); \ + HookInitPromotedExtension(KHR_draw_indirect_count, CmdDrawIndexedIndirectCount, KHR); \ + HookInitExtension(EXT_validation_cache, CreateValidationCacheEXT); \ + HookInitExtension(EXT_validation_cache, DestroyValidationCacheEXT); \ + HookInitExtension(EXT_validation_cache, MergeValidationCachesEXT); \ + HookInitExtension(EXT_validation_cache, GetValidationCacheDataEXT); \ + HookInitExtension(KHR_shared_presentable_image, GetSwapchainStatusKHR); \ + HookInitPromotedExtension(KHR_create_renderpass2, CreateRenderPass2, KHR); \ + HookInitPromotedExtension(KHR_create_renderpass2, CmdBeginRenderPass2, KHR); \ + HookInitPromotedExtension(KHR_create_renderpass2, CmdNextSubpass2, KHR); \ + HookInitPromotedExtension(KHR_create_renderpass2, CmdEndRenderPass2, KHR); \ + HookInitExtension(EXT_transform_feedback, CmdBindTransformFeedbackBuffersEXT); \ + HookInitExtension(EXT_transform_feedback, CmdBeginTransformFeedbackEXT); \ + HookInitExtension(EXT_transform_feedback, CmdEndTransformFeedbackEXT); \ + HookInitExtension(EXT_transform_feedback, CmdBeginQueryIndexedEXT); \ + HookInitExtension(EXT_transform_feedback, CmdEndQueryIndexedEXT); \ + HookInitExtension(EXT_transform_feedback, CmdDrawIndirectByteCountEXT); \ + HookInitExtension(EXT_conditional_rendering, CmdBeginConditionalRenderingEXT); \ + HookInitExtension(EXT_conditional_rendering, CmdEndConditionalRenderingEXT); \ + HookInitExtension(EXT_sample_locations, CmdSetSampleLocationsEXT); \ + HookInitExtension(EXT_discard_rectangles, CmdSetDiscardRectangleEXT); \ + HookInitExtension(EXT_calibrated_timestamps, GetCalibratedTimestampsEXT); \ + HookInitPromotedExtension(EXT_host_query_reset, ResetQueryPool, EXT); \ + HookInitExtension(EXT_buffer_device_address, GetBufferDeviceAddressEXT); \ + HookInitExtension(EXT_hdr_metadata, SetHdrMetadataEXT); \ + HookInitExtension(AMD_display_native_hdr, SetLocalDimmingAMD); \ + HookInitExtension(KHR_pipeline_executable_properties, GetPipelineExecutablePropertiesKHR); \ + HookInitExtension(KHR_pipeline_executable_properties, GetPipelineExecutableStatisticsKHR); \ + HookInitExtension(KHR_pipeline_executable_properties, \ + GetPipelineExecutableInternalRepresentationsKHR); \ + HookInitExtension(EXT_line_rasterization, CmdSetLineStippleEXT); \ + HookInitExtension(GOOGLE_display_timing, GetRefreshCycleDurationGOOGLE); \ + HookInitExtension(GOOGLE_display_timing, GetPastPresentationTimingGOOGLE); \ + HookInitPromotedExtension(KHR_timeline_semaphore, GetSemaphoreCounterValue, KHR); \ + HookInitPromotedExtension(KHR_timeline_semaphore, WaitSemaphores, KHR); \ + HookInitPromotedExtension(KHR_timeline_semaphore, SignalSemaphore, KHR); \ + HookInitExtension(KHR_performance_query, AcquireProfilingLockKHR); \ + HookInitExtension(KHR_performance_query, ReleaseProfilingLockKHR); \ + HookInitPromotedExtension(KHR_buffer_device_address, GetBufferDeviceAddress, KHR); \ + HookInitPromotedExtension(KHR_buffer_device_address, GetBufferOpaqueCaptureAddress, KHR); \ + HookInitPromotedExtension(KHR_buffer_device_address, GetDeviceMemoryOpaqueCaptureAddress, KHR); \ + HookInitPromotedExtension(EXT_private_data, CreatePrivateDataSlot, EXT); \ + HookInitPromotedExtension(EXT_private_data, DestroyPrivateDataSlot, EXT); \ + HookInitPromotedExtension(EXT_private_data, SetPrivateData, EXT); \ + HookInitPromotedExtension(EXT_private_data, GetPrivateData, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, CmdSetCullMode, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, CmdSetFrontFace, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetPrimitiveTopology, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetViewportWithCount, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetScissorWithCount, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdBindVertexBuffers2, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetDepthTestEnable, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetDepthWriteEnable, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, CmdSetDepthCompareOp, \ + EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetDepthBoundsTestEnable, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, \ + CmdSetStencilTestEnable, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state || EXT_shader_object, CmdSetStencilOp, EXT); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdCopyBuffer2, KHR); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdCopyImage2, KHR); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdCopyBufferToImage2, KHR); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdCopyImageToBuffer2, KHR); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdBlitImage2, KHR); \ + HookInitPromotedExtension(KHR_copy_commands2, CmdResolveImage2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, CmdSetEvent2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, CmdResetEvent2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, CmdWaitEvents2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, CmdPipelineBarrier2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, CmdWriteTimestamp2, KHR); \ + HookInitPromotedExtension(KHR_synchronization2, QueueSubmit2, KHR); \ + HookInitExtension(KHR_synchronization2 &&AMD_buffer_marker, CmdWriteBufferMarker2AMD); \ + /* No GetQueueCheckpointData2NV without VK_NV_device_diagnostic_checkpoints */ \ + HookInitExtension(KHR_present_wait, WaitForPresentKHR); \ + HookInitPromotedExtension(KHR_maintenance4, GetDeviceBufferMemoryRequirements, KHR); \ + HookInitPromotedExtension(KHR_maintenance4, GetDeviceImageMemoryRequirements, KHR); \ + HookInitPromotedExtension(KHR_maintenance4, GetDeviceImageSparseMemoryRequirements, KHR); \ + HookInitExtension(EXT_color_write_enable, CmdSetColorWriteEnableEXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state2 || EXT_shader_object, \ + CmdSetDepthBiasEnable, EXT); \ + HookInitExtension(EXT_extended_dynamic_state2 || EXT_shader_object, CmdSetLogicOpEXT); \ + HookInitExtension(EXT_extended_dynamic_state2 || EXT_shader_object, CmdSetPatchControlPointsEXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state2 || EXT_shader_object, \ + CmdSetPrimitiveRestartEnable, EXT); \ + HookInitPromotedExtension(EXT_extended_dynamic_state2 || EXT_shader_object, \ + CmdSetRasterizerDiscardEnable, EXT); \ + HookInitExtension(EXT_vertex_input_dynamic_state || EXT_shader_object, CmdSetVertexInputEXT); \ + HookInitPromotedExtension(KHR_dynamic_rendering, CmdBeginRendering, KHR); \ + HookInitPromotedExtension(KHR_dynamic_rendering, CmdEndRendering, KHR); \ + HookInitExtension(KHR_fragment_shading_rate, CmdSetFragmentShadingRateKHR); \ + HookInitExtension(EXT_pageable_device_local_memory, SetDeviceMemoryPriorityEXT); \ + HookInitExtension(EXT_swapchain_maintenance1, ReleaseSwapchainImagesEXT); \ + HookInitExtension(EXT_attachment_feedback_loop_dynamic_state, \ + CmdSetAttachmentFeedbackLoopEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetAlphaToCoverageEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetAlphaToOneEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetColorBlendAdvancedEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetColorBlendEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetColorBlendEquationEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetColorWriteMaskEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetConservativeRasterizationModeEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageModulationModeNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageModulationTableEnableNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageModulationTableNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageReductionModeNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageToColorEnableNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetCoverageToColorLocationNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetDepthClampEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetDepthClipEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetDepthClipNegativeOneToOneEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetExtraPrimitiveOverestimationSizeEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetLineRasterizationModeEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetLineStippleEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetLogicOpEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetPolygonModeEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetProvokingVertexModeEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetRasterizationSamplesEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetRasterizationStreamEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetRepresentativeFragmentTestEnableNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetSampleLocationsEnableEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetSampleMaskEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetShadingRateImageEnableNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetTessellationDomainOriginEXT); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, CmdSetViewportSwizzleNV); \ + HookInitExtension(EXT_extended_dynamic_state3 || EXT_shader_object, \ + CmdSetViewportWScalingEnableNV); \ + HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksEXT); \ + HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksIndirectEXT); \ + HookInitExtension(EXT_mesh_shader, CmdDrawMeshTasksIndirectCountEXT); \ + HookInitExtension(KHR_calibrated_timestamps, GetCalibratedTimestampsKHR); \ + HookInitExtension(KHR_line_rasterization, CmdSetLineStippleKHR); \ + HookInitExtensionEXTtoKHR(CmdSetLineStipple); \ + HookInitExtension(KHR_deferred_host_operations, CreateDeferredOperationKHR); \ + HookInitExtension(KHR_deferred_host_operations, DeferredOperationJoinKHR); \ + HookInitExtension(KHR_deferred_host_operations, DestroyDeferredOperationKHR); \ + HookInitExtension(KHR_deferred_host_operations, GetDeferredOperationMaxConcurrencyKHR); \ + HookInitExtension(KHR_deferred_host_operations, GetDeferredOperationResultKHR); \ + HookInitExtension(KHR_acceleration_structure, BuildAccelerationStructuresKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdBuildAccelerationStructuresIndirectKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdBuildAccelerationStructuresKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdCopyAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdCopyAccelerationStructureToMemoryKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdCopyMemoryToAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, CmdWriteAccelerationStructuresPropertiesKHR); \ + HookInitExtension(KHR_acceleration_structure, CopyAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, CopyAccelerationStructureToMemoryKHR); \ + HookInitExtension(KHR_acceleration_structure, CopyMemoryToAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, CreateAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, DestroyAccelerationStructureKHR); \ + HookInitExtension(KHR_acceleration_structure, GetAccelerationStructureBuildSizesKHR); \ + HookInitExtension(KHR_acceleration_structure, GetAccelerationStructureDeviceAddressKHR); \ + HookInitExtension(KHR_acceleration_structure, GetDeviceAccelerationStructureCompatibilityKHR); \ + HookInitExtension(KHR_acceleration_structure, WriteAccelerationStructuresPropertiesKHR); \ + HookInitExtension(EXT_shader_object, CmdBindShadersEXT); \ + HookInitExtension(EXT_shader_object, CreateShadersEXT); \ + HookInitExtension(EXT_shader_object, DestroyShaderEXT); \ + HookInitExtension(EXT_shader_object, GetShaderBinaryDataEXT); \ + HookInitExtension_Device_Win32(); \ + HookInitExtension_Device_Linux(); \ + HookInitExtension_Device_GGP(); \ + HookInitExtension_Device_Android(); \ HookInitExtension_Device_Mac(); #define DefineHooks() \ @@ -1878,6 +1913,15 @@ accelerationStructureCount, const VkAccelerationStructureKHR *, \ pAccelerationStructures, VkQueryType, queryType, size_t, dataSize, void *, pData, \ size_t, stride); \ + HookDefine4(void, vkCmdBindShadersEXT, VkCommandBuffer, commandBuffer, uint32_t, stageCount, \ + const VkShaderStageFlagBits *, pStages, const VkShaderEXT *, pShaders); \ + HookDefine5(VkResult, vkCreateShadersEXT, VkDevice, device, uint32_t, createInfoCount, \ + const VkShaderCreateInfoEXT *, pCreateInfos, const VkAllocationCallbacks *, \ + pAllocator, VkShaderEXT *, pShaders); \ + HookDefine3(void, vkDestroyShaderEXT, VkDevice, device, VkShaderEXT, shader, \ + const VkAllocationCallbacks *, pAllocator); \ + HookDefine4(VkResult, vkGetShaderBinaryDataEXT, VkDevice, device, VkShaderEXT, shader, size_t *, \ + pDataSize, void *, pData); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_GGP(); \ diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index f1c2f2d28..f28272c86 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -56,6 +56,7 @@ WRAPPED_POOL_INST(WrappedVkSurfaceKHR) WRAPPED_POOL_INST(WrappedVkDescriptorUpdateTemplate) WRAPPED_POOL_INST(WrappedVkSamplerYcbcrConversion) WRAPPED_POOL_INST(WrappedVkAccelerationStructureKHR) +WRAPPED_POOL_INST(WrappedVkShaderEXT) byte VkResourceRecord::markerValue[32] = { 0xaa, 0xbb, 0xcc, 0xdd, 0x88, 0x77, 0x66, 0x55, 0x01, 0x23, 0x45, 0x67, 0x98, 0x76, 0x54, 0x32, @@ -144,6 +145,8 @@ VkResourceType IdentifyTypeByPtr(WrappedVkRes *ptr) return eResSamplerConversion; if(WrappedVkAccelerationStructureKHR::IsAlloc(ptr)) return eResAccelerationStructureKHR; + if(WrappedVkShaderEXT::IsAlloc(ptr)) + return eResShaderEXT; RDCERR("Unknown type for ptr 0x%p", ptr); diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 73b2859f3..35dbcc78f 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -76,6 +76,7 @@ enum VkResourceType eResDescUpdateTemplate, eResSamplerConversion, eResAccelerationStructureKHR, + eResShaderEXT, }; DECLARE_REFLECTION_ENUM(VkResourceType); @@ -573,6 +574,16 @@ struct WrappedVkAccelerationStructureKHR : WrappedVkNonDispRes TypeEnum = eResAccelerationStructureKHR, }; }; +struct WrappedVkShaderEXT : WrappedVkNonDispRes +{ + WrappedVkShaderEXT(VkShaderEXT obj, ResourceId objId) : WrappedVkNonDispRes(obj, objId) {} + typedef VkShaderEXT InnerType; + ALLOCATE_WITH_WRAPPED_POOL(WrappedVkShaderEXT); + enum + { + TypeEnum = eResShaderEXT, + }; +}; // VkDisplayKHR and VkDisplayModeKHR are both UNWRAPPED because there's no need to wrap them. // The only thing we need to wrap VkSurfaceKHR for is to get back the window from it later. @@ -676,6 +687,7 @@ UNWRAP_NONDISP_HELPER(VkSurfaceKHR) UNWRAP_NONDISP_HELPER(VkDescriptorUpdateTemplate) UNWRAP_NONDISP_HELPER(VkSamplerYcbcrConversion) UNWRAP_NONDISP_HELPER(VkAccelerationStructureKHR) +UNWRAP_NONDISP_HELPER(VkShaderEXT) // VkDisplayKHR and VkDisplayModeKHR are both UNWRAPPED because there's no need to wrap them. // The only thing we need to wrap VkSurfaceKHR for is to get back the window from it later. diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index af2db38be..5aec3886b 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -28,7 +28,7 @@ template <> rdcstr DoStringise(const VulkanChunk &el) { - RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1207, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1209, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -239,6 +239,8 @@ rdcstr DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdCopyAccelerationStructureToMemoryKHR) STRINGISE_ENUM_CLASS(vkCmdCopyMemoryToAccelerationStructureKHR) STRINGISE_ENUM_CLASS(vkCreateAccelerationStructureKHR) + STRINGISE_ENUM_CLASS(vkCmdBindShadersEXT) + STRINGISE_ENUM_CLASS(vkCreateShadersEXT) STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() @@ -280,6 +282,7 @@ rdcstr DoStringise(const VkResourceType &el) STRINGISE_ENUM(eResDescUpdateTemplate) STRINGISE_ENUM(eResSamplerConversion) STRINGISE_ENUM(eResAccelerationStructureKHR) + STRINGISE_ENUM(eResShaderEXT) } END_ENUM_STRINGISE(); } diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 74d1936dd..54384cc64 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -8013,6 +8013,115 @@ VkResult WrappedVulkan::vkCopyMemoryToAccelerationStructureKHR( return VK_ERROR_UNKNOWN; } +template +bool WrappedVulkan::Serialise_vkCmdBindShadersEXT(SerialiserType &ser, + VkCommandBuffer commandBuffer, uint32_t stageCount, + const VkShaderStageFlagBits *pStages, + const VkShaderEXT *pShaders) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(stageCount); + SERIALISE_ELEMENT_ARRAY(pStages, stageCount); + SERIALISE_ELEMENT_ARRAY(pShaders, stageCount).Important(); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + if(IsActiveReplaying(m_State)) + { + if(InRerecordRange(m_LastCmdBufferID)) + { + commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); + + { + VulkanRenderState &renderstate = GetCmdRenderState(); + + for(uint32_t i = 0; i < stageCount; i++) + { + int stageIndex = StageIndex(pStages[i]); + + // calling vkCmdBindShadersEXT disturbs the corresponding pipeline bind points + // such that any pipelines previously bound to those points are no longer bound + if(stageIndex == (int)ShaderStage::Compute) + { + renderstate.compute.pipeline = ResourceId(); + } + else + { + renderstate.graphics.pipeline = ResourceId(); + } + } + } + } + else + { + commandBuffer = VK_NULL_HANDLE; + } + } + else + { + // track while reading since Serialise_vkCmdBindPipeline does as well + for(uint32_t i = 0; i < stageCount; i++) + { + int stageIndex = StageIndex(pStages[i]); + + if(stageIndex == (int)ShaderStage::Compute) + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.pipeline = ResourceId(); + } + else + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.graphics.pipeline = ResourceId(); + } + } + } + + if(commandBuffer != VK_NULL_HANDLE) + ObjDisp(commandBuffer) + ->CmdBindShadersEXT(Unwrap(commandBuffer), stageCount, pStages, + UnwrapArray(pShaders, stageCount)); + } + + return true; +} + +void WrappedVulkan::vkCmdBindShadersEXT(VkCommandBuffer commandBuffer, uint32_t stageCount, + const VkShaderStageFlagBits *pStages, + const VkShaderEXT *pShaders) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL(ObjDisp(commandBuffer) + ->CmdBindShadersEXT(Unwrap(commandBuffer), stageCount, pStages, + UnwrapArray(pShaders, stageCount))); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdBindShadersEXT); + Serialise_vkCmdBindShadersEXT(ser, commandBuffer, stageCount, pStages, pShaders); + + record->AddChunk(scope.Get(&record->cmdInfo->alloc)); + if(pShaders) + { + for(uint32_t i = 0; i < stageCount; i++) + { + // binding NULL is legal + if(pShaders[i] != VK_NULL_HANDLE) + record->MarkResourceFrameReferenced(GetResID(pShaders[i]), eFrameRef_Read); + } + } + } +} + INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateCommandPool, VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *, VkCommandPool *pCommandPool); @@ -8196,3 +8305,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyAccelerationStructureToMemoryKHR, INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyMemoryToAccelerationStructureKHR, VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) + +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindShadersEXT, VkCommandBuffer commandBuffer, + uint32_t stageCount, const VkShaderStageFlagBits *pStages, + const VkShaderEXT *pShaders); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index e570e2db5..20d98fff6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3312,6 +3312,15 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(nestedCommandBufferSimultaneousUse); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceShaderObjectFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(shaderObject); + + m_ShaderObject = ext->shaderObject != VK_FALSE; + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp) diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index 668ea1012..2097ece6b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -1228,3 +1228,9 @@ void WrappedVulkan::vkGetDeviceAccelerationStructureCompatibilityKHR( { *pCompatibility = VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR; } + +VkResult WrappedVulkan::vkGetShaderBinaryDataEXT(VkDevice device, VkShaderEXT shader, + size_t *pDataSize, void *pData) +{ + return VK_ERROR_INITIALIZATION_FAILED; +} diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 88094a495..63afa6ea8 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -185,6 +185,7 @@ DESTROY_IMPL(VkQueryPool, DestroyQueryPool) DESTROY_IMPL(VkDescriptorUpdateTemplate, DestroyDescriptorUpdateTemplate) DESTROY_IMPL(VkSamplerYcbcrConversion, DestroySamplerYcbcrConversion) DESTROY_IMPL(VkAccelerationStructureKHR, DestroyAccelerationStructureKHR) +DESTROY_IMPL(VkShaderEXT, DestroyShaderEXT) #undef DESTROY_IMPL @@ -573,6 +574,13 @@ bool WrappedVulkan::ReleaseResource(WrappedVkRes *res) vt->DestroyAccelerationStructureKHR(Unwrap(dev), real, NULL); break; } + case eResShaderEXT: + { + VkShaderEXT real = nondisp->real.As(); + GetResourceManager()->ReleaseWrappedResource(VkShaderEXT(handle)); + vt->DestroyShaderEXT(Unwrap(dev), real, NULL); + break; + } } return true; @@ -2021,6 +2029,7 @@ static ObjData GetObjData(VkObjectType objType, uint64_t object) case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR: ret.record = GetRecord((VkAccelerationStructureKHR)object); break; + case VK_OBJECT_TYPE_SHADER_EXT: ret.record = GetRecord((VkShaderEXT)object); break; ///////////////////////////// // special cases @@ -2065,7 +2074,6 @@ static ObjData GetObjData(VkObjectType objType, uint64_t object) case VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA: case VK_OBJECT_TYPE_MICROMAP_EXT: case VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV: - case VK_OBJECT_TYPE_SHADER_EXT: case VK_OBJECT_TYPE_UNKNOWN: case VK_OBJECT_TYPE_VIDEO_SESSION_KHR: case VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR: @@ -2284,6 +2292,9 @@ bool WrappedVulkan::Serialise_vkDebugMarkerSetObjectNameEXT( case eResAccelerationStructureKHR: type = VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT; break; + case eResShaderEXT: + RDCWARN("There is no VkDebugReportObjectTypeEXT for VkShaderEXT"); + break; } if(ObjDisp(m_Device)->DebugMarkerSetObjectNameEXT && @@ -2474,6 +2485,7 @@ bool WrappedVulkan::Serialise_vkSetDebugUtilsObjectNameEXT( case eResDescUpdateTemplate: type = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE; break; case eResSamplerConversion: type = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION; break; case eResAccelerationStructureKHR: type = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR; break; + case eResShaderEXT: type = VK_OBJECT_TYPE_SHADER_EXT; break; } if(ObjDisp(m_Device)->SetDebugUtilsObjectNameEXT && type != VK_OBJECT_TYPE_UNKNOWN && diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index e838535be..8a148f558 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -89,6 +89,41 @@ VkGraphicsPipelineCreateInfo *WrappedVulkan::UnwrapInfos(CaptureState state, return unwrappedInfos; } +template <> +VkShaderCreateInfoEXT *WrappedVulkan::UnwrapInfos(CaptureState state, + const VkShaderCreateInfoEXT *info, uint32_t count) +{ + // request memory for infos, descriptor set layouts, and next chain + size_t memSize = sizeof(VkShaderCreateInfoEXT) * count; + for(uint32_t i = 0; i < count; i++) + { + memSize += sizeof(VkDescriptorSetLayout) * info[i].setLayoutCount; + memSize += GetNextPatchSize(info[i].pNext); + } + + byte *tempMem = GetTempMemory(memSize); + + // keep shader infos first in the memory, then descriptor set layouts, then next chain + VkShaderCreateInfoEXT *unwrappedInfos = (VkShaderCreateInfoEXT *)tempMem; + tempMem = (byte *)(unwrappedInfos + count); + + for(uint32_t i = 0; i < count; i++) + { + VkDescriptorSetLayout *unwrappedLayouts = (VkDescriptorSetLayout *)tempMem; + tempMem = (byte *)(unwrappedLayouts + info[i].setLayoutCount); + if(info[i].pSetLayouts) + for(uint32_t j = 0; j < info[i].setLayoutCount; j++) + unwrappedLayouts[j] = Unwrap(info[i].pSetLayouts[j]); + + unwrappedInfos[i] = info[i]; + unwrappedInfos[i].pSetLayouts = info[i].pSetLayouts ? unwrappedLayouts : NULL; + + UnwrapNextChain(state, "VkShaderCreateInfoEXT", tempMem, (VkBaseInStructure *)&unwrappedInfos[i]); + } + + return unwrappedInfos; +} + template <> VkPipelineLayoutCreateInfo WrappedVulkan::UnwrapInfo(const VkPipelineLayoutCreateInfo *info) { @@ -329,6 +364,133 @@ VkResult WrappedVulkan::vkCreateShaderModule(VkDevice device, return ret; } +template +bool WrappedVulkan::Serialise_vkCreateShadersEXT(SerialiserType &ser, VkDevice device, + uint32_t createInfoCount, + const VkShaderCreateInfoEXT *pCreateInfos, + const VkAllocationCallbacks *pAllocator, + VkShaderEXT *pShaders) +{ + SERIALISE_ELEMENT(device); + SERIALISE_ELEMENT(createInfoCount); + SERIALISE_ELEMENT_LOCAL(CreateInfo, *pCreateInfos).Important(); + SERIALISE_ELEMENT_OPT(pAllocator); + SERIALISE_ELEMENT_LOCAL(Shader, GetResID(*pShaders)).TypedAs("VkShaderEXT"_lit); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + VkShaderEXT sh = VK_NULL_HANDLE; + + // this function is called from a loop in vkCreateShadersEXT, so we only need to unwrap one + // then it gets replayed as if each shader was created individually + VkShaderCreateInfoEXT *unwrapped = UnwrapInfos(m_State, &CreateInfo, 1); + + VkResult ret = ObjDisp(device)->CreateShadersEXT(Unwrap(device), 1, unwrapped, NULL, &sh); + + AddResource(Shader, ResourceType::Shader, "Shader"); + + if(ret != VK_SUCCESS) + { + SET_ERROR_RESULT(m_FailedReplayResult, ResultCode::APIReplayFailed, + "Failed creating shader object, VkResult: %s", ToStr(ret).c_str()); + return false; + } + else + { + ResourceId live; + if(GetResourceManager()->HasWrapper(ToTypedHandle(sh))) + { + live = GetResourceManager()->GetNonDispWrapper(sh)->id; + + // destroy this instance of the duplicate, as we must have matching create/destroy + // calls and there won't be a wrapped resource hanging around to destroy this one. + ObjDisp(device)->DestroyShaderEXT(Unwrap(device), sh, NULL); + + // whenever the new ID is requested, return the old ID, via replacements. + GetResourceManager()->ReplaceResource(Shader, GetResourceManager()->GetOriginalID(live)); + } + else + { + live = GetResourceManager()->WrapResource(Unwrap(device), sh); + GetResourceManager()->AddLiveResource(Shader, sh); + } + } + + // document all derived resources + DerivedResource(device, Shader); + if(CreateInfo.pSetLayouts) + { + for(uint32_t i = 0; i < CreateInfo.setLayoutCount; i++) + DerivedResource(CreateInfo.pSetLayouts[i], Shader); + } + } + + return true; +} + +VkResult WrappedVulkan::vkCreateShadersEXT(VkDevice device, uint32_t createInfoCount, + const VkShaderCreateInfoEXT *pCreateInfos, + const VkAllocationCallbacks *, VkShaderEXT *pShaders) +{ + VkShaderCreateInfoEXT *unwrapped = UnwrapInfos(m_State, pCreateInfos, createInfoCount); + + // to be extra sure just in case the driver doesn't, set shader objects to VK_NULL_HANDLE first. + for(uint32_t i = 0; i < createInfoCount; i++) + pShaders[i] = VK_NULL_HANDLE; + + VkResult ret; + SERIALISE_TIME_CALL(ret = ObjDisp(device)->CreateShadersEXT(Unwrap(device), createInfoCount, + unwrapped, NULL, pShaders)); + + if(ret == VK_SUCCESS) + { + for(uint32_t i = 0; i < createInfoCount; i++) + { + // any shader objects that are VK_NULL_HANDLE, silently ignore as they failed but we might + // have successfully created some before then. + if(pShaders[i] == VK_NULL_HANDLE) + continue; + + ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), pShaders[i]); + + // background or active capture state + if(IsCaptureMode(m_State)) + { + Chunk *chunk = NULL; + + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCreateShadersEXT); + Serialise_vkCreateShadersEXT(ser, device, 1, &pCreateInfos[i], NULL, &pShaders[i]); + + chunk = scope.Get(); + } + + VkResourceRecord *record = GetResourceManager()->AddResourceRecord(pShaders[i]); + record->AddChunk(chunk); + + if(pCreateInfos[i].pSetLayouts) + { + for(uint32_t s = 0; s < pCreateInfos[i].setLayoutCount; s++) + { + VkResourceRecord *layoutrecord = GetRecord(pCreateInfos[i].pSetLayouts[s]); + record->AddParent(layoutrecord); + } + } + } + else + { + GetResourceManager()->AddLiveResource(id, pShaders[i]); + } + } + } + + return ret; +} + // Pipeline functions template @@ -975,3 +1137,7 @@ INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateComputePipelines, VkDevice dev VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *, VkPipeline *pPipelines); + +INSTANTIATE_FUNCTION_SERIALISED(VkResult, vkCreateShadersEXT, VkDevice device, + uint32_t createInfoCount, const VkShaderCreateInfoEXT *pCreateInfos, + const VkAllocationCallbacks *, VkShaderEXT *pShaders);