From 2b7070eddfb51db494c6d763ee06dca86894b96c Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 11 Oct 2018 14:52:50 +0100 Subject: [PATCH] Allow a few EXT & IHV vulkan extensions * VK_EXT_astc_decode_mode * VK_EXT_swapchain_colorspace - this will cause slight artifacts as we won't interpret pixels in the right color space, but it's minor. * VK_EXT_validation_cache - we don't serialise this but we do allow it during capture and pass-through straight. We don't wrap the VkValidationCacheEXT object at all which makes support simpler. * VK_EXT_external_memory_dma_buf - this is just a new memory type for external memory, we don't need to do anything special to handle it. * VK_AMD_mixed_attachment_samples & VK_AMD_shader_core_properties - these are no-op once enabled * Many shader-only extensions: - VK_AMD_gpu_shader_int16 - VK_AMD_shader_fragment_mask - VK_AMD_image_load_store_lod - VK_AMD_texture_gather_bias_lod - VK_NV_compute_shader_derivatives - VK_NV_fragment_shader_barycentric - VK_NV_geometry_shader_passthrough - VK_NV_sample_mask_override_coverage - VK_NV_shader_image_footprint - VK_NV_shader_subgroup_partitioned - VK_NV_viewport_array2 --- renderdoc/driver/vulkan/vk_common.cpp | 10 ++++ renderdoc/driver/vulkan/vk_common.h | 2 + renderdoc/driver/vulkan/vk_core.cpp | 56 +++++++++++++++++++ renderdoc/driver/vulkan/vk_core.h | 15 +++++ renderdoc/driver/vulkan/vk_hookset_defs.h | 16 +++++- renderdoc/driver/vulkan/vk_serialise.cpp | 32 ++++++++++- .../vulkan/wrappers/vk_device_funcs.cpp | 4 ++ .../driver/vulkan/wrappers/vk_get_funcs.cpp | 31 ++++++++++ .../vulkan/wrappers/vk_shader_funcs.cpp | 8 ++- 9 files changed, 171 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index a25601793..09caffc10 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -467,6 +467,10 @@ size_t GetNextPatchSize(const void *pNext) else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO) memSize += sizeof(VkDeviceGroupRenderPassBeginInfo); + // VkShaderModuleCreateInfo + if(next->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT) + memSize += sizeof(VkValidationCacheCreateInfoEXT); + next = next->pNext; } @@ -786,6 +790,12 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, CopyNextChainedStruct(tempMem, nextInput, nextChainTail); } + else if(nextInput->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT) + { + if(IsCaptureMode(state)) + CopyNextChainedStruct(tempMem, nextInput, + nextChainTail); + } else { RDCERR("unrecognised struct %d in %s pNext chain", nextInput->sType, structName); diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 18c81971c..8132c6a25 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -652,6 +652,8 @@ DECLARE_REFLECTION_STRUCT(VkDeviceGroupRenderPassBeginInfo); DECLARE_REFLECTION_STRUCT(VkMemoryAllocateFlagsInfo); DECLARE_REFLECTION_STRUCT(VkProtectedSubmitInfo); DECLARE_REFLECTION_STRUCT(VkImageFormatListCreateInfoKHR); +DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT); +DECLARE_REFLECTION_STRUCT(VkShaderModuleValidationCacheCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkDispatchIndirectCommand); DECLARE_REFLECTION_STRUCT(VkDrawIndirectCommand); DECLARE_REFLECTION_STRUCT(VkDrawIndexedIndirectCommand); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 3d868a397..339aacc4a 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -575,24 +575,46 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME, VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION, }, + { + VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME, VK_AMD_GPU_SHADER_INT16_SPEC_VERSION, + }, + { + VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME, VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION, + }, { VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME, VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION, }, { VK_AMD_SHADER_BALLOT_EXTENSION_NAME, VK_AMD_SHADER_BALLOT_SPEC_VERSION, }, + { + VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME, VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION, + }, { VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME, VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION, }, + { + VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME, VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION, + }, + { + VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME, + VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION, + }, { VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME, VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION, }, + { + VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME, VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION, + }, #ifdef VK_EXT_acquire_xlib_display { VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME, VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION, }, #endif + { + VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, + }, { VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION, @@ -618,6 +640,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION, }, + { + VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME, VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION, + }, { VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION, }, @@ -643,6 +668,12 @@ static const VkExtensionProperties supportedExtensions[] = { VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION, }, + { + VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION, + }, + { + VK_EXT_VALIDATION_CACHE_EXTENSION_NAME, VK_EXT_VALIDATION_CACHE_SPEC_VERSION, + }, { VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME, VK_EXT_VALIDATION_FLAGS_SPEC_VERSION, }, @@ -834,6 +865,9 @@ static const VkExtensionProperties supportedExtensions[] = { VK_MVK_MACOS_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_SPEC_VERSION, }, #endif + { + VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION, + }, { VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION, }, @@ -849,6 +883,28 @@ static const VkExtensionProperties supportedExtensions[] = { VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION, }, #endif + { + VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, + VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION, + }, + { + VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME, + VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION, + }, + { + VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME, + VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION, + }, + { + VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION, + }, + { + VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME, + VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION, + }, + { + VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION, + }, #ifdef VK_NV_win32_keyed_mutex { VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME, VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 1c32e862e..3eef44315 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1897,4 +1897,19 @@ public: VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + + // VK_EXT_validation_cache + VkResult vkCreateValidationCacheEXT(VkDevice device, + const VkValidationCacheCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkValidationCacheEXT *pValidationCache); + + void vkDestroyValidationCacheEXT(VkDevice device, VkValidationCacheEXT validationCache, + const VkAllocationCallbacks *pAllocator); + + VkResult vkMergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache, + uint32_t srcCacheCount, const VkValidationCacheEXT *pSrcCaches); + + VkResult vkGetValidationCacheDataEXT(VkDevice device, VkValidationCacheEXT validationCache, + size_t *pDataSize, void *pData); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 971f21b5e..3d0c1b6f0 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -349,7 +349,8 @@ CheckExt(KHR_sampler_ycbcr_conversion, VK11); \ CheckExt(KHR_device_group, VK11); \ CheckExt(MVK_moltenvk, VKXX); \ - CheckExt(KHR_draw_indirect_count, VKXX); + CheckExt(KHR_draw_indirect_count, VKXX); \ + CheckExt(EXT_validation_cache, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ @@ -461,6 +462,10 @@ HookInitExtension(protected_memory, GetDeviceQueue2); \ HookInitExtension(KHR_draw_indirect_count, CmdDrawIndirectCountKHR); \ HookInitExtension(KHR_draw_indirect_count, CmdDrawIndexedIndirectCountKHR); \ + HookInitExtension(EXT_validation_cache, CreateValidationCacheEXT); \ + HookInitExtension(EXT_validation_cache, DestroyValidationCacheEXT); \ + HookInitExtension(EXT_validation_cache, MergeValidationCachesEXT); \ + HookInitExtension(EXT_validation_cache, GetValidationCacheDataEXT); \ HookInitDevice_PlatformSpecific() #define DefineHooks() \ @@ -977,6 +982,15 @@ HookDefine7(void, vkCmdDrawIndexedIndirectCountKHR, VkCommandBuffer, commandBuffer, VkBuffer, \ buffer, VkDeviceSize, offset, VkBuffer, countBuffer, VkDeviceSize, \ countBufferOffset, uint32_t, maxDrawCount, uint32_t, stride); \ + HookDefine4(VkResult, vkCreateValidationCacheEXT, VkDevice, device, \ + const VkValidationCacheCreateInfoEXT *, pCreateInfo, const VkAllocationCallbacks *, \ + pAllocator, VkValidationCacheEXT *, pValidationCache); \ + HookDefine3(void, vkDestroyValidationCacheEXT, VkDevice, device, VkValidationCacheEXT, \ + validationCache, const VkAllocationCallbacks *, pAllocator); \ + HookDefine4(VkResult, vkMergeValidationCachesEXT, VkDevice, device, VkValidationCacheEXT, \ + dstCache, uint32_t, srcCacheCount, const VkValidationCacheEXT *, pSrcCaches); \ + HookDefine4(VkResult, vkGetValidationCacheDataEXT, VkDevice, device, VkValidationCacheEXT, \ + validationCache, size_t *, pDataSize, void *, pData); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 723c82f0b..be5c8c6cc 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -255,7 +255,14 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo) \ \ /* VK_KHR_image_format_list */ \ - PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR) + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR) \ + \ + /* VK_EXT_astc_decode_mode */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT) \ + \ + /* VK_EXT_validation_cache */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, \ + VkShaderModuleValidationCacheCreateInfoEXT) template static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext) @@ -2532,6 +2539,27 @@ void Deserialise(const VkImageFormatListCreateInfoKHR &el) delete[] el.pViewFormats; } +template +void DoSerialise(SerialiserType &ser, VkImageViewASTCDecodeModeEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(decodeMode); +} + +template +void DoSerialise(SerialiserType &ser, VkShaderModuleValidationCacheCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + // we skip this, because it's unwrapped and has no ResourceId. The presence of this struct is + // enough + // SERIALISE_MEMBER(validationCache); +} + template void DoSerialise(SerialiserType &ser, VkDispatchIndirectCommand &el) { @@ -3147,6 +3175,8 @@ INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo); INSTANTIATE_SERIALISE_TYPE(VkMemoryAllocateFlagsInfo); INSTANTIATE_SERIALISE_TYPE(VkProtectedSubmitInfo); INSTANTIATE_SERIALISE_TYPE(VkImageFormatListCreateInfoKHR); +INSTANTIATE_SERIALISE_TYPE(VkImageViewASTCDecodeModeEXT); +INSTANTIATE_SERIALISE_TYPE(VkShaderModuleValidationCacheCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkDispatchIndirectCommand); INSTANTIATE_SERIALISE_TYPE(VkDrawIndirectCommand); INSTANTIATE_SERIALISE_TYPE(VkDrawIndexedIndirectCommand); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 9c135e8ac..4bef9c051 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -997,6 +997,10 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) continue; + // don't include the validation cache extension + if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_VALIDATION_CACHE_EXTENSION_NAME)) + continue; + // don't include direct-display WSI extensions if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) || !strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME)) diff --git a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp index ca44e20e7..f5feb6f08 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_get_funcs.cpp @@ -643,4 +643,35 @@ void WrappedVulkan::vkGetDeviceGroupPeerMemoryFeatures(VkDevice device, uint32_t { return ObjDisp(device)->GetDeviceGroupPeerMemoryFeatures( Unwrap(device), heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures); +} + +VkResult WrappedVulkan::vkCreateValidationCacheEXT(VkDevice device, + const VkValidationCacheCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkValidationCacheEXT *pValidationCache) +{ + return ObjDisp(device)->CreateValidationCacheEXT(Unwrap(device), pCreateInfo, pAllocator, + pValidationCache); +} + +void WrappedVulkan::vkDestroyValidationCacheEXT(VkDevice device, VkValidationCacheEXT validationCache, + const VkAllocationCallbacks *pAllocator) +{ + return ObjDisp(device)->DestroyValidationCacheEXT(Unwrap(device), validationCache, pAllocator); +} + +VkResult WrappedVulkan::vkMergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache, + uint32_t srcCacheCount, + const VkValidationCacheEXT *pSrcCaches) +{ + return ObjDisp(device)->MergeValidationCachesEXT(Unwrap(device), dstCache, srcCacheCount, + pSrcCaches); +} + +VkResult WrappedVulkan::vkGetValidationCacheDataEXT(VkDevice device, + VkValidationCacheEXT validationCache, + size_t *pDataSize, void *pData) +{ + return ObjDisp(device)->GetValidationCacheDataEXT(Unwrap(device), validationCache, pDataSize, + pData); } \ No newline at end of file diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index 434612b75..04bd4aab2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -218,7 +218,13 @@ bool WrappedVulkan::Serialise_vkCreateShaderModule(SerialiserType &ser, VkDevice { VkShaderModule sh = VK_NULL_HANDLE; - VkResult ret = ObjDisp(device)->CreateShaderModule(Unwrap(device), &CreateInfo, NULL, &sh); + VkShaderModuleCreateInfo patched = CreateInfo; + + byte *tempMem = GetTempMemory(GetNextPatchSize(patched.pNext)); + + UnwrapNextChain(m_State, "VkShaderModuleCreateInfo", tempMem, (VkBaseInStructure *)&patched); + + VkResult ret = ObjDisp(device)->CreateShaderModule(Unwrap(device), &patched, NULL, &sh); if(ret != VK_SUCCESS) {