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

[d3d11] Cap mip level count for textures and views

Some games do not compute the number of mip levels of
a texture or texture view correctly, so we should work
around this by capping it to the highest possible value.
This commit is contained in:
Philip Rebohle 2018-04-12 23:42:11 +02:00
parent 56a1433d3f
commit 8508994a63
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
5 changed files with 27 additions and 26 deletions

View File

@ -154,11 +154,12 @@ namespace dxvk {
HRESULT D3D11CommonTexture::NormalizeTextureProperties(D3D11_COMMON_TEXTURE_DESC* pDesc) { HRESULT D3D11CommonTexture::NormalizeTextureProperties(D3D11_COMMON_TEXTURE_DESC* pDesc) {
if (pDesc->MipLevels == 0) { uint32_t maxMipLevelCount = pDesc->SampleDesc.Count <= 1
pDesc->MipLevels = pDesc->SampleDesc.Count <= 1 ? util::computeMipLevelCount({ pDesc->Width, pDesc->Height, pDesc->Depth })
? util::computeMipLevelCount({ pDesc->Width, pDesc->Height, pDesc->Depth }) : 1u;
: 1u;
} if (pDesc->MipLevels == 0 || pDesc->MipLevels > maxMipLevelCount)
pDesc->MipLevels = maxMipLevelCount;
return S_OK; return S_OK;
} }

View File

@ -160,17 +160,17 @@ namespace dxvk {
switch (pDesc->ViewDimension) { switch (pDesc->ViewDimension) {
case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:
if (pDesc->Texture1DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture1DArray.ArraySize > numLayers - pDesc->Texture1DArray.FirstArraySlice)
pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice; pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice;
break; break;
case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
if (pDesc->Texture2DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DArray.ArraySize > numLayers - pDesc->Texture2DArray.FirstArraySlice)
pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice; pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice;
break; break;
case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
if (pDesc->Texture2DMSArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DMSArray.ArraySize > numLayers - pDesc->Texture2DMSArray.FirstArraySlice)
pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice; pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice;
break; break;

View File

@ -191,22 +191,22 @@ namespace dxvk {
switch (pDesc->ViewDimension) { switch (pDesc->ViewDimension) {
case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
if (pDesc->Texture1DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture1DArray.ArraySize > numLayers - pDesc->Texture1DArray.FirstArraySlice)
pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice; pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice;
break; break;
case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
if (pDesc->Texture2DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DArray.ArraySize > numLayers - pDesc->Texture2DArray.FirstArraySlice)
pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice; pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice;
break; break;
case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:
if (pDesc->Texture2DMSArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DMSArray.ArraySize > numLayers - pDesc->Texture2DMSArray.FirstArraySlice)
pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice; pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice;
break; break;
case D3D11_RTV_DIMENSION_TEXTURE3D: case D3D11_RTV_DIMENSION_TEXTURE3D:
if (pDesc->Texture3D.WSize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture3D.WSize > numLayers - pDesc->Texture3D.FirstWSlice)
pDesc->Texture3D.WSize = numLayers - pDesc->Texture3D.FirstWSlice; pDesc->Texture3D.WSize = numLayers - pDesc->Texture3D.FirstWSlice;
break; break;

View File

@ -223,48 +223,48 @@ namespace dxvk {
switch (pDesc->ViewDimension) { switch (pDesc->ViewDimension) {
case D3D11_SRV_DIMENSION_TEXTURE1D: case D3D11_SRV_DIMENSION_TEXTURE1D:
if (pDesc->Texture1D.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->Texture1D.MipLevels > mipLevels - pDesc->Texture1D.MostDetailedMip)
pDesc->Texture1D.MipLevels = mipLevels - pDesc->Texture1D.MostDetailedMip; pDesc->Texture1D.MipLevels = mipLevels - pDesc->Texture1D.MostDetailedMip;
break; break;
case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
if (pDesc->Texture1DArray.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->Texture1DArray.MipLevels > mipLevels - pDesc->Texture1DArray.MostDetailedMip)
pDesc->Texture1DArray.MipLevels = mipLevels - pDesc->Texture1DArray.MostDetailedMip; pDesc->Texture1DArray.MipLevels = mipLevels - pDesc->Texture1DArray.MostDetailedMip;
if (pDesc->Texture1DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture1DArray.ArraySize > numLayers - pDesc->Texture1DArray.FirstArraySlice)
pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice; pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice;
break; break;
case D3D11_SRV_DIMENSION_TEXTURE2D: case D3D11_SRV_DIMENSION_TEXTURE2D:
if (pDesc->Texture2D.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->Texture2D.MipLevels > mipLevels - pDesc->Texture2D.MostDetailedMip)
pDesc->Texture2D.MipLevels = mipLevels - pDesc->Texture2D.MostDetailedMip; pDesc->Texture2D.MipLevels = mipLevels - pDesc->Texture2D.MostDetailedMip;
break; break;
case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
if (pDesc->Texture2DArray.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->Texture2DArray.MipLevels > mipLevels - pDesc->Texture2DArray.MostDetailedMip)
pDesc->Texture2DArray.MipLevels = mipLevels - pDesc->Texture2DArray.MostDetailedMip; pDesc->Texture2DArray.MipLevels = mipLevels - pDesc->Texture2DArray.MostDetailedMip;
if (pDesc->Texture2DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DArray.ArraySize > numLayers - pDesc->Texture2DArray.FirstArraySlice)
pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice; pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice;
break; break;
case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
if (pDesc->Texture2DMSArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DMSArray.ArraySize > numLayers - pDesc->Texture2DMSArray.FirstArraySlice)
pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice; pDesc->Texture2DMSArray.ArraySize = numLayers - pDesc->Texture2DMSArray.FirstArraySlice;
break; break;
case D3D11_SRV_DIMENSION_TEXTURECUBE: case D3D11_SRV_DIMENSION_TEXTURECUBE:
if (pDesc->TextureCube.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->TextureCube.MipLevels > mipLevels - pDesc->TextureCube.MostDetailedMip)
pDesc->TextureCube.MipLevels = mipLevels - pDesc->TextureCube.MostDetailedMip; pDesc->TextureCube.MipLevels = mipLevels - pDesc->TextureCube.MostDetailedMip;
break; break;
case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY:
if (pDesc->TextureCubeArray.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->TextureCubeArray.MipLevels > mipLevels - pDesc->TextureCubeArray.MostDetailedMip)
pDesc->TextureCubeArray.MipLevels = mipLevels - pDesc->TextureCubeArray.MostDetailedMip; pDesc->TextureCubeArray.MipLevels = mipLevels - pDesc->TextureCubeArray.MostDetailedMip;
if (pDesc->TextureCubeArray.NumCubes == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->TextureCubeArray.NumCubes > (numLayers - pDesc->TextureCubeArray.First2DArrayFace / 6))
pDesc->TextureCubeArray.NumCubes = (numLayers - pDesc->TextureCubeArray.First2DArrayFace / 6); pDesc->TextureCubeArray.NumCubes = (numLayers - pDesc->TextureCubeArray.First2DArrayFace / 6);
break; break;
case D3D11_SRV_DIMENSION_TEXTURE3D: case D3D11_SRV_DIMENSION_TEXTURE3D:
if (pDesc->Texture3D.MipLevels == D3D11_DXVK_USE_REMAINING_LEVELS) if (pDesc->Texture3D.MipLevels > mipLevels - pDesc->Texture3D.MostDetailedMip)
pDesc->Texture3D.MipLevels = mipLevels - pDesc->Texture3D.MostDetailedMip; pDesc->Texture3D.MipLevels = mipLevels - pDesc->Texture3D.MostDetailedMip;
break; break;

View File

@ -204,17 +204,17 @@ namespace dxvk {
switch (pDesc->ViewDimension) { switch (pDesc->ViewDimension) {
case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: case D3D11_UAV_DIMENSION_TEXTURE1DARRAY:
if (pDesc->Texture1DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture1DArray.ArraySize > numLayers - pDesc->Texture1DArray.FirstArraySlice)
pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice; pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice;
break; break;
case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:
if (pDesc->Texture2DArray.ArraySize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture2DArray.ArraySize > numLayers - pDesc->Texture2DArray.FirstArraySlice)
pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice; pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice;
break; break;
case D3D11_UAV_DIMENSION_TEXTURE3D: case D3D11_UAV_DIMENSION_TEXTURE3D:
if (pDesc->Texture3D.WSize == D3D11_DXVK_USE_REMAINING_LAYERS) if (pDesc->Texture3D.WSize > numLayers - pDesc->Texture3D.FirstWSlice)
pDesc->Texture3D.WSize = numLayers - pDesc->Texture3D.FirstWSlice; pDesc->Texture3D.WSize = numLayers - pDesc->Texture3D.FirstWSlice;
break; break;