From c880def5ef137f7408837eaf3fe536552ff4d48d Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 8 May 2018 11:21:29 +0100 Subject: [PATCH] Check that capture's enabled physical devices are available on replay * This will fail more gracefully than the logical device failing to create. --- .../vulkan/wrappers/vk_device_funcs.cpp | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index c1524d8e8..16d1a7f56 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1166,6 +1166,70 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi VkPhysicalDeviceFeatures availFeatures = {0}; ObjDisp(physicalDevice)->GetPhysicalDeviceFeatures(Unwrap(physicalDevice), &availFeatures); +#define CHECK_PHYS_FEATURE(feature) \ + if(enabledFeatures.feature && !availFeatures.feature) \ + { \ + m_FailedReplayStatus = ReplayStatus::APIHardwareUnsupported; \ + RDCERR("Capture requires physical device feature '" #feature "' which is not supported"); \ + return false; \ + } + + CHECK_PHYS_FEATURE(robustBufferAccess); + CHECK_PHYS_FEATURE(fullDrawIndexUint32); + CHECK_PHYS_FEATURE(imageCubeArray); + CHECK_PHYS_FEATURE(independentBlend); + CHECK_PHYS_FEATURE(geometryShader); + CHECK_PHYS_FEATURE(tessellationShader); + CHECK_PHYS_FEATURE(sampleRateShading); + CHECK_PHYS_FEATURE(dualSrcBlend); + CHECK_PHYS_FEATURE(logicOp); + CHECK_PHYS_FEATURE(multiDrawIndirect); + CHECK_PHYS_FEATURE(drawIndirectFirstInstance); + CHECK_PHYS_FEATURE(depthClamp); + CHECK_PHYS_FEATURE(depthBiasClamp); + CHECK_PHYS_FEATURE(fillModeNonSolid); + CHECK_PHYS_FEATURE(depthBounds); + CHECK_PHYS_FEATURE(wideLines); + CHECK_PHYS_FEATURE(largePoints); + CHECK_PHYS_FEATURE(alphaToOne); + CHECK_PHYS_FEATURE(multiViewport); + CHECK_PHYS_FEATURE(samplerAnisotropy); + CHECK_PHYS_FEATURE(textureCompressionETC2); + CHECK_PHYS_FEATURE(textureCompressionASTC_LDR); + CHECK_PHYS_FEATURE(textureCompressionBC); + CHECK_PHYS_FEATURE(occlusionQueryPrecise); + CHECK_PHYS_FEATURE(pipelineStatisticsQuery); + CHECK_PHYS_FEATURE(vertexPipelineStoresAndAtomics); + CHECK_PHYS_FEATURE(fragmentStoresAndAtomics); + CHECK_PHYS_FEATURE(shaderTessellationAndGeometryPointSize); + CHECK_PHYS_FEATURE(shaderImageGatherExtended); + CHECK_PHYS_FEATURE(shaderStorageImageExtendedFormats); + CHECK_PHYS_FEATURE(shaderStorageImageMultisample); + CHECK_PHYS_FEATURE(shaderStorageImageReadWithoutFormat); + CHECK_PHYS_FEATURE(shaderStorageImageWriteWithoutFormat); + CHECK_PHYS_FEATURE(shaderUniformBufferArrayDynamicIndexing); + CHECK_PHYS_FEATURE(shaderSampledImageArrayDynamicIndexing); + CHECK_PHYS_FEATURE(shaderStorageBufferArrayDynamicIndexing); + CHECK_PHYS_FEATURE(shaderStorageImageArrayDynamicIndexing); + CHECK_PHYS_FEATURE(shaderClipDistance); + CHECK_PHYS_FEATURE(shaderCullDistance); + CHECK_PHYS_FEATURE(shaderFloat64); + CHECK_PHYS_FEATURE(shaderInt64); + CHECK_PHYS_FEATURE(shaderInt16); + CHECK_PHYS_FEATURE(shaderResourceResidency); + CHECK_PHYS_FEATURE(shaderResourceMinLod); + CHECK_PHYS_FEATURE(sparseBinding); + CHECK_PHYS_FEATURE(sparseResidencyBuffer); + CHECK_PHYS_FEATURE(sparseResidencyImage2D); + CHECK_PHYS_FEATURE(sparseResidencyImage3D); + CHECK_PHYS_FEATURE(sparseResidency2Samples); + CHECK_PHYS_FEATURE(sparseResidency4Samples); + CHECK_PHYS_FEATURE(sparseResidency8Samples); + CHECK_PHYS_FEATURE(sparseResidency16Samples); + CHECK_PHYS_FEATURE(sparseResidencyAliased); + CHECK_PHYS_FEATURE(variableMultisampleRate); + CHECK_PHYS_FEATURE(inheritedQueries); + if(availFeatures.depthClamp) enabledFeatures.depthClamp = true; else