@@ -1020,7 +1020,10 @@ NRI_INLINE void CommandBufferD3D12::Barrier(const BarrierDesc& barrierDesc) {
10201020 for (uint32_t i = 0 ; i < barrierDesc.textureNum ; i++) {
10211021 const TextureBarrierDesc& in = barrierDesc.textures [i];
10221022 const TextureD3D12& texture = *(TextureD3D12*)in.texture ;
1023- const TextureDesc& desc = texture.GetDesc ();
1023+ const TextureDesc& textureDesc = texture.GetDesc ();
1024+
1025+ Dim_t mipNum = in.mipNum == REMAINING ? (textureDesc.mipNum - in.mipOffset ) : in.mipNum ;
1026+ Dim_t layerNum = in.layerNum == REMAINING ? (textureDesc.layerNum - in.layerOffset ) : in.layerNum ;
10241027
10251028 D3D12_TEXTURE_BARRIER & out = textureBarriers[i];
10261029 out = {};
@@ -1032,11 +1035,11 @@ NRI_INLINE void CommandBufferD3D12::Barrier(const BarrierDesc& barrierDesc) {
10321035 out.LayoutAfter = GetBarrierLayout (in.after .layout , in.after .access );
10331036 out.pResource = texture;
10341037 out.Subresources .IndexOrFirstMipLevel = in.mipOffset ;
1035- out.Subresources .NumMipLevels = in. mipNum == REMAINING ? desc. mipNum : in. mipNum ;
1038+ out.Subresources .NumMipLevels = mipNum;
10361039 out.Subresources .FirstArraySlice = in.layerOffset ;
1037- out.Subresources .NumArraySlices = in. layerNum == REMAINING ? desc. layerNum : in. layerNum ;
1040+ out.Subresources .NumArraySlices = layerNum;
10381041
1039- const FormatProps& formatProps = GetFormatProps (desc .format );
1042+ const FormatProps& formatProps = GetFormatProps (textureDesc .format );
10401043 if (in.planes == PlaneBits::ALL || (in.planes & PlaneBits::STENCIL )) { // fallthrough
10411044 out.Subresources .NumPlanes += formatProps.isStencil ? 1 : 0 ;
10421045 out.Subresources .FirstPlane = 1 ;
@@ -1067,10 +1070,11 @@ NRI_INLINE void CommandBufferD3D12::Barrier(const BarrierDesc& barrierDesc) {
10671070 const TextureBarrierDesc& barrier = barrierDesc.textures [i];
10681071 const TextureD3D12& texture = *(TextureD3D12*)barrier.texture ;
10691072 const TextureDesc& textureDesc = texture.GetDesc ();
1070- const Dim_t layerNum = barrier.layerNum == REMAINING ? textureDesc.layerNum : barrier.layerNum ;
1071- const Dim_t mipNum = barrier.mipNum == REMAINING ? textureDesc.mipNum : barrier.mipNum ;
10721073
1073- if (barrier.layerOffset == 0 && layerNum == textureDesc.layerNum && barrier.mipOffset == 0 && mipNum == textureDesc.mipNum )
1074+ Dim_t mipNum = barrier.mipNum == REMAINING ? (textureDesc.mipNum - barrier.mipOffset ) : barrier.mipNum ;
1075+ Dim_t layerNum = barrier.layerNum == REMAINING ? (textureDesc.layerNum - barrier.layerOffset ) : barrier.layerNum ;
1076+
1077+ if (layerNum == textureDesc.layerNum && mipNum == textureDesc.mipNum && barrier.planes == PlaneBits::ALL )
10741078 barrierNum++;
10751079 else
10761080 barrierNum += layerNum * mipNum;
@@ -1105,15 +1109,16 @@ NRI_INLINE void CommandBufferD3D12::Barrier(const BarrierDesc& barrierDesc) {
11051109 const TextureBarrierDesc& barrier = barrierDesc.textures [i];
11061110 const TextureD3D12& texture = *(TextureD3D12*)barrier.texture ;
11071111 const TextureDesc& textureDesc = texture.GetDesc ();
1108- const Dim_t layerNum = barrier.layerNum == REMAINING ? textureDesc.layerNum : barrier.layerNum ;
1109- const Dim_t mipNum = barrier.mipNum == REMAINING ? textureDesc.mipNum : barrier.mipNum ;
11101112
1111- if (barrier.layerOffset == 0 && layerNum == textureDesc.layerNum && barrier.mipOffset == 0 && mipNum == textureDesc.mipNum && barrier.planes == PlaneBits::ALL )
1113+ Dim_t mipNum = barrier.mipNum == REMAINING ? (textureDesc.mipNum - barrier.mipOffset ) : barrier.mipNum ;
1114+ Dim_t layerNum = barrier.layerNum == REMAINING ? (textureDesc.layerNum - barrier.layerOffset ) : barrier.layerNum ;
1115+
1116+ if (layerNum == textureDesc.layerNum && mipNum == textureDesc.mipNum && barrier.planes == PlaneBits::ALL )
11121117 ptr += AddResourceBarrier (commandListType, texture, barrier.before .access , barrier.after .access , *ptr, D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES );
11131118 else {
1114- for (Dim_t layerOffset = barrier. layerOffset ; layerOffset < barrier. layerOffset + layerNum; layerOffset ++) {
1115- for (Dim_t mipOffset = barrier. mipOffset ; mipOffset < barrier. mipOffset + mipNum; mipOffset ++) {
1116- uint32_t subresource = GetSubresourceIndex (layerOffset, textureDesc.layerNum , mipOffset, textureDesc.mipNum , barrier.planes );
1119+ for (Dim_t layer = 0 ; layer < layerNum; layer ++) {
1120+ for (Dim_t mip = 0 ; mip < mipNum; mip ++) {
1121+ uint32_t subresource = GetSubresourceIndex (barrier. layerOffset + layer , textureDesc.layerNum , barrier. mipOffset + mip , textureDesc.mipNum , barrier.planes );
11171122 ptr += AddResourceBarrier (commandListType, texture, barrier.before .access , barrier.after .access , *ptr, subresource);
11181123 }
11191124 }
0 commit comments