mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 04:29:15 +01:00
[d3d11] Allow creation of unordered access views for planar images
This commit is contained in:
parent
6d72bc94f4
commit
01051bac99
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<DxvkBuffer> D3D11UnorderedAccessView::CreateCounterBuffer() {
|
||||
Rc<DxvkDevice> device = m_parent->GetDXVKDevice();
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user