diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 6fb7d3a4..fa4aa557 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -376,8 +376,10 @@ namespace dxvk { ID3D11UnorderedAccessView** ppUAView) { InitReturnPtr(ppUAView); + uint32_t plane = GetViewPlaneIndex(pResource, pDesc ? pDesc->Format : DXGI_FORMAT_UNKNOWN); + D3D11_UNORDERED_ACCESS_VIEW_DESC1 desc = pDesc - ? D3D11UnorderedAccessView::PromoteDesc(pDesc) + ? D3D11UnorderedAccessView::PromoteDesc(pDesc, plane) : D3D11_UNORDERED_ACCESS_VIEW_DESC1(); ID3D11UnorderedAccessView1* view = nullptr; @@ -420,12 +422,15 @@ namespace dxvk { return E_INVALIDARG; } - if (!CheckResourceViewCompatibility(pResource, D3D11_BIND_UNORDERED_ACCESS, desc.Format, 0)) { + uint32_t plane = D3D11UnorderedAccessView::GetPlaneSlice(&desc); + + if (!CheckResourceViewCompatibility(pResource, D3D11_BIND_UNORDERED_ACCESS, desc.Format, plane)) { Logger::err(str::format("D3D11: Cannot create unordered access view:", "\n Resource type: ", resourceDesc.Dim, "\n Resource usage: ", resourceDesc.BindFlags, "\n Resource format: ", resourceDesc.Format, - "\n View format: ", desc.Format)); + "\n View format: ", desc.Format, + "\n View plane: ", plane)); return E_INVALIDARG; } diff --git a/src/d3d11/d3d11_view_uav.cpp b/src/d3d11/d3d11_view_uav.cpp index 44c2d8a0..72ef060b 100644 --- a/src/d3d11/d3d11_view_uav.cpp +++ b/src/d3d11/d3d11_view_uav.cpp @@ -53,8 +53,8 @@ namespace dxvk { m_bufferView = pDevice->GetDXVKDevice()->createBufferView( buffer->GetBuffer(), viewInfo); } else { - const DXGI_VK_FORMAT_INFO formatInfo = pDevice->LookupFormat( - pDesc->Format, GetCommonTexture(pResource)->GetFormatMode()); + auto texture = GetCommonTexture(pResource); + auto formatInfo = pDevice->LookupFormat(pDesc->Format, texture->GetFormatMode()); DxvkImageViewCreateInfo viewInfo; viewInfo.format = formatInfo.Format; @@ -109,6 +109,9 @@ namespace dxvk { throw DxvkError("D3D11: Invalid view dimension for image UAV"); } + if (texture->GetPlaneCount() > 1) + viewInfo.aspect = vk::getPlaneAspect(GetPlaneSlice(pDesc)); + // Populate view info struct m_info.Image.Aspects = viewInfo.aspect; m_info.Image.MinLevel = viewInfo.minLevel; @@ -271,7 +274,8 @@ namespace dxvk { D3D11_UNORDERED_ACCESS_VIEW_DESC1 D3D11UnorderedAccessView::PromoteDesc( - const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { + const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc, + UINT Plane) { D3D11_UNORDERED_ACCESS_VIEW_DESC1 dstDesc; dstDesc.Format = pDesc->Format; dstDesc.ViewDimension = pDesc->ViewDimension; @@ -294,14 +298,14 @@ namespace dxvk { case D3D11_UAV_DIMENSION_TEXTURE2D: dstDesc.Texture2D.MipSlice = pDesc->Texture2D.MipSlice; - dstDesc.Texture2D.PlaneSlice = 0; + dstDesc.Texture2D.PlaneSlice = Plane; break; case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: dstDesc.Texture2DArray.MipSlice = pDesc->Texture2DArray.MipSlice; dstDesc.Texture2DArray.FirstArraySlice = pDesc->Texture2DArray.FirstArraySlice; dstDesc.Texture2DArray.ArraySize = pDesc->Texture2DArray.ArraySize; - dstDesc.Texture2DArray.PlaneSlice = 0; + dstDesc.Texture2DArray.PlaneSlice = Plane; break; case D3D11_UAV_DIMENSION_TEXTURE3D: @@ -390,16 +394,11 @@ namespace dxvk { break; case D3D11_UAV_DIMENSION_TEXTURE2D: - if (pDesc->Texture2D.PlaneSlice != 0) - return E_INVALIDARG; break; case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: if (pDesc->Texture2DArray.ArraySize > numLayers - pDesc->Texture2DArray.FirstArraySlice) pDesc->Texture2DArray.ArraySize = numLayers - pDesc->Texture2DArray.FirstArraySlice; - - if (pDesc->Texture2DArray.PlaneSlice != 0) - return E_INVALIDARG; break; case D3D11_UAV_DIMENSION_TEXTURE3D: @@ -415,6 +414,18 @@ namespace dxvk { } + UINT D3D11UnorderedAccessView::GetPlaneSlice(const D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) { + switch (pDesc->ViewDimension) { + case D3D11_UAV_DIMENSION_TEXTURE2D: + return pDesc->Texture2D.PlaneSlice; + case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: + return pDesc->Texture2DArray.PlaneSlice; + default: + return 0; + } + } + + Rc D3D11UnorderedAccessView::CreateCounterBuffer() { Rc device = m_parent->GetDXVKDevice(); diff --git a/src/d3d11/d3d11_view_uav.h b/src/d3d11/d3d11_view_uav.h index 4fe9164d..3076fe09 100644 --- a/src/d3d11/d3d11_view_uav.h +++ b/src/d3d11/d3d11_view_uav.h @@ -68,12 +68,16 @@ namespace dxvk { D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); static D3D11_UNORDERED_ACCESS_VIEW_DESC1 PromoteDesc( - const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc); + const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc, + UINT Plane); static HRESULT NormalizeDesc( ID3D11Resource* pResource, D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); + static UINT GetPlaneSlice( + const D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); + private: ID3D11Resource* m_resource;