mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-07 16:54:14 +01:00
[dxbc] Implemented Texture2D -> Texture2DArray mapping as a knob
Doing this for all applications is not necessary and degrades performance in some cases.
This commit is contained in:
parent
e53cb72e39
commit
01147492d5
@ -370,7 +370,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
switch (desc.ViewDimension) {
|
switch (desc.ViewDimension) {
|
||||||
case D3D11_SRV_DIMENSION_TEXTURE1D:
|
case D3D11_SRV_DIMENSION_TEXTURE1D:
|
||||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_1D;
|
||||||
viewInfo.minLevel = desc.Texture1D.MostDetailedMip;
|
viewInfo.minLevel = desc.Texture1D.MostDetailedMip;
|
||||||
viewInfo.numLevels = desc.Texture1D.MipLevels;
|
viewInfo.numLevels = desc.Texture1D.MipLevels;
|
||||||
viewInfo.minLayer = 0;
|
viewInfo.minLayer = 0;
|
||||||
@ -386,11 +386,14 @@ namespace dxvk {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_SRV_DIMENSION_TEXTURE2D:
|
case D3D11_SRV_DIMENSION_TEXTURE2D:
|
||||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
viewInfo.minLevel = desc.Texture2D.MostDetailedMip;
|
viewInfo.minLevel = desc.Texture2D.MostDetailedMip;
|
||||||
viewInfo.numLevels = desc.Texture2D.MipLevels;
|
viewInfo.numLevels = desc.Texture2D.MipLevels;
|
||||||
viewInfo.minLayer = 0;
|
viewInfo.minLayer = 0;
|
||||||
viewInfo.numLayers = 1;
|
viewInfo.numLayers = 1;
|
||||||
|
|
||||||
|
if (m_dxbcOptions.test(DxbcOption::ForceTex2DArray))
|
||||||
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
|
case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
|
||||||
@ -402,11 +405,14 @@ namespace dxvk {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_SRV_DIMENSION_TEXTURE2DMS:
|
case D3D11_SRV_DIMENSION_TEXTURE2DMS:
|
||||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
viewInfo.minLevel = 0;
|
viewInfo.minLevel = 0;
|
||||||
viewInfo.numLevels = 1;
|
viewInfo.numLevels = 1;
|
||||||
viewInfo.minLayer = 0;
|
viewInfo.minLayer = 0;
|
||||||
viewInfo.numLayers = 1;
|
viewInfo.numLayers = 1;
|
||||||
|
|
||||||
|
if (m_dxbcOptions.test(DxbcOption::ForceTex2DArray))
|
||||||
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
|
case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
|
||||||
@ -567,7 +573,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
switch (desc.ViewDimension) {
|
switch (desc.ViewDimension) {
|
||||||
case D3D11_UAV_DIMENSION_TEXTURE1D:
|
case D3D11_UAV_DIMENSION_TEXTURE1D:
|
||||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_1D;
|
||||||
viewInfo.minLevel = desc.Texture1D.MipSlice;
|
viewInfo.minLevel = desc.Texture1D.MipSlice;
|
||||||
viewInfo.numLevels = 1;
|
viewInfo.numLevels = 1;
|
||||||
viewInfo.minLayer = 0;
|
viewInfo.minLayer = 0;
|
||||||
@ -583,11 +589,14 @@ namespace dxvk {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_UAV_DIMENSION_TEXTURE2D:
|
case D3D11_UAV_DIMENSION_TEXTURE2D:
|
||||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
viewInfo.minLevel = desc.Texture2D.MipSlice;
|
viewInfo.minLevel = desc.Texture2D.MipSlice;
|
||||||
viewInfo.numLevels = 1;
|
viewInfo.numLevels = 1;
|
||||||
viewInfo.minLayer = 0;
|
viewInfo.minLayer = 0;
|
||||||
viewInfo.numLayers = 1;
|
viewInfo.numLayers = 1;
|
||||||
|
|
||||||
|
if (m_dxbcOptions.test(DxbcOption::ForceTex2DArray))
|
||||||
|
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:
|
case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:
|
||||||
|
@ -807,24 +807,9 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
const uint32_t sampledTypeId = getScalarTypeId(sampledType);
|
|
||||||
|
|
||||||
// Declare the resource type
|
// Declare the resource type
|
||||||
const DxbcImageInfo typeInfo = [resourceType, isUav] () -> DxbcImageInfo {
|
const uint32_t sampledTypeId = getScalarTypeId(sampledType);
|
||||||
switch (resourceType) {
|
const DxbcImageInfo typeInfo = getResourceType(resourceType, isUav);
|
||||||
case DxbcResourceDim::Buffer: return { spv::DimBuffer, 0, 0, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::Texture1D: return { spv::Dim1D, 1, 0, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::Texture1DArr: return { spv::Dim1D, 1, 0, isUav ? 2u : 1u, 1u };
|
|
||||||
case DxbcResourceDim::Texture2D: return { spv::Dim2D, 1, 0, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::Texture2DArr: return { spv::Dim2D, 1, 0, isUav ? 2u : 1u, 1u };
|
|
||||||
case DxbcResourceDim::Texture2DMs: return { spv::Dim2D, 1, 1, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::Texture2DMsArr: return { spv::Dim2D, 1, 1, isUav ? 2u : 1u, 1u };
|
|
||||||
case DxbcResourceDim::Texture3D: return { spv::Dim3D, 0, 0, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::TextureCube: return { spv::DimCube, 1, 0, isUav ? 2u : 1u, 0u };
|
|
||||||
case DxbcResourceDim::TextureCubeArr: return { spv::DimCube, 1, 0, isUav ? 2u : 1u, 1u };
|
|
||||||
default: throw DxvkError(str::format("DxbcCompiler: Unsupported resource type: ", resourceType));
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
|
|
||||||
// Declare additional capabilities if necessary
|
// Declare additional capabilities if necessary
|
||||||
switch (resourceType) {
|
switch (resourceType) {
|
||||||
@ -930,7 +915,7 @@ namespace dxvk {
|
|||||||
// Store descriptor info for the shader interface
|
// Store descriptor info for the shader interface
|
||||||
DxvkResourceSlot resource;
|
DxvkResourceSlot resource;
|
||||||
resource.slot = bindingId;
|
resource.slot = bindingId;
|
||||||
resource.view = getViewType(resourceType);
|
resource.view = typeInfo.vtype;
|
||||||
|
|
||||||
if (isUav) {
|
if (isUav) {
|
||||||
resource.type = resourceType == DxbcResourceDim::Buffer
|
resource.type = resourceType == DxbcResourceDim::Buffer
|
||||||
@ -967,7 +952,7 @@ namespace dxvk {
|
|||||||
const DxbcScalarType sampledType = DxbcScalarType::Uint32;
|
const DxbcScalarType sampledType = DxbcScalarType::Uint32;
|
||||||
const uint32_t sampledTypeId = getScalarTypeId(sampledType);
|
const uint32_t sampledTypeId = getScalarTypeId(sampledType);
|
||||||
|
|
||||||
const DxbcImageInfo typeInfo = { spv::DimBuffer, 0, 0, isUav ? 2u : 1u, 0u };
|
const DxbcImageInfo typeInfo = { spv::DimBuffer, 0, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_MAX_ENUM };
|
||||||
|
|
||||||
// Declare the resource type
|
// Declare the resource type
|
||||||
const uint32_t resTypeId = m_module.defImageType(sampledTypeId,
|
const uint32_t resTypeId = m_module.defImageType(sampledTypeId,
|
||||||
@ -6240,23 +6225,31 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VkImageViewType DxbcCompiler::getViewType(DxbcResourceDim dim) const {
|
DxbcImageInfo DxbcCompiler::getResourceType(
|
||||||
switch (dim) {
|
DxbcResourceDim resourceType,
|
||||||
default:
|
bool isUav) const {
|
||||||
case DxbcResourceDim::Unknown:
|
DxbcImageInfo typeInfo = [resourceType, isUav] () -> DxbcImageInfo {
|
||||||
case DxbcResourceDim::Buffer:
|
switch (resourceType) {
|
||||||
case DxbcResourceDim::RawBuffer:
|
case DxbcResourceDim::Buffer: return { spv::DimBuffer, 0, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_MAX_ENUM };
|
||||||
case DxbcResourceDim::StructuredBuffer: return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
|
case DxbcResourceDim::Texture1D: return { spv::Dim1D, 0, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_1D };
|
||||||
case DxbcResourceDim::Texture1D: return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
|
case DxbcResourceDim::Texture1DArr: return { spv::Dim1D, 1, 0, isUav ? 2u : 1u, 1u, VK_IMAGE_VIEW_TYPE_1D_ARRAY };
|
||||||
case DxbcResourceDim::Texture1DArr: return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
|
case DxbcResourceDim::Texture2D: return { spv::Dim2D, 0, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_2D };
|
||||||
case DxbcResourceDim::Texture2D: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
case DxbcResourceDim::Texture2DArr: return { spv::Dim2D, 1, 0, isUav ? 2u : 1u, 1u, VK_IMAGE_VIEW_TYPE_2D_ARRAY };
|
||||||
case DxbcResourceDim::Texture2DMs: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
case DxbcResourceDim::Texture2DMs: return { spv::Dim2D, 0, 1, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_2D };
|
||||||
case DxbcResourceDim::Texture2DArr: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
case DxbcResourceDim::Texture2DMsArr: return { spv::Dim2D, 1, 1, isUav ? 2u : 1u, 1u, VK_IMAGE_VIEW_TYPE_2D_ARRAY };
|
||||||
case DxbcResourceDim::Texture2DMsArr: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
case DxbcResourceDim::Texture3D: return { spv::Dim3D, 0, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_3D };
|
||||||
case DxbcResourceDim::TextureCube: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
|
case DxbcResourceDim::TextureCube: return { spv::DimCube, 1, 0, isUav ? 2u : 1u, 0u, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY };
|
||||||
case DxbcResourceDim::TextureCubeArr: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
|
case DxbcResourceDim::TextureCubeArr: return { spv::DimCube, 1, 0, isUav ? 2u : 1u, 1u, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY };
|
||||||
case DxbcResourceDim::Texture3D: return VK_IMAGE_VIEW_TYPE_3D;
|
default: throw DxvkError(str::format("DxbcCompiler: Unsupported resource type: ", resourceType));
|
||||||
}
|
}
|
||||||
|
}();
|
||||||
|
|
||||||
|
if (typeInfo.dim == spv::Dim2D && m_options.test(DxbcOption::ForceTex2DArray)) {
|
||||||
|
typeInfo.array = 1;
|
||||||
|
typeInfo.vtype = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1015,8 +1015,9 @@ namespace dxvk {
|
|||||||
DxbcVectorType getOutputRegType(
|
DxbcVectorType getOutputRegType(
|
||||||
uint32_t regIdx) const;
|
uint32_t regIdx) const;
|
||||||
|
|
||||||
VkImageViewType getViewType(
|
DxbcImageInfo getResourceType(
|
||||||
DxbcResourceDim dim) const;
|
DxbcResourceDim resourceType,
|
||||||
|
bool isUav) const;
|
||||||
|
|
||||||
spv::ImageFormat getScalarImageFormat(
|
spv::ImageFormat getScalarImageFormat(
|
||||||
DxbcScalarType type) const;
|
DxbcScalarType type) const;
|
||||||
|
@ -61,6 +61,7 @@ namespace dxvk {
|
|||||||
uint32_t ms = 0;
|
uint32_t ms = 0;
|
||||||
uint32_t sampled = 0;
|
uint32_t sampled = 0;
|
||||||
uint32_t layered = 0;
|
uint32_t layered = 0;
|
||||||
|
VkImageViewType vtype = VK_IMAGE_VIEW_TYPE_MAX_ENUM;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
const static std::unordered_map<std::string, DxbcOptions> g_dxbcAppOptions = {{
|
const static std::unordered_map<std::string, DxbcOptions> g_dxbcAppOptions = {{
|
||||||
|
{ "ManiaPlanet.exe", DxbcOption::ForceTex2DArray },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +17,11 @@ namespace dxvk {
|
|||||||
/// Use FMin/FMax/FClamp instead of NMin/NMax/NClamp.
|
/// Use FMin/FMax/FClamp instead of NMin/NMax/NClamp.
|
||||||
/// Workaround for bugs in older Nvidia drivers.
|
/// Workaround for bugs in older Nvidia drivers.
|
||||||
UseSimpleMinMaxClamp,
|
UseSimpleMinMaxClamp,
|
||||||
|
|
||||||
|
/// Enforces the use of array views even when dealing
|
||||||
|
/// with non-array texture types. Some games do not
|
||||||
|
/// bind the correct texture type to the pipeline.
|
||||||
|
ForceTex2DArray,
|
||||||
};
|
};
|
||||||
|
|
||||||
using DxbcOptions = Flags<DxbcOption>;
|
using DxbcOptions = Flags<DxbcOption>;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user