From 84c80a4aaf1989de243e1f9968244284cb9e6a71 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 16 Sep 2019 14:37:33 +0200 Subject: [PATCH] [d3d11] Implement ID3D11UnorderedAccessView1 --- src/d3d11/d3d11_device.cpp | 4 +- src/d3d11/d3d11_view_uav.cpp | 109 ++++++++++++++++++++++++++++++++--- src/d3d11/d3d11_view_uav.h | 23 +++++--- 3 files changed, 116 insertions(+), 20 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 8d09d8851..29369a942 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -286,13 +286,13 @@ namespace dxvk { // The description is optional. If omitted, we'll create // a view that covers all subresources of the image. - D3D11_UNORDERED_ACCESS_VIEW_DESC desc; + D3D11_UNORDERED_ACCESS_VIEW_DESC1 desc; if (pDesc == nullptr) { if (FAILED(D3D11UnorderedAccessView::GetDescFromResource(pResource, &desc))) return E_INVALIDARG; } else { - desc = *pDesc; + desc = D3D11UnorderedAccessView::PromoteDesc(pDesc); if (FAILED(D3D11UnorderedAccessView::NormalizeDesc(pResource, &desc))) return E_INVALIDARG; diff --git a/src/d3d11/d3d11_view_uav.cpp b/src/d3d11/d3d11_view_uav.cpp index be5343695..123d1e3b1 100644 --- a/src/d3d11/d3d11_view_uav.cpp +++ b/src/d3d11/d3d11_view_uav.cpp @@ -7,9 +7,9 @@ namespace dxvk { D3D11UnorderedAccessView::D3D11UnorderedAccessView( - D3D11Device* pDevice, - ID3D11Resource* pResource, - const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) + D3D11Device* pDevice, + ID3D11Resource* pResource, + const D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) : m_device(pDevice), m_resource(pResource), m_desc(*pDesc) { ResourceAddRefPrivate(m_resource); @@ -138,7 +138,8 @@ namespace dxvk { if (riid == __uuidof(IUnknown) || riid == __uuidof(ID3D11DeviceChild) || riid == __uuidof(ID3D11View) - || riid == __uuidof(ID3D11UnorderedAccessView)) { + || riid == __uuidof(ID3D11UnorderedAccessView) + || riid == __uuidof(ID3D11UnorderedAccessView1)) { *ppvObject = ref(this); return S_OK; } @@ -160,13 +161,50 @@ namespace dxvk { void STDMETHODCALLTYPE D3D11UnorderedAccessView::GetDesc(D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { + pDesc->Format = m_desc.Format; + pDesc->ViewDimension = m_desc.ViewDimension; + + switch (m_desc.ViewDimension) { + case D3D11_UAV_DIMENSION_UNKNOWN: + break; + + case D3D11_UAV_DIMENSION_BUFFER: + pDesc->Buffer = m_desc.Buffer; + break; + + case D3D11_UAV_DIMENSION_TEXTURE1D: + pDesc->Texture1D = m_desc.Texture1D; + break; + + case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: + pDesc->Texture1DArray = m_desc.Texture1DArray; + break; + + case D3D11_UAV_DIMENSION_TEXTURE2D: + pDesc->Texture2D.MipSlice = m_desc.Texture2D.MipSlice; + break; + + case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: + pDesc->Texture2DArray.MipSlice = m_desc.Texture2DArray.MipSlice; + pDesc->Texture2DArray.FirstArraySlice = m_desc.Texture2DArray.FirstArraySlice; + pDesc->Texture2DArray.ArraySize = m_desc.Texture2DArray.ArraySize; + break; + + case D3D11_UAV_DIMENSION_TEXTURE3D: + pDesc->Texture3D = m_desc.Texture3D; + break; + } + } + + + void STDMETHODCALLTYPE D3D11UnorderedAccessView::GetDesc1(D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) { *pDesc = m_desc; } HRESULT D3D11UnorderedAccessView::GetDescFromResource( - ID3D11Resource* pResource, - D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { + ID3D11Resource* pResource, + D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) { D3D11_RESOURCE_DIMENSION resourceDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; pResource->GetType(&resourceDim); @@ -209,12 +247,14 @@ namespace dxvk { if (resourceDesc.ArraySize == 1) { pDesc->ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; - pDesc->Texture2D.MipSlice = 0; + pDesc->Texture2D.MipSlice = 0; + pDesc->Texture2D.PlaneSlice = 0; } else { pDesc->ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY; pDesc->Texture2DArray.MipSlice = 0; pDesc->Texture2DArray.FirstArraySlice = 0; pDesc->Texture2DArray.ArraySize = resourceDesc.ArraySize; + pDesc->Texture2DArray.PlaneSlice = 0; } } return S_OK; @@ -237,9 +277,52 @@ namespace dxvk { } + D3D11_UNORDERED_ACCESS_VIEW_DESC1 D3D11UnorderedAccessView::PromoteDesc( + const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { + D3D11_UNORDERED_ACCESS_VIEW_DESC1 dstDesc; + dstDesc.Format = pDesc->Format; + dstDesc.ViewDimension = pDesc->ViewDimension; + + switch (pDesc->ViewDimension) { + case D3D11_UAV_DIMENSION_UNKNOWN: + break; + + case D3D11_UAV_DIMENSION_BUFFER: + dstDesc.Buffer = pDesc->Buffer; + break; + + case D3D11_UAV_DIMENSION_TEXTURE1D: + dstDesc.Texture1D = pDesc->Texture1D; + break; + + case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: + dstDesc.Texture1DArray = pDesc->Texture1DArray; + break; + + case D3D11_UAV_DIMENSION_TEXTURE2D: + dstDesc.Texture2D.MipSlice = pDesc->Texture2D.MipSlice; + dstDesc.Texture2D.PlaneSlice = 0; + 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; + break; + + case D3D11_UAV_DIMENSION_TEXTURE3D: + dstDesc.Texture3D = pDesc->Texture3D; + break; + } + + return dstDesc; + } + + HRESULT D3D11UnorderedAccessView::NormalizeDesc( - ID3D11Resource* pResource, - D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { + ID3D11Resource* pResource, + D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) { D3D11_RESOURCE_DIMENSION resourceDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; pResource->GetType(&resourceDim); @@ -313,9 +396,17 @@ namespace dxvk { pDesc->Texture1DArray.ArraySize = numLayers - pDesc->Texture1DArray.FirstArraySlice; 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: diff --git a/src/d3d11/d3d11_view_uav.h b/src/d3d11/d3d11_view_uav.h index 5876f8e1f..bd2532e88 100644 --- a/src/d3d11/d3d11_view_uav.h +++ b/src/d3d11/d3d11_view_uav.h @@ -16,14 +16,14 @@ namespace dxvk { * have counters, which can be used inside shaders to * atomically append or consume structures. */ - class D3D11UnorderedAccessView : public D3D11DeviceChild { + class D3D11UnorderedAccessView : public D3D11DeviceChild { public: D3D11UnorderedAccessView( - D3D11Device* pDevice, - ID3D11Resource* pResource, - const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc); + D3D11Device* pDevice, + ID3D11Resource* pResource, + const D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); ~D3D11UnorderedAccessView(); @@ -34,6 +34,8 @@ namespace dxvk { void STDMETHODCALLTYPE GetResource(ID3D11Resource** ppResource) final; void STDMETHODCALLTYPE GetDesc(D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) final; + + void STDMETHODCALLTYPE GetDesc1(D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc) final; const D3D11_VK_VIEW_INFO& GetViewInfo() const { return m_info; @@ -62,18 +64,21 @@ namespace dxvk { } static HRESULT GetDescFromResource( - ID3D11Resource* pResource, - D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc); + ID3D11Resource* pResource, + D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); + + static D3D11_UNORDERED_ACCESS_VIEW_DESC1 PromoteDesc( + const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc); static HRESULT NormalizeDesc( - ID3D11Resource* pResource, - D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc); + ID3D11Resource* pResource, + D3D11_UNORDERED_ACCESS_VIEW_DESC1* pDesc); private: Com m_device; ID3D11Resource* m_resource; - D3D11_UNORDERED_ACCESS_VIEW_DESC m_desc; + D3D11_UNORDERED_ACCESS_VIEW_DESC1 m_desc; D3D11_VK_VIEW_INFO m_info; Rc m_bufferView; Rc m_imageView;