From f5bfaac4b35626a62ad7163c4cb5a86c79026968 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 11 Jan 2018 12:33:38 +0100 Subject: [PATCH] [d3d11] Use cube array views for non-array cube maps This is actually necessary in order to properly render the map mode in Nier:Automata, which binds non-array cube maps to a cube array slot. --- src/d3d11/d3d11_device.cpp | 2 +- src/dxbc/dxbc_compiler.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 098ff1d7..ad8b036f 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -285,7 +285,7 @@ namespace dxvk { break; case D3D11_SRV_DIMENSION_TEXTURECUBE: - viewInfo.type = VK_IMAGE_VIEW_TYPE_CUBE; + viewInfo.type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; viewInfo.minLevel = desc.TextureCube.MostDetailedMip; viewInfo.numLevels = desc.TextureCube.MipLevels; viewInfo.minLayer = 0; diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 16410da4..3fc42dd6 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -659,7 +659,8 @@ namespace dxvk { case DxbcResourceDim::Texture2DMs: return { spv::Dim2D, 0, 1, isUav ? 2u : 1u }; case DxbcResourceDim::Texture2DMsArr: return { spv::Dim2D, 1, 1, isUav ? 2u : 1u }; case DxbcResourceDim::Texture3D: return { spv::Dim3D, 0, 0, isUav ? 2u : 1u }; - case DxbcResourceDim::TextureCube: return { spv::DimCube, 0, 0, isUav ? 2u : 1u }; + // Apps may bind cube maps to a slot that expects cube map arrays + case DxbcResourceDim::TextureCube: return { spv::DimCube, 1, 0, isUav ? 2u : 1u }; case DxbcResourceDim::TextureCubeArr: return { spv::DimCube, 1, 0, isUav ? 2u : 1u }; default: throw DxvkError(str::format("DxbcCompiler: Unsupported resource type: ", resourceType)); } @@ -670,6 +671,7 @@ namespace dxvk { case DxbcResourceDim::Buffer: m_module.enableCapability(spv::CapabilityImageBuffer); break; case DxbcResourceDim::Texture1D: m_module.enableCapability(spv::CapabilityImage1D); break; case DxbcResourceDim::Texture1DArr: m_module.enableCapability(spv::CapabilityImage1D); break; + case DxbcResourceDim::TextureCube: m_module.enableCapability(spv::CapabilityImageCubeArray); break; case DxbcResourceDim::TextureCubeArr: m_module.enableCapability(spv::CapabilityImageCubeArray); break; case DxbcResourceDim::Texture2DMsArr: m_module.enableCapability(spv::CapabilityImageMSArray); break; default: break; // No additional capabilities required @@ -4561,7 +4563,7 @@ namespace dxvk { case DxbcResourceDim::Texture2DMs: return VK_IMAGE_VIEW_TYPE_2D; case DxbcResourceDim::Texture2DArr: return VK_IMAGE_VIEW_TYPE_2D_ARRAY; case DxbcResourceDim::Texture2DMsArr: return VK_IMAGE_VIEW_TYPE_2D_ARRAY; - case DxbcResourceDim::TextureCube: return VK_IMAGE_VIEW_TYPE_CUBE; + case DxbcResourceDim::TextureCube: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; case DxbcResourceDim::TextureCubeArr: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; case DxbcResourceDim::Texture3D: return VK_IMAGE_VIEW_TYPE_3D; }