From a291dbf0ce774fdc11c820471e26bda656bf1666 Mon Sep 17 00:00:00 2001 From: kopaka1822 Date: Tue, 23 May 2023 20:59:21 +0200 Subject: fixed incorrect handling of D3D12_RENDER_TARGET_VIEW_DESC.ViewDimensi… (#2897) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- tools/gfx/d3d12/d3d12-device.cpp | 100 ++++++++++++++++++++++++++------------- 1 file 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 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; -- cgit v1.2.3