Skip to content

Commit 26e9402

Browse files
committed
D3D12: fixed/improved "REMAINING" handling in enhanced and legacy barriers
1 parent 2827c74 commit 26e9402

1 file changed

Lines changed: 18 additions & 13 deletions

File tree

Source/D3D12/CommandBufferD3D12.hpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)