summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkopaka1822 <felixbruell@live.de>2023-05-23 20:59:21 +0200
committerGitHub <noreply@github.com>2023-05-23 11:59:21 -0700
commita291dbf0ce774fdc11c820471e26bda656bf1666 (patch)
tree3c0635119e4b095e9746afac73ac124efce0453f
parent192c318900c9bc4248cacc1b9bb6b195baf2b23e (diff)
fixed incorrect handling of D3D12_RENDER_TARGET_VIEW_DESC.ViewDimensi… (#2897)
* fixed incorrect handling of D3D12_RENDER_TARGET_VIEW_DESC.ViewDimension for arrays (needs to be set based on the underlying resource and not the requested view. Otherwise members like FirstArraySlice can not be set properly). Also fixes problems with D3D12_RENDER_TARGET_VIEW_DESC.PlaneSlice since Texture2DArray.PlaneSlice and Texture2D.PlaneSlice do not share the same memory location (unlike the MipSlice). * fixed isArray definition for d3d12 texture views --------- Co-authored-by: Yong He <yonghe@outlook.com>
-rw-r--r--tools/gfx/d3d12/d3d12-device.cpp100
1 files changed, 67 insertions, 33 deletions
diff --git a/tools/gfx/d3d12/d3d12-device.cpp b/tools/gfx/d3d12/d3d12-device.cpp
index f00b4d8e0..863326a94 100644
--- a/tools/gfx/d3d12/d3d12-device.cpp
+++ b/tools/gfx/d3d12/d3d12-device.cpp
@@ -1308,7 +1308,7 @@ Result DeviceImpl::createTextureView(
RefPtr<ResourceViewImpl> viewImpl = new ResourceViewImpl();
viewImpl->m_resource = resourceImpl;
viewImpl->m_desc = desc;
- bool isArray = resourceImpl ? resourceImpl->getDesc()->arraySize != 0 : false;
+ bool isArray = resourceImpl ? resourceImpl->getDesc()->arraySize > 1 : false;
bool isMultiSample = resourceImpl ? resourceImpl->getDesc()->sampleDesc.numSamples > 1 : false;
switch (desc.type)
{
@@ -1321,13 +1321,21 @@ Result DeviceImpl::createTextureView(
viewImpl->m_allocator = m_rtvAllocator;
D3D12_RENDER_TARGET_VIEW_DESC rtvDesc = {};
rtvDesc.Format = D3DUtil::getMapFormat(desc.format);
- isArray = desc.subresourceRange.layerCount > 1;
switch (desc.renderTarget.shape)
{
case IResource::Type::Texture1D:
- rtvDesc.ViewDimension =
- isArray ? D3D12_RTV_DIMENSION_TEXTURE1DARRAY : D3D12_RTV_DIMENSION_TEXTURE1D;
- rtvDesc.Texture1D.MipSlice = desc.subresourceRange.mipLevel;
+ rtvDesc.ViewDimension = isArray ? D3D12_RTV_DIMENSION_TEXTURE1DARRAY : D3D12_RTV_DIMENSION_TEXTURE1D;
+ if(isArray)
+ {
+ rtvDesc.Texture1DArray.MipSlice = desc.subresourceRange.mipLevel;
+ rtvDesc.Texture1DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ rtvDesc.Texture1DArray.ArraySize = desc.subresourceRange.layerCount;
+ }
+ else
+ {
+ rtvDesc.Texture1D.MipSlice = desc.subresourceRange.mipLevel;
+ }
+
break;
case IResource::Type::Texture2D:
if (isMultiSample)
@@ -1341,14 +1349,26 @@ Result DeviceImpl::createTextureView(
{
rtvDesc.ViewDimension = isArray ? D3D12_RTV_DIMENSION_TEXTURE2DARRAY
: D3D12_RTV_DIMENSION_TEXTURE2D;
- rtvDesc.Texture2DArray.MipSlice = desc.subresourceRange.mipLevel;
- rtvDesc.Texture2DArray.PlaneSlice =
- resourceImpl ? D3DUtil::getPlaneSlice(
- D3DUtil::getMapFormat(resourceImpl->getDesc()->format),
- desc.subresourceRange.aspectMask)
- : 0;
- rtvDesc.Texture2DArray.ArraySize = desc.subresourceRange.layerCount;
- rtvDesc.Texture2DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ if(isArray)
+ {
+ rtvDesc.Texture2DArray.MipSlice = desc.subresourceRange.mipLevel;
+ rtvDesc.Texture2DArray.ArraySize = desc.subresourceRange.layerCount;
+ rtvDesc.Texture2DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ rtvDesc.Texture2DArray.PlaneSlice =
+ resourceImpl ? D3DUtil::getPlaneSlice(
+ D3DUtil::getMapFormat(resourceImpl->getDesc()->format),
+ desc.subresourceRange.aspectMask)
+ : 0;
+ }
+ else
+ {
+ rtvDesc.Texture2D.MipSlice = desc.subresourceRange.mipLevel;
+ rtvDesc.Texture2D.PlaneSlice =
+ resourceImpl ? D3DUtil::getPlaneSlice(
+ D3DUtil::getMapFormat(resourceImpl->getDesc()->format),
+ desc.subresourceRange.aspectMask)
+ : 0;
+ }
}
break;
case IResource::Type::Texture3D:
@@ -1376,7 +1396,6 @@ Result DeviceImpl::createTextureView(
viewImpl->m_allocator = m_dsvAllocator;
D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc = {};
dsvDesc.Format = D3DUtil::getMapFormat(desc.format);
- isArray = desc.subresourceRange.layerCount > 1;
switch (desc.renderTarget.shape)
{
case IResource::Type::Texture1D:
@@ -1425,27 +1444,42 @@ Result DeviceImpl::createTextureView(
switch (resourceImpl->getDesc()->type)
{
case IResource::Type::Texture1D:
- d3d12desc.ViewDimension = resourceDesc.arraySize == 0
- ? D3D12_UAV_DIMENSION_TEXTURE1D
- : D3D12_UAV_DIMENSION_TEXTURE1DARRAY;
- d3d12desc.Texture1D.MipSlice = desc.subresourceRange.mipLevel;
- d3d12desc.Texture1DArray.ArraySize = desc.subresourceRange.layerCount == 0
- ? resourceDesc.arraySize
- : desc.subresourceRange.layerCount;
- d3d12desc.Texture1DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
-
+ d3d12desc.ViewDimension = isArray
+ ? D3D12_UAV_DIMENSION_TEXTURE1DARRAY
+ : D3D12_UAV_DIMENSION_TEXTURE1D;
+ if(isArray)
+ {
+ d3d12desc.Texture1D.MipSlice = desc.subresourceRange.mipLevel;
+ }
+ else
+ {
+ d3d12desc.Texture1DArray.MipSlice = desc.subresourceRange.mipLevel;
+ d3d12desc.Texture1DArray.ArraySize = desc.subresourceRange.layerCount == 0
+ ? resourceDesc.arraySize
+ : desc.subresourceRange.layerCount;
+ d3d12desc.Texture1DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ }
break;
case IResource::Type::Texture2D:
- d3d12desc.ViewDimension = resourceDesc.arraySize == 0
- ? D3D12_UAV_DIMENSION_TEXTURE2D
- : D3D12_UAV_DIMENSION_TEXTURE2DARRAY;
- d3d12desc.Texture2D.MipSlice = desc.subresourceRange.mipLevel;
- d3d12desc.Texture2D.PlaneSlice =
- D3DUtil::getPlaneSlice(d3d12desc.Format, desc.subresourceRange.aspectMask);
- d3d12desc.Texture2DArray.ArraySize = desc.subresourceRange.layerCount == 0
- ? resourceDesc.arraySize
- : desc.subresourceRange.layerCount;
- d3d12desc.Texture2DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ d3d12desc.ViewDimension = isArray
+ ? D3D12_UAV_DIMENSION_TEXTURE2DARRAY
+ : D3D12_UAV_DIMENSION_TEXTURE2D;
+ if(isArray)
+ {
+ d3d12desc.Texture2DArray.MipSlice = desc.subresourceRange.mipLevel;
+ d3d12desc.Texture2DArray.ArraySize = desc.subresourceRange.layerCount == 0
+ ? resourceDesc.arraySize
+ : desc.subresourceRange.layerCount;
+ d3d12desc.Texture2DArray.FirstArraySlice = desc.subresourceRange.baseArrayLayer;
+ d3d12desc.Texture2DArray.PlaneSlice =
+ D3DUtil::getPlaneSlice(d3d12desc.Format, desc.subresourceRange.aspectMask);
+ }
+ else
+ {
+ d3d12desc.Texture2D.MipSlice = desc.subresourceRange.mipLevel;
+ d3d12desc.Texture2D.PlaneSlice =
+ D3DUtil::getPlaneSlice(d3d12desc.Format, desc.subresourceRange.aspectMask);
+ }
break;
case IResource::Type::Texture3D:
d3d12desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D;