From d657a526ae7879ef94c94634f93ccf17728b8677 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 14 Jul 2022 20:03:53 +0200 Subject: [PATCH] [dxvk] Replace VK_EXT_shader_viewport_index_layer with core features And enable them optionally in the backend, since we use this for meta operations. --- src/d3d11/d3d11_device.cpp | 9 ++++++--- src/dxvk/dxvk_adapter.cpp | 5 +++-- src/dxvk/dxvk_extensions.h | 1 - src/dxvk/dxvk_meta_blit.cpp | 2 +- src/dxvk/dxvk_meta_copy.cpp | 2 +- src/dxvk/dxvk_meta_resolve.cpp | 2 +- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 563a6cdae..1545438b8 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1712,10 +1712,12 @@ namespace dxvk { if (FeatureSupportDataSize != sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS3)) return E_INVALIDARG; - const auto& extensions = m_dxvkDevice->extensions(); + const auto& features = m_dxvkDevice->features(); auto info = static_cast(pFeatureSupportData); - info->VPAndRTArrayIndexFromAnyShaderFeedingRasterizer = extensions.extShaderViewportIndexLayer; + info->VPAndRTArrayIndexFromAnyShaderFeedingRasterizer = + features.vk12.shaderOutputViewportIndex && + features.vk12.shaderOutputLayer; } return S_OK; case D3D11_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT: { @@ -2023,7 +2025,8 @@ namespace dxvk { return E_INVALIDARG; if (shader->flags().test(DxvkShaderFlag::ExportsViewportIndexLayerFromVertexStage) - && !m_dxvkDevice->extensions().extShaderViewportIndexLayer) + && (!m_dxvkDevice->features().vk12.shaderOutputViewportIndex + || !m_dxvkDevice->features().vk12.shaderOutputLayer)) return E_INVALIDARG; *pShaderModule = std::move(commonShader); diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 63445ca94..4707a8052 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -283,7 +283,7 @@ namespace dxvk { DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; - std::array devExtensionList = {{ + std::array devExtensionList = {{ &devExtensions.amdMemoryOverallocationBehaviour, &devExtensions.amdShaderFragmentMask, &devExtensions.ext4444Formats, @@ -301,7 +301,6 @@ namespace dxvk { &devExtensions.extShaderDemoteToHelperInvocation, &devExtensions.extShaderModuleIdentifier, &devExtensions.extShaderStencilExport, - &devExtensions.extShaderViewportIndexLayer, &devExtensions.extTransformFeedback, &devExtensions.extVertexAttributeDivisor, &devExtensions.khrCreateRenderPass2, @@ -347,6 +346,8 @@ namespace dxvk { // Enable additional device features if supported enabledFeatures.vk12.drawIndirectCount = m_deviceFeatures.vk12.drawIndirectCount; enabledFeatures.vk12.hostQueryReset = VK_TRUE; + enabledFeatures.vk12.shaderOutputViewportIndex = m_deviceFeatures.vk12.shaderOutputViewportIndex; + enabledFeatures.vk12.shaderOutputLayer = m_deviceFeatures.vk12.shaderOutputLayer; enabledFeatures.extExtendedDynamicState.extendedDynamicState = VK_TRUE; diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index 3a5a1eae8..58419d698 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -293,7 +293,6 @@ namespace dxvk { DxvkExt extShaderDemoteToHelperInvocation = { VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extShaderModuleIdentifier = { VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional }; - DxvkExt extShaderViewportIndexLayer = { VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrCreateRenderPass2 = { VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, DxvkExtMode::Required }; diff --git a/src/dxvk/dxvk_meta_blit.cpp b/src/dxvk/dxvk_meta_blit.cpp index 58bcc16b9..b069b0a99 100644 --- a/src/dxvk/dxvk_meta_blit.cpp +++ b/src/dxvk/dxvk_meta_blit.cpp @@ -133,7 +133,7 @@ namespace dxvk { m_shaderFrag1D(createShaderModule(dxvk_blit_frag_1d)), m_shaderFrag2D(createShaderModule(dxvk_blit_frag_2d)), m_shaderFrag3D(createShaderModule(dxvk_blit_frag_3d)) { - if (device->extensions().extShaderViewportIndexLayer) { + if (device->features().vk12.shaderOutputLayer) { m_shaderVert = createShaderModule(dxvk_fullscreen_layer_vert); } else { m_shaderVert = createShaderModule(dxvk_fullscreen_vert); diff --git a/src/dxvk/dxvk_meta_copy.cpp b/src/dxvk/dxvk_meta_copy.cpp index c15f15ebc..a4c62488b 100644 --- a/src/dxvk/dxvk_meta_copy.cpp +++ b/src/dxvk/dxvk_meta_copy.cpp @@ -89,7 +89,7 @@ namespace dxvk { createShaderModule(dxvk_copy_depth_1d), createShaderModule(dxvk_copy_depth_2d), createShaderModule(dxvk_copy_depth_ms) } { - if (device->extensions().extShaderViewportIndexLayer) { + if (device->features().vk12.shaderOutputLayer) { m_shaderVert = createShaderModule(dxvk_fullscreen_layer_vert); } else { m_shaderVert = createShaderModule(dxvk_fullscreen_vert); diff --git a/src/dxvk/dxvk_meta_resolve.cpp b/src/dxvk/dxvk_meta_resolve.cpp index dae17e7ec..3e84e87af 100644 --- a/src/dxvk/dxvk_meta_resolve.cpp +++ b/src/dxvk/dxvk_meta_resolve.cpp @@ -64,7 +64,7 @@ namespace dxvk { if (device->extensions().extShaderStencilExport) m_shaderFragDS = createShaderModule(dxvk_resolve_frag_ds); - if (device->extensions().extShaderViewportIndexLayer) { + if (device->features().vk12.shaderOutputLayer) { m_shaderVert = createShaderModule(dxvk_fullscreen_layer_vert); } else { m_shaderVert = createShaderModule(dxvk_fullscreen_vert);