1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 22:29:15 +01:00

[dxvk] dxvk_adapter: implement macro to check for feature need in checkFeatureSupport

This commit is contained in:
Lilium 2023-05-22 18:01:24 +02:00 committed by Joshie
parent 633f6663a4
commit d5c6ae2e4d

View File

@ -165,187 +165,103 @@ namespace dxvk {
return queues; return queues;
} }
#define CHECK_FEATURE_NEED(feature) \
(m_deviceFeatures.feature \
|| !required.feature)
bool DxvkAdapter::checkFeatureSupport(const DxvkDeviceFeatures& required) const { bool DxvkAdapter::checkFeatureSupport(const DxvkDeviceFeatures& required) const {
return (m_deviceFeatures.core.features.robustBufferAccess return CHECK_FEATURE_NEED(core.features.robustBufferAccess)
|| !required.core.features.robustBufferAccess) && CHECK_FEATURE_NEED(core.features.fullDrawIndexUint32)
&& (m_deviceFeatures.core.features.fullDrawIndexUint32 && CHECK_FEATURE_NEED(core.features.imageCubeArray)
|| !required.core.features.fullDrawIndexUint32) && CHECK_FEATURE_NEED(core.features.independentBlend)
&& (m_deviceFeatures.core.features.imageCubeArray && CHECK_FEATURE_NEED(core.features.geometryShader)
|| !required.core.features.imageCubeArray) && CHECK_FEATURE_NEED(core.features.tessellationShader)
&& (m_deviceFeatures.core.features.independentBlend && CHECK_FEATURE_NEED(core.features.sampleRateShading)
|| !required.core.features.independentBlend) && CHECK_FEATURE_NEED(core.features.dualSrcBlend)
&& (m_deviceFeatures.core.features.geometryShader && CHECK_FEATURE_NEED(core.features.logicOp)
|| !required.core.features.geometryShader) && CHECK_FEATURE_NEED(core.features.multiDrawIndirect)
&& (m_deviceFeatures.core.features.tessellationShader && CHECK_FEATURE_NEED(core.features.drawIndirectFirstInstance)
|| !required.core.features.tessellationShader) && CHECK_FEATURE_NEED(core.features.depthClamp)
&& (m_deviceFeatures.core.features.sampleRateShading && CHECK_FEATURE_NEED(core.features.depthBiasClamp)
|| !required.core.features.sampleRateShading) && CHECK_FEATURE_NEED(core.features.fillModeNonSolid)
&& (m_deviceFeatures.core.features.dualSrcBlend && CHECK_FEATURE_NEED(core.features.depthBounds)
|| !required.core.features.dualSrcBlend) && CHECK_FEATURE_NEED(core.features.wideLines)
&& (m_deviceFeatures.core.features.logicOp && CHECK_FEATURE_NEED(core.features.largePoints)
|| !required.core.features.logicOp) && CHECK_FEATURE_NEED(core.features.alphaToOne)
&& (m_deviceFeatures.core.features.multiDrawIndirect && CHECK_FEATURE_NEED(core.features.multiViewport)
|| !required.core.features.multiDrawIndirect) && CHECK_FEATURE_NEED(core.features.samplerAnisotropy)
&& (m_deviceFeatures.core.features.drawIndirectFirstInstance && CHECK_FEATURE_NEED(core.features.textureCompressionETC2)
|| !required.core.features.drawIndirectFirstInstance) && CHECK_FEATURE_NEED(core.features.textureCompressionASTC_LDR)
&& (m_deviceFeatures.core.features.depthClamp && CHECK_FEATURE_NEED(core.features.textureCompressionBC)
|| !required.core.features.depthClamp) && CHECK_FEATURE_NEED(core.features.occlusionQueryPrecise)
&& (m_deviceFeatures.core.features.depthBiasClamp && CHECK_FEATURE_NEED(core.features.pipelineStatisticsQuery)
|| !required.core.features.depthBiasClamp) && CHECK_FEATURE_NEED(core.features.vertexPipelineStoresAndAtomics)
&& (m_deviceFeatures.core.features.fillModeNonSolid && CHECK_FEATURE_NEED(core.features.fragmentStoresAndAtomics)
|| !required.core.features.fillModeNonSolid) && CHECK_FEATURE_NEED(core.features.shaderTessellationAndGeometryPointSize)
&& (m_deviceFeatures.core.features.depthBounds && CHECK_FEATURE_NEED(core.features.shaderImageGatherExtended)
|| !required.core.features.depthBounds) && CHECK_FEATURE_NEED(core.features.shaderStorageImageExtendedFormats)
&& (m_deviceFeatures.core.features.wideLines && CHECK_FEATURE_NEED(core.features.shaderStorageImageMultisample)
|| !required.core.features.wideLines) && CHECK_FEATURE_NEED(core.features.shaderStorageImageReadWithoutFormat)
&& (m_deviceFeatures.core.features.largePoints && CHECK_FEATURE_NEED(core.features.shaderStorageImageWriteWithoutFormat)
|| !required.core.features.largePoints) && CHECK_FEATURE_NEED(core.features.shaderUniformBufferArrayDynamicIndexing)
&& (m_deviceFeatures.core.features.alphaToOne && CHECK_FEATURE_NEED(core.features.shaderSampledImageArrayDynamicIndexing)
|| !required.core.features.alphaToOne) && CHECK_FEATURE_NEED(core.features.shaderStorageBufferArrayDynamicIndexing)
&& (m_deviceFeatures.core.features.multiViewport && CHECK_FEATURE_NEED(core.features.shaderStorageImageArrayDynamicIndexing)
|| !required.core.features.multiViewport) && CHECK_FEATURE_NEED(core.features.shaderClipDistance)
&& (m_deviceFeatures.core.features.samplerAnisotropy && CHECK_FEATURE_NEED(core.features.shaderCullDistance)
|| !required.core.features.samplerAnisotropy) && CHECK_FEATURE_NEED(core.features.shaderFloat64)
&& (m_deviceFeatures.core.features.textureCompressionETC2 && CHECK_FEATURE_NEED(core.features.shaderInt64)
|| !required.core.features.textureCompressionETC2) && CHECK_FEATURE_NEED(core.features.shaderInt16)
&& (m_deviceFeatures.core.features.textureCompressionASTC_LDR && CHECK_FEATURE_NEED(core.features.shaderResourceResidency)
|| !required.core.features.textureCompressionASTC_LDR) && CHECK_FEATURE_NEED(core.features.shaderResourceMinLod)
&& (m_deviceFeatures.core.features.textureCompressionBC && CHECK_FEATURE_NEED(core.features.sparseBinding)
|| !required.core.features.textureCompressionBC) && CHECK_FEATURE_NEED(core.features.sparseResidencyBuffer)
&& (m_deviceFeatures.core.features.occlusionQueryPrecise && CHECK_FEATURE_NEED(core.features.sparseResidencyImage2D)
|| !required.core.features.occlusionQueryPrecise) && CHECK_FEATURE_NEED(core.features.sparseResidencyImage3D)
&& (m_deviceFeatures.core.features.pipelineStatisticsQuery && CHECK_FEATURE_NEED(core.features.sparseResidency2Samples)
|| !required.core.features.pipelineStatisticsQuery) && CHECK_FEATURE_NEED(core.features.sparseResidency4Samples)
&& (m_deviceFeatures.core.features.vertexPipelineStoresAndAtomics && CHECK_FEATURE_NEED(core.features.sparseResidency8Samples)
|| !required.core.features.vertexPipelineStoresAndAtomics) && CHECK_FEATURE_NEED(core.features.sparseResidency16Samples)
&& (m_deviceFeatures.core.features.fragmentStoresAndAtomics && CHECK_FEATURE_NEED(core.features.sparseResidencyAliased)
|| !required.core.features.fragmentStoresAndAtomics) && CHECK_FEATURE_NEED(core.features.variableMultisampleRate)
&& (m_deviceFeatures.core.features.shaderTessellationAndGeometryPointSize && CHECK_FEATURE_NEED(core.features.inheritedQueries)
|| !required.core.features.shaderTessellationAndGeometryPointSize) && CHECK_FEATURE_NEED(vk11.shaderDrawParameters)
&& (m_deviceFeatures.core.features.shaderImageGatherExtended && CHECK_FEATURE_NEED(vk12.samplerMirrorClampToEdge)
|| !required.core.features.shaderImageGatherExtended) && CHECK_FEATURE_NEED(vk12.drawIndirectCount)
&& (m_deviceFeatures.core.features.shaderStorageImageExtendedFormats && CHECK_FEATURE_NEED(vk12.hostQueryReset)
|| !required.core.features.shaderStorageImageExtendedFormats) && CHECK_FEATURE_NEED(vk12.timelineSemaphore)
&& (m_deviceFeatures.core.features.shaderStorageImageMultisample && CHECK_FEATURE_NEED(vk12.bufferDeviceAddress)
|| !required.core.features.shaderStorageImageMultisample) && CHECK_FEATURE_NEED(vk12.shaderOutputViewportIndex)
&& (m_deviceFeatures.core.features.shaderStorageImageReadWithoutFormat && CHECK_FEATURE_NEED(vk12.shaderOutputLayer)
|| !required.core.features.shaderStorageImageReadWithoutFormat) && CHECK_FEATURE_NEED(vk13.pipelineCreationCacheControl)
&& (m_deviceFeatures.core.features.shaderStorageImageWriteWithoutFormat && CHECK_FEATURE_NEED(vk13.shaderDemoteToHelperInvocation)
|| !required.core.features.shaderStorageImageWriteWithoutFormat) && CHECK_FEATURE_NEED(vk13.shaderZeroInitializeWorkgroupMemory)
&& (m_deviceFeatures.core.features.shaderUniformBufferArrayDynamicIndexing && CHECK_FEATURE_NEED(vk13.synchronization2)
|| !required.core.features.shaderUniformBufferArrayDynamicIndexing) && CHECK_FEATURE_NEED(vk13.dynamicRendering)
&& (m_deviceFeatures.core.features.shaderSampledImageArrayDynamicIndexing && CHECK_FEATURE_NEED(vk13.maintenance4)
|| !required.core.features.shaderSampledImageArrayDynamicIndexing) && CHECK_FEATURE_NEED(extAttachmentFeedbackLoopLayout.attachmentFeedbackLoopLayout)
&& (m_deviceFeatures.core.features.shaderStorageBufferArrayDynamicIndexing && CHECK_FEATURE_NEED(extConservativeRasterization)
|| !required.core.features.shaderStorageBufferArrayDynamicIndexing) && CHECK_FEATURE_NEED(extCustomBorderColor.customBorderColors)
&& (m_deviceFeatures.core.features.shaderStorageImageArrayDynamicIndexing && CHECK_FEATURE_NEED(extCustomBorderColor.customBorderColorWithoutFormat)
|| !required.core.features.shaderStorageImageArrayDynamicIndexing) && CHECK_FEATURE_NEED(extDepthClipEnable.depthClipEnable)
&& (m_deviceFeatures.core.features.shaderClipDistance && CHECK_FEATURE_NEED(extGraphicsPipelineLibrary.graphicsPipelineLibrary)
|| !required.core.features.shaderClipDistance) && CHECK_FEATURE_NEED(extMemoryBudget)
&& (m_deviceFeatures.core.features.shaderCullDistance && CHECK_FEATURE_NEED(extMemoryPriority.memoryPriority)
|| !required.core.features.shaderCullDistance) && CHECK_FEATURE_NEED(extNonSeamlessCubeMap.nonSeamlessCubeMap)
&& (m_deviceFeatures.core.features.shaderFloat64 && CHECK_FEATURE_NEED(extRobustness2.robustBufferAccess2)
|| !required.core.features.shaderFloat64) && CHECK_FEATURE_NEED(extRobustness2.robustImageAccess2)
&& (m_deviceFeatures.core.features.shaderInt64 && CHECK_FEATURE_NEED(extRobustness2.nullDescriptor)
|| !required.core.features.shaderInt64) && CHECK_FEATURE_NEED(extShaderModuleIdentifier.shaderModuleIdentifier)
&& (m_deviceFeatures.core.features.shaderInt16 && CHECK_FEATURE_NEED(extShaderStencilExport)
|| !required.core.features.shaderInt16) && CHECK_FEATURE_NEED(extSwapchainColorSpace)
&& (m_deviceFeatures.core.features.shaderResourceResidency && CHECK_FEATURE_NEED(extHdrMetadata)
|| !required.core.features.shaderResourceResidency) && CHECK_FEATURE_NEED(extTransformFeedback.transformFeedback)
&& (m_deviceFeatures.core.features.shaderResourceMinLod && CHECK_FEATURE_NEED(extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor)
|| !required.core.features.shaderResourceMinLod) && CHECK_FEATURE_NEED(extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor);
&& (m_deviceFeatures.core.features.sparseBinding
|| !required.core.features.sparseBinding)
&& (m_deviceFeatures.core.features.sparseResidencyBuffer
|| !required.core.features.sparseResidencyBuffer)
&& (m_deviceFeatures.core.features.sparseResidencyImage2D
|| !required.core.features.sparseResidencyImage2D)
&& (m_deviceFeatures.core.features.sparseResidencyImage3D
|| !required.core.features.sparseResidencyImage3D)
&& (m_deviceFeatures.core.features.sparseResidency2Samples
|| !required.core.features.sparseResidency2Samples)
&& (m_deviceFeatures.core.features.sparseResidency4Samples
|| !required.core.features.sparseResidency4Samples)
&& (m_deviceFeatures.core.features.sparseResidency8Samples
|| !required.core.features.sparseResidency8Samples)
&& (m_deviceFeatures.core.features.sparseResidency16Samples
|| !required.core.features.sparseResidency16Samples)
&& (m_deviceFeatures.core.features.sparseResidencyAliased
|| !required.core.features.sparseResidencyAliased)
&& (m_deviceFeatures.core.features.variableMultisampleRate
|| !required.core.features.variableMultisampleRate)
&& (m_deviceFeatures.core.features.inheritedQueries
|| !required.core.features.inheritedQueries)
&& (m_deviceFeatures.vk11.shaderDrawParameters
|| !required.vk11.shaderDrawParameters)
&& (m_deviceFeatures.vk12.samplerMirrorClampToEdge
|| !required.vk12.samplerMirrorClampToEdge)
&& (m_deviceFeatures.vk12.drawIndirectCount
|| !required.vk12.drawIndirectCount)
&& (m_deviceFeatures.vk12.hostQueryReset
|| !required.vk12.hostQueryReset)
&& (m_deviceFeatures.vk12.timelineSemaphore
|| !required.vk12.timelineSemaphore)
&& (m_deviceFeatures.vk12.bufferDeviceAddress
|| !required.vk12.bufferDeviceAddress)
&& (m_deviceFeatures.vk12.shaderOutputViewportIndex
|| !required.vk12.shaderOutputViewportIndex)
&& (m_deviceFeatures.vk12.shaderOutputLayer
|| !required.vk12.shaderOutputLayer)
&& (m_deviceFeatures.vk13.pipelineCreationCacheControl
|| !required.vk13.pipelineCreationCacheControl)
&& (m_deviceFeatures.vk13.shaderDemoteToHelperInvocation
|| !required.vk13.shaderDemoteToHelperInvocation)
&& (m_deviceFeatures.vk13.shaderZeroInitializeWorkgroupMemory
|| !required.vk13.shaderZeroInitializeWorkgroupMemory)
&& (m_deviceFeatures.vk13.synchronization2
|| !required.vk13.synchronization2)
&& (m_deviceFeatures.vk13.dynamicRendering
|| !required.vk13.dynamicRendering)
&& (m_deviceFeatures.vk13.maintenance4
|| !required.vk13.maintenance4)
&& (m_deviceFeatures.extAttachmentFeedbackLoopLayout.attachmentFeedbackLoopLayout
|| !required.extAttachmentFeedbackLoopLayout.attachmentFeedbackLoopLayout)
&& (m_deviceFeatures.extConservativeRasterization
|| !required.extConservativeRasterization)
&& (m_deviceFeatures.extCustomBorderColor.customBorderColors
|| !required.extCustomBorderColor.customBorderColors)
&& (m_deviceFeatures.extCustomBorderColor.customBorderColorWithoutFormat
|| !required.extCustomBorderColor.customBorderColorWithoutFormat)
&& (m_deviceFeatures.extDepthClipEnable.depthClipEnable
|| !required.extDepthClipEnable.depthClipEnable)
&& (m_deviceFeatures.extGraphicsPipelineLibrary.graphicsPipelineLibrary
|| !required.extGraphicsPipelineLibrary.graphicsPipelineLibrary)
&& (m_deviceFeatures.extMemoryBudget
|| !required.extMemoryBudget)
&& (m_deviceFeatures.extMemoryPriority.memoryPriority
|| !required.extMemoryPriority.memoryPriority)
&& (m_deviceFeatures.extNonSeamlessCubeMap.nonSeamlessCubeMap
|| !required.extNonSeamlessCubeMap.nonSeamlessCubeMap)
&& (m_deviceFeatures.extRobustness2.robustBufferAccess2
|| !required.extRobustness2.robustBufferAccess2)
&& (m_deviceFeatures.extRobustness2.robustImageAccess2
|| !required.extRobustness2.robustImageAccess2)
&& (m_deviceFeatures.extRobustness2.nullDescriptor
|| !required.extRobustness2.nullDescriptor)
&& (m_deviceFeatures.extShaderModuleIdentifier.shaderModuleIdentifier
|| !required.extShaderModuleIdentifier.shaderModuleIdentifier)
&& (m_deviceFeatures.extShaderStencilExport
|| !required.extShaderStencilExport)
&& (m_deviceFeatures.extSwapchainColorSpace
|| !required.extSwapchainColorSpace)
&& (m_deviceFeatures.extHdrMetadata
|| !required.extHdrMetadata)
&& (m_deviceFeatures.extTransformFeedback.transformFeedback
|| !required.extTransformFeedback.transformFeedback)
&& (m_deviceFeatures.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor
|| !required.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor)
&& (m_deviceFeatures.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor
|| !required.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor);
} }
#undef CHECK_FEATURE_NEED
void DxvkAdapter::enableExtensions(const DxvkNameSet& extensions) { void DxvkAdapter::enableExtensions(const DxvkNameSet& extensions) {
m_extraExtensions.merge(extensions); m_extraExtensions.merge(extensions);
} }