From b36fa75d1d9fadb3b1341869e59dcb7a97c3f145 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 1 Oct 2021 14:25:09 +0200 Subject: [PATCH] [dxvk] Disable CUDA interop extensions on 32-bit builds --- src/d3d11/d3d11_device.cpp | 2 -- src/dxvk/dxvk_adapter.cpp | 20 +++++++++++++++----- src/dxvk/dxvk_extensions.h | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 4ba2666f..33ee28f2 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1940,8 +1940,6 @@ namespace dxvk { enabled.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor = supported.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor; enabled.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor = supported.extVertexAttributeDivisor.vertexAttributeInstanceRateZeroDivisor; - enabled.khrBufferDeviceAddress = supported.khrBufferDeviceAddress; - if (supported.extCustomBorderColor.customBorderColorWithoutFormat) { enabled.extCustomBorderColor.customBorderColors = VK_TRUE; enabled.extCustomBorderColor.customBorderColorWithoutFormat = VK_TRUE; diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 5a7bb08c..d102ddfe 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -281,6 +281,7 @@ namespace dxvk { &devExtensions.extShaderViewportIndexLayer, &devExtensions.extTransformFeedback, &devExtensions.extVertexAttributeDivisor, + &devExtensions.khrBufferDeviceAddress, &devExtensions.khrCreateRenderPass2, &devExtensions.khrDepthStencilResolve, &devExtensions.khrDrawIndirectCount, @@ -291,15 +292,24 @@ namespace dxvk { &devExtensions.khrSwapchain, &devExtensions.nvxBinaryImport, &devExtensions.nvxImageViewHandle, - &devExtensions.khrBufferDeviceAddress, }}; - // VK_KHR_buffer_device_address can be expensive to enable on - // some drivers; only enable selectively for Cuda interop - if (m_deviceExtensions.supports(devExtensions.nvxBinaryImport.name()) && - m_deviceExtensions.supports(devExtensions.nvxImageViewHandle.name())) + // Only enable Cuda interop extensions in 64-bit builds in + // order to avoid potential driver or address space issues. + // VK_KHR_buffer_device_address is expensive on some drivers. + bool enableCudaInterop = !env::is32BitHostPlatform() && + m_deviceExtensions.supports(devExtensions.nvxBinaryImport.name()) && + m_deviceExtensions.supports(devExtensions.nvxImageViewHandle.name()) && + m_deviceFeatures.khrBufferDeviceAddress.bufferDeviceAddress; + + if (enableCudaInterop) { + devExtensions.nvxBinaryImport.setMode(DxvkExtMode::Optional); + devExtensions.nvxImageViewHandle.setMode(DxvkExtMode::Optional); devExtensions.khrBufferDeviceAddress.setMode(DxvkExtMode::Optional); + enabledFeatures.khrBufferDeviceAddress.bufferDeviceAddress = VK_TRUE; + } + DxvkNameSet extensionsEnabled; if (!m_deviceExtensions.enableExtensions( diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index 11073619..b50796e7 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -283,8 +283,8 @@ namespace dxvk { DxvkExt khrSamplerMirrorClampToEdge = { VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrShaderFloatControls = { VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrSwapchain = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, DxvkExtMode::Required }; - DxvkExt nvxBinaryImport = { VK_NVX_BINARY_IMPORT_EXTENSION_NAME, DxvkExtMode::Optional }; - DxvkExt nvxImageViewHandle = { VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME, DxvkExtMode::Optional }; + DxvkExt nvxBinaryImport = { VK_NVX_BINARY_IMPORT_EXTENSION_NAME, DxvkExtMode::Disabled }; + DxvkExt nvxImageViewHandle = { VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME, DxvkExtMode::Disabled }; DxvkExt khrBufferDeviceAddress = { VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, DxvkExtMode::Disabled }; };