mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[d3d11] Implement ID3D11UnorderedAccessView1
This commit is contained in:
parent
81935e1684
commit
84c80a4aaf
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -16,14 +16,14 @@ namespace dxvk {
|
||||
* have counters, which can be used inside shaders to
|
||||
* atomically append or consume structures.
|
||||
*/
|
||||
class D3D11UnorderedAccessView : public D3D11DeviceChild<ID3D11UnorderedAccessView> {
|
||||
class D3D11UnorderedAccessView : public D3D11DeviceChild<ID3D11UnorderedAccessView1> {
|
||||
|
||||
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<D3D11Device> 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<DxvkBufferView> m_bufferView;
|
||||
Rc<DxvkImageView> m_imageView;
|
||||
|
Loading…
x
Reference in New Issue
Block a user