From 0cd67cb98a9a741b07a909795ad74c64454f0db2 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 20 Aug 2022 17:16:42 +0200 Subject: [PATCH] [d3d11] Implement tiled image creation --- src/d3d11/d3d11_device.cpp | 13 +++++++++---- src/d3d11/d3d11_initializer.cpp | 18 +++++++++++++++--- src/d3d11/d3d11_initializer.h | 5 ++++- src/d3d11/d3d11_interop.cpp | 3 ++- src/d3d11/d3d11_texture.cpp | 28 ++++++++++++++++++++++++---- src/d3d11/d3d11_texture.h | 4 +++- 6 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 1feeb2b95..01c916632 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -128,7 +128,8 @@ namespace dxvk { desc.MiscFlags = pDesc->MiscFlags; desc.TextureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED; - HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc); + HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc, + D3D11_TILED_RESOURCES_NOT_SUPPORTED); if (FAILED(hr)) return hr; @@ -204,7 +205,7 @@ namespace dxvk { desc.MiscFlags = pDesc->MiscFlags; desc.TextureLayout = pDesc->TextureLayout; - HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc); + HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc, m_tiledResourcesTier); if (FAILED(hr)) return hr; @@ -279,11 +280,15 @@ namespace dxvk { desc.MiscFlags = pDesc->MiscFlags; desc.TextureLayout = pDesc->TextureLayout; - HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc); + HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc, m_tiledResourcesTier); if (FAILED(hr)) return hr; - + + if ((desc.MiscFlags & D3D11_RESOURCE_MISC_TILED) + && (m_tiledResourcesTier < D3D11_TILED_RESOURCES_TIER_3)) + return E_INVALIDARG; + if (!ppTexture3D) return S_FALSE; diff --git a/src/d3d11/d3d11_initializer.cpp b/src/d3d11/d3d11_initializer.cpp index b90dbff6b..a5391adb2 100644 --- a/src/d3d11/d3d11_initializer.cpp +++ b/src/d3d11/d3d11_initializer.cpp @@ -43,9 +43,12 @@ namespace dxvk { void D3D11Initializer::InitTexture( D3D11CommonTexture* pTexture, const D3D11_SUBRESOURCE_DATA* pInitialData) { - (pTexture->GetMapMode() == D3D11_COMMON_TEXTURE_MAP_MODE_DIRECT) - ? InitHostVisibleTexture(pTexture, pInitialData) - : InitDeviceLocalTexture(pTexture, pInitialData); + if (pTexture->Desc()->MiscFlags & D3D11_RESOURCE_MISC_TILED) + InitTiledTexture(pTexture); + else if (pTexture->GetMapMode() == D3D11_COMMON_TEXTURE_MAP_MODE_DIRECT) + InitHostVisibleTexture(pTexture, pInitialData); + else + InitDeviceLocalTexture(pTexture, pInitialData); } @@ -255,6 +258,15 @@ namespace dxvk { } + void D3D11Initializer::InitTiledTexture( + D3D11CommonTexture* pTexture) { + m_context->initSparseImage(pTexture->GetImage()); + + m_transferCommands += 1; + FlushImplicit(); + } + + void D3D11Initializer::FlushImplicit() { if (m_transferCommands > MaxTransferCommands || m_transferMemory > MaxTransferMemory) diff --git a/src/d3d11/d3d11_initializer.h b/src/d3d11/d3d11_initializer.h index 8c96babda..8cfe84c63 100644 --- a/src/d3d11/d3d11_initializer.h +++ b/src/d3d11/d3d11_initializer.h @@ -64,7 +64,10 @@ namespace dxvk { void InitHostVisibleTexture( D3D11CommonTexture* pTexture, const D3D11_SUBRESOURCE_DATA* pInitialData); - + + void InitTiledTexture( + D3D11CommonTexture* pTexture); + void FlushImplicit(); void FlushInternal(); diff --git a/src/d3d11/d3d11_interop.cpp b/src/d3d11/d3d11_interop.cpp index 8fa50288b..b6cb129d4 100644 --- a/src/d3d11/d3d11_interop.cpp +++ b/src/d3d11/d3d11_interop.cpp @@ -146,7 +146,8 @@ namespace dxvk { desc.MiscFlags = pDesc->MiscFlags; desc.TextureLayout = pDesc->TextureLayout; - HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc); + HRESULT hr = D3D11CommonTexture::NormalizeTextureProperties(&desc, + D3D11_TILED_RESOURCES_NOT_SUPPORTED); if (FAILED(hr)) return hr; diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp index 1171b42b6..fd05fd532 100644 --- a/src/d3d11/d3d11_texture.cpp +++ b/src/d3d11/d3d11_texture.cpp @@ -136,10 +136,16 @@ namespace dxvk { if (m_desc.MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE) imageInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; + if (m_desc.MiscFlags & D3D11_RESOURCE_MISC_TILED) { + imageInfo.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT + | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT + | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT; + } + if (Dimension == D3D11_RESOURCE_DIMENSION_TEXTURE3D && (m_desc.BindFlags & D3D11_BIND_RENDER_TARGET)) imageInfo.flags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT; - + // Swap chain back buffers need to be shader readable if (DxgiUsage & DXGI_USAGE_BACK_BUFFER) { imageInfo.usage |= VK_IMAGE_USAGE_SAMPLED_BIT; @@ -396,7 +402,7 @@ namespace dxvk { } - HRESULT D3D11CommonTexture::NormalizeTextureProperties(D3D11_COMMON_TEXTURE_DESC* pDesc) { + HRESULT D3D11CommonTexture::NormalizeTextureProperties(D3D11_COMMON_TEXTURE_DESC* pDesc, D3D11_TILED_RESOURCES_TIER TiledTier) { if (pDesc->Width == 0 || pDesc->Height == 0 || pDesc->Depth == 0 || pDesc->ArraySize == 0) return E_INVALIDARG; @@ -415,10 +421,24 @@ namespace dxvk { != (D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET)) return E_INVALIDARG; - // TILE_POOL is invalid, but we don't support TILED either - if (pDesc->MiscFlags & (D3D11_RESOURCE_MISC_TILE_POOL | D3D11_RESOURCE_MISC_TILED)) + // TILE_POOL is invalid for textures + if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL) return E_INVALIDARG; + // Perform basic validation for tiled resources + if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILED) { + UINT invalidFlags = D3D11_RESOURCE_MISC_SHARED + | D3D11_RESOURCE_MISC_SHARED_NTHANDLE + | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX + | D3D11_RESOURCE_MISC_GDI_COMPATIBLE; + + if ((pDesc->MiscFlags & invalidFlags) + || (pDesc->Usage != D3D11_USAGE_DEFAULT) + || (pDesc->CPUAccessFlags) + || (!TiledTier)) + return E_INVALIDARG; + } + // Use the maximum possible mip level count if the supplied // mip level count is either unspecified (0) or invalid const uint32_t maxMipLevelCount = (pDesc->SampleDesc.Count <= 1) diff --git a/src/d3d11/d3d11_texture.h b/src/d3d11/d3d11_texture.h index 3ca91da21..0bb25b916 100644 --- a/src/d3d11/d3d11_texture.h +++ b/src/d3d11/d3d11_texture.h @@ -367,10 +367,12 @@ namespace dxvk { * parameters. Any error returned by this method should * be forwarded to the application. * \param [in,out] pDesc Texture description + * \param [in] TiledTier Tiled resources tier * \returns \c S_OK if the parameters are valid */ static HRESULT NormalizeTextureProperties( - D3D11_COMMON_TEXTURE_DESC* pDesc); + D3D11_COMMON_TEXTURE_DESC* pDesc, + D3D11_TILED_RESOURCES_TIER TiledTier); private: