// Copyright 2017 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "dawn_native/d3d12/TextureCopySplitter.h"

#include "common/Assert.h"
#include "dawn_native/Format.h"
#include "dawn_native/d3d12/d3d12_platform.h"

namespace dawn::native::d3d12 {

    namespace {
        Origin3D ComputeTexelOffsets(const TexelBlockInfo& blockInfo,
                                     uint32_t offset,
                                     uint32_t bytesPerRow) {
            ASSERT(bytesPerRow != 0);
            uint32_t byteOffsetX = offset % bytesPerRow;
            uint32_t byteOffsetY = offset - byteOffsetX;

            return {byteOffsetX / blockInfo.byteSize * blockInfo.width,
                    byteOffsetY / bytesPerRow * blockInfo.height, 0};
        }

        uint64_t OffsetToFirstCopiedTexel(const TexelBlockInfo& blockInfo,
                                          uint32_t bytesPerRow,
                                          uint64_t alignedOffset,
                                          Origin3D bufferOffset) {
            ASSERT(bufferOffset.z == 0);
            return alignedOffset + bufferOffset.x * blockInfo.byteSize / blockInfo.width +
                   bufferOffset.y * bytesPerRow / blockInfo.height;
        }

        uint64_t AlignDownForDataPlacement(uint32_t offset) {
            return offset & ~static_cast<uint64_t>(D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT - 1);
        }
    }  // namespace

    TextureCopySubresource::CopyInfo* TextureCopySubresource::AddCopy() {
        ASSERT(this->count < kMaxTextureCopyRegions);
        return &this->copies[this->count++];
    }

    TextureCopySubresource Compute2DTextureCopySubresource(Origin3D origin,
                                                           Extent3D copySize,
                                                           const TexelBlockInfo& blockInfo,
                                                           uint64_t offset,
                                                           uint32_t bytesPerRow) {
        TextureCopySubresource copy;

        ASSERT(bytesPerRow % blockInfo.byteSize == 0);

        // The copies must be 512-aligned. To do this, we calculate the first 512-aligned address
        // preceding our data.
        uint64_t alignedOffset = AlignDownForDataPlacement(offset);

        // If the provided offset to the data was already 512-aligned, we can simply copy the data
        // without further translation.
        if (offset == alignedOffset) {
            copy.count = 1;

            copy.copies[0].alignedOffset = alignedOffset;
            copy.copies[0].textureOffset = origin;
            copy.copies[0].copySize = copySize;
            copy.copies[0].bufferOffset = {0, 0, 0};
            copy.copies[0].bufferSize = copySize;

            return copy;
        }

        ASSERT(alignedOffset < offset);
        ASSERT(offset - alignedOffset < D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);

        // We must reinterpret our aligned offset into X and Y offsets with respect to the row
        // pitch.
        //
        // You can visualize the data in the buffer like this:
        // |-----------------------++++++++++++++++++++++++++++++++|
        // ^ 512-aligned address   ^ Aligned offset               ^ End of copy data
        //
        // Now when you consider the row pitch, you can visualize the data like this:
        // |~~~~~~~~~~~~~~~~|
        // |~~~~~+++++++++++|
        // |++++++++++++++++|
        // |+++++~~~~~~~~~~~|
        // |<---row pitch-->|
        //
        // The X and Y offsets calculated in ComputeTexelOffsets can be visualized like this:
        // |YYYYYYYYYYYYYYYY|
        // |XXXXXX++++++++++|
        // |++++++++++++++++|
        // |++++++~~~~~~~~~~|
        // |<---row pitch-->|
        Origin3D texelOffset = ComputeTexelOffsets(
            blockInfo, static_cast<uint32_t>(offset - alignedOffset), bytesPerRow);

        ASSERT(texelOffset.y <= blockInfo.height);
        ASSERT(texelOffset.z == 0);

        uint32_t copyBytesPerRowPitch = copySize.width / blockInfo.width * blockInfo.byteSize;
        uint32_t byteOffsetInRowPitch = texelOffset.x / blockInfo.width * blockInfo.byteSize;
        if (copyBytesPerRowPitch + byteOffsetInRowPitch <= bytesPerRow) {
            // The region's rows fit inside the bytes per row. In this case, extend the width of the
            // PlacedFootprint and copy the buffer with an offset location
            //  |<------------- bytes per row ------------->|
            //
            //  |-------------------------------------------|
            //  |                                           |
            //  |                 +++++++++++++++++~~~~~~~~~|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++~~~~~~~~~|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++~~~~~~~~~|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++~~~~~~~~~|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++         |
            //  |-------------------------------------------|

            // Copy 0:
            //  |----------------------------------|
            //  |                                  |
            //  |                 +++++++++++++++++|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++|
            //  |~~~~~~~~~~~~~~~~~+++++++++++++++++|
            //  |----------------------------------|

            copy.count = 1;

            copy.copies[0].alignedOffset = alignedOffset;
            copy.copies[0].textureOffset = origin;
            copy.copies[0].copySize = copySize;
            copy.copies[0].bufferOffset = texelOffset;

            copy.copies[0].bufferSize.width = copySize.width + texelOffset.x;
            copy.copies[0].bufferSize.height = copySize.height + texelOffset.y;
            copy.copies[0].bufferSize.depthOrArrayLayers = copySize.depthOrArrayLayers;

            return copy;
        }

        // The region's rows straddle the bytes per row. Split the copy into two copies
        //  |<------------- bytes per row ------------->|
        //
        //  |-------------------------------------------|
        //  |                                           |
        //  |                                   ++++++++|
        //  |+++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |+++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |+++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |+++++++++~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |+++++++++                                  |
        //  |-------------------------------------------|

        //  Copy 0:
        //  |-------------------------------------------|
        //  |                                           |
        //  |                                   ++++++++|
        //  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++++++++|
        //  |-------------------------------------------|

        //  Copy 1:
        //  |---------|
        //  |         |
        //  |         |
        //  |+++++++++|
        //  |+++++++++|
        //  |+++++++++|
        //  |+++++++++|
        //  |+++++++++|
        //  |---------|

        copy.count = 2;

        copy.copies[0].alignedOffset = alignedOffset;
        copy.copies[0].textureOffset = origin;

        ASSERT(bytesPerRow > byteOffsetInRowPitch);
        uint32_t texelsPerRow = bytesPerRow / blockInfo.byteSize * blockInfo.width;
        copy.copies[0].copySize.width = texelsPerRow - texelOffset.x;
        copy.copies[0].copySize.height = copySize.height;
        copy.copies[0].copySize.depthOrArrayLayers = copySize.depthOrArrayLayers;

        copy.copies[0].bufferOffset = texelOffset;
        copy.copies[0].bufferSize.width = texelsPerRow;
        copy.copies[0].bufferSize.height = copySize.height + texelOffset.y;
        copy.copies[0].bufferSize.depthOrArrayLayers = copySize.depthOrArrayLayers;

        uint64_t offsetForCopy1 =
            offset + copy.copies[0].copySize.width / blockInfo.width * blockInfo.byteSize;
        uint64_t alignedOffsetForCopy1 = AlignDownForDataPlacement(offsetForCopy1);
        Origin3D texelOffsetForCopy1 = ComputeTexelOffsets(
            blockInfo, static_cast<uint32_t>(offsetForCopy1 - alignedOffsetForCopy1), bytesPerRow);

        ASSERT(texelOffsetForCopy1.y <= blockInfo.height);
        ASSERT(texelOffsetForCopy1.z == 0);

        copy.copies[1].alignedOffset = alignedOffsetForCopy1;
        copy.copies[1].textureOffset.x = origin.x + copy.copies[0].copySize.width;
        copy.copies[1].textureOffset.y = origin.y;
        copy.copies[1].textureOffset.z = origin.z;

        ASSERT(copySize.width > copy.copies[0].copySize.width);
        copy.copies[1].copySize.width = copySize.width - copy.copies[0].copySize.width;
        copy.copies[1].copySize.height = copySize.height;
        copy.copies[1].copySize.depthOrArrayLayers = copySize.depthOrArrayLayers;

        copy.copies[1].bufferOffset = texelOffsetForCopy1;
        copy.copies[1].bufferSize.width = copy.copies[1].copySize.width + texelOffsetForCopy1.x;
        copy.copies[1].bufferSize.height = copySize.height + texelOffsetForCopy1.y;
        copy.copies[1].bufferSize.depthOrArrayLayers = copySize.depthOrArrayLayers;

        return copy;
    }

    TextureCopySplits Compute2DTextureCopySplits(Origin3D origin,
                                                 Extent3D copySize,
                                                 const TexelBlockInfo& blockInfo,
                                                 uint64_t offset,
                                                 uint32_t bytesPerRow,
                                                 uint32_t rowsPerImage) {
        TextureCopySplits copies;

        const uint64_t bytesPerLayer = bytesPerRow * rowsPerImage;

        // The function Compute2DTextureCopySubresource() decides how to split the copy based on:
        // - the alignment of the buffer offset with D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512)
        // - the alignment of the buffer offset with D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256)
        // Each layer of a 2D array might need to be split, but because of the WebGPU
        // constraint that "bytesPerRow" must be a multiple of 256, all odd (resp. all even) layers
        // will be at an offset multiple of 512 of each other, which means they will all result in
        // the same 2D split. Thus we can just compute the copy splits for the first and second
        // layers, and reuse them for the remaining layers by adding the related offset of each
        // layer. Moreover, if "rowsPerImage" is even, both the first and second copy layers can
        // share the same copy split, so in this situation we just need to compute copy split once
        // and reuse it for all the layers.
        Extent3D copyOneLayerSize = copySize;
        Origin3D copyFirstLayerOrigin = origin;
        copyOneLayerSize.depthOrArrayLayers = 1;
        copyFirstLayerOrigin.z = 0;

        copies.copySubresources[0] = Compute2DTextureCopySubresource(
            copyFirstLayerOrigin, copyOneLayerSize, blockInfo, offset, bytesPerRow);

        // When the copy only refers one texture 2D array layer,
        // copies.copySubresources[1] will never be used so we can safely early return here.
        if (copySize.depthOrArrayLayers == 1) {
            return copies;
        }

        if (bytesPerLayer % D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT == 0) {
            copies.copySubresources[1] = copies.copySubresources[0];
            copies.copySubresources[1].copies[0].alignedOffset += bytesPerLayer;
            copies.copySubresources[1].copies[1].alignedOffset += bytesPerLayer;
        } else {
            const uint64_t bufferOffsetNextLayer = offset + bytesPerLayer;
            copies.copySubresources[1] =
                Compute2DTextureCopySubresource(copyFirstLayerOrigin, copyOneLayerSize, blockInfo,
                                                bufferOffsetNextLayer, bytesPerRow);
        }

        return copies;
    }

    void Recompute3DTextureCopyRegionWithEmptyFirstRowAndEvenCopyHeight(
        Origin3D origin,
        Extent3D copySize,
        const TexelBlockInfo& blockInfo,
        uint32_t bytesPerRow,
        uint32_t rowsPerImage,
        TextureCopySubresource& copy,
        uint32_t i) {
        // Let's assign data and show why copy region generated by ComputeTextureCopySubresource
        // is incorrect if there is an empty row at the beginning of the copy block.
        // Assuming that bytesPerRow is 256 and we are doing a B2T copy, and copy size is {width: 2,
        // height: 4, depthOrArrayLayers: 3}. Then the data layout in buffer is demonstrated
        // as below:
        //
        //               |<----- bytes per row ------>|
        //
        //               |----------------------------|
        //  row (N - 1)  |                            |
        //  row N        |                 ++~~~~~~~~~|
        //  row (N + 1)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 2)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 3)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 4)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 5)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 6)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 7)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 8)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 9)  |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 10) |~~~~~~~~~~~~~~~~~++~~~~~~~~~|
        //  row (N + 11) |~~~~~~~~~~~~~~~~~++         |
        //               |----------------------------|

        // The copy we mean to do is the following:
        //
        //   - image 0: row N to row (N + 3),
        //   - image 1: row (N + 4) to row (N + 7),
        //   - image 2: row (N + 8) to row (N + 11).
        //
        // Note that alignedOffset is at the beginning of row (N - 1), while buffer offset makes
        // the copy start at row N. Row (N - 1) is the empty row between alignedOffset and offset.
        //
        // The 2D copy region of image 0 we received from Compute2DTextureCopySubresource() is
        // the following:
        //
        //              |-------------------|
        //  row (N - 1) |                   |
        //  row N       |                 ++|
        //  row (N + 1) |~~~~~~~~~~~~~~~~~++|
        //  row (N + 2) |~~~~~~~~~~~~~~~~~++|
        //  row (N + 3) |~~~~~~~~~~~~~~~~~++|
        //              |-------------------|
        //
        // However, if we simply expand the copy region of image 0 to all depth ranges of a 3D
        // texture, we will copy 5 rows every time, and every first row of each slice will be
        // skipped. As a result, the copied data will be:
        //
        //   - image 0: row N to row (N + 3), which is correct. Row (N - 1) is skipped.
        //   - image 1: row (N + 5) to row (N + 8) because row (N + 4) is skipped. It is incorrect.
        //
        // Likewise, all other image followed will be incorrect because we wrongly keep skipping
        // one row for each depth slice.
        //
        // Solution: split the copy region to two copies: copy 3 (rowsPerImage - 1) rows in and
        // expand to all depth slices in the first copy. 3 rows + one skipped rows = 4 rows, which
        // equals to rowsPerImage. Then copy the last row in the second copy. However, the copy
        // block of the last row of the last image may out-of-bound (see the details below), so
        // we need an extra copy for the very last row.

        // Copy 0: copy 3 rows, not 4 rows.
        //                _____________________
        //               /                    /|
        //              /                    / |
        //              |-------------------|  |
        //  row (N - 1) |                   |  |
        //  row N       |                 ++|  |
        //  row (N + 1) |~~~~~~~~~~~~~~~~~++| /
        //  row (N + 2) |~~~~~~~~~~~~~~~~~++|/
        //              |-------------------|

        // Copy 1: move down two rows and copy the last row on image 0, and expand to
        // copySize.depthOrArrayLayers - 1 depth slices. Note that if we expand it to all depth
        // slices, the last copy block will be row (N + 9) to row (N + 12). Row (N + 11) might
        // be the last row of the entire buffer. Then row (N + 12) will be out-of-bound.
        //                _____________________
        //               /                    /|
        //              /                    / |
        //              |-------------------|  |
        //  row (N + 1) |                   |  |
        //  row (N + 2) |                   |  |
        //  row (N + 3) |                 ++| /
        //  row (N + 4) |~~~~~~~~~~~~~~~~~~~|/
        //              |-------------------|
        //
        //  copy 2: copy the last row of the last image.
        //              |-------------------|
        //  row (N + 11)|                 ++|
        //              |-------------------|

        // Copy 0: copy copySize.height - 1 rows
        TextureCopySubresource::CopyInfo& copy0 = copy.copies[i];
        copy0.copySize.height = copySize.height - blockInfo.height;
        copy0.bufferSize.height = rowsPerImage * blockInfo.height;  // rowsPerImageInTexels

        // Copy 1: move down 2 rows and copy the last row on image 0, and expand to all depth slices
        // but the last one.
        TextureCopySubresource::CopyInfo* copy1 = copy.AddCopy();
        *copy1 = copy0;
        copy1->alignedOffset += 2 * bytesPerRow;
        copy1->textureOffset.y += copySize.height - blockInfo.height;
        // Offset two rows from the copy height for the bufferOffset (See the figure above):
        //   - one for the row we advanced in the buffer: row (N + 4).
        //   - one for the last row we want to copy: row (N + 3) itself.
        copy1->bufferOffset.y = copySize.height - 2 * blockInfo.height;
        copy1->copySize.height = blockInfo.height;
        copy1->copySize.depthOrArrayLayers--;
        copy1->bufferSize.depthOrArrayLayers--;

        // Copy 2: copy the last row of the last image.
        uint64_t offsetForCopy0 = OffsetToFirstCopiedTexel(blockInfo, bytesPerRow,
                                                           copy0.alignedOffset, copy0.bufferOffset);
        uint64_t offsetForLastRowOfLastImage =
            offsetForCopy0 + bytesPerRow * (copy0.copySize.height +
                                            rowsPerImage * (copySize.depthOrArrayLayers - 1));
        uint64_t alignedOffsetForLastRowOfLastImage =
            AlignDownForDataPlacement(offsetForLastRowOfLastImage);
        Origin3D texelOffsetForLastRowOfLastImage = ComputeTexelOffsets(
            blockInfo,
            static_cast<uint32_t>(offsetForLastRowOfLastImage - alignedOffsetForLastRowOfLastImage),
            bytesPerRow);

        TextureCopySubresource::CopyInfo* copy2 = copy.AddCopy();
        copy2->alignedOffset = alignedOffsetForLastRowOfLastImage;
        copy2->textureOffset = copy1->textureOffset;
        copy2->textureOffset.z = origin.z + copySize.depthOrArrayLayers - 1;
        copy2->copySize = copy1->copySize;
        copy2->copySize.depthOrArrayLayers = 1;
        copy2->bufferOffset = texelOffsetForLastRowOfLastImage;
        copy2->bufferSize.width = copy1->bufferSize.width;
        ASSERT(copy2->copySize.height == 1);
        copy2->bufferSize.height = copy2->bufferOffset.y + copy2->copySize.height;
        copy2->bufferSize.depthOrArrayLayers = 1;
    }

    void Recompute3DTextureCopyRegionWithEmptyFirstRowAndOddCopyHeight(Extent3D copySize,
                                                                       uint32_t bytesPerRow,
                                                                       TextureCopySubresource& copy,
                                                                       uint32_t i) {
        // Read the comments of Recompute3DTextureCopyRegionWithEmptyFirstRowAndEvenCopyHeight() for
        // the reason why it is incorrect if we simply extend the copy region to all depth slices
        // when there is an empty first row at the copy region.
        //
        // If the copy height is odd, we can use two copies to make it correct:
        //   - copy 0: only copy the first depth slice. Keep other arguments the same.
        //   - copy 1: copy all rest depth slices because it will start without an empty row if
        //     copy height is odd. Odd height + one (empty row) is even. An even row number times
        //     bytesPerRow (256) will be aligned to D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512)

        // Copy 0: copy the first depth slice (image 0)
        TextureCopySubresource::CopyInfo& copy0 = copy.copies[i];
        copy0.copySize.depthOrArrayLayers = 1;
        copy0.bufferSize.depthOrArrayLayers = 1;

        // Copy 1: copy the rest depth slices in one shot
        TextureCopySubresource::CopyInfo* copy1 = copy.AddCopy();
        *copy1 = copy0;
        ASSERT(copySize.height % 2 == 1);
        copy1->alignedOffset += (copySize.height + 1) * bytesPerRow;
        ASSERT(copy1->alignedOffset % D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT == 0);
        // textureOffset.z should add one because the first slice has already been copied in copy0.
        copy1->textureOffset.z++;
        // bufferOffset.y should be 0 because we skipped the first depth slice and there is no empty
        // row in this copy region.
        copy1->bufferOffset.y = 0;
        copy1->copySize.height = copySize.height;
        copy1->copySize.depthOrArrayLayers = copySize.depthOrArrayLayers - 1;
        copy1->bufferSize.height = copySize.height;
        copy1->bufferSize.depthOrArrayLayers = copySize.depthOrArrayLayers - 1;
    }

    TextureCopySubresource Compute3DTextureCopySplits(Origin3D origin,
                                                      Extent3D copySize,
                                                      const TexelBlockInfo& blockInfo,
                                                      uint64_t offset,
                                                      uint32_t bytesPerRow,
                                                      uint32_t rowsPerImage) {
        // To compute the copy region(s) for 3D textures, we call Compute2DTextureCopySubresource
        // and get copy region(s) for the first slice of the copy, then extend to all depth slices
        // and become a 3D copy. However, this doesn't work as easily as that due to some corner
        // cases.
        //
        // For example, if bufferSize.height is greater than rowsPerImage in the generated copy
        // region and we simply extend the 2D copy region to all copied depth slices, copied data
        // will be incorrectly offset for each depth slice except the first one.
        //
        // For these special cases, we need to recompute the copy regions for 3D textures via
        // split the incorrect copy region to a couple more copy regions.

        // Call Compute2DTextureCopySubresource and get copy regions. This function has already
        // forwarded "copySize.depthOrArrayLayers" to all depth slices.
        TextureCopySubresource copySubresource =
            Compute2DTextureCopySubresource(origin, copySize, blockInfo, offset, bytesPerRow);

        ASSERT(copySubresource.count <= 2);
        // If copySize.depth is 1, we can return copySubresource. Because we don't need to extend
        // the copy region(s) to other depth slice(s).
        if (copySize.depthOrArrayLayers == 1) {
            return copySubresource;
        }

        uint32_t rowsPerImageInTexels = rowsPerImage * blockInfo.height;
        // The copy region(s) generated by Compute2DTextureCopySubresource might be incorrect.
        // However, we may append a couple more copy regions in the for loop below. We don't need
        // to revise these new added copy regions.
        uint32_t originalCopyCount = copySubresource.count;
        for (uint32_t i = 0; i < originalCopyCount; ++i) {
            // There can be one empty row at most in a copy region.
            ASSERT(copySubresource.copies[i].bufferSize.height <=
                   rowsPerImageInTexels + blockInfo.height);
            Extent3D& bufferSize = copySubresource.copies[i].bufferSize;

            if (bufferSize.height == rowsPerImageInTexels) {
                // If the copy region's bufferSize.height equals to rowsPerImageInTexels, we can use
                // this copy region without any modification.
                continue;
            }

            if (bufferSize.height < rowsPerImageInTexels) {
                // If we are copying multiple depth slices, we should skip rowsPerImageInTexels rows
                // for each slice even though we only copy partial rows in each slice sometimes.
                bufferSize.height = rowsPerImageInTexels;
            } else {
                // bufferSize.height > rowsPerImageInTexels. There is an empty row in this copy
                // region due to alignment adjustment.

                // bytesPerRow is definitely 256, and it is definitely a full copy on height.
                // Otherwise, bufferSize.height wount be greater than rowsPerImageInTexels and
                // there won't be an empty row at the beginning of this copy region.
                ASSERT(bytesPerRow == D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
                ASSERT(copySize.height == rowsPerImageInTexels);

                if (copySize.height % 2 == 0) {
                    // If copySize.height is even and there is an empty row at the beginning of the
                    // first slice of the copy region, the offset of all depth slices will never be
                    // aligned to D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512) and there is always
                    // an empty row at each depth slice. We need a totally different approach to
                    // split the copy region.
                    Recompute3DTextureCopyRegionWithEmptyFirstRowAndEvenCopyHeight(
                        origin, copySize, blockInfo, bytesPerRow, rowsPerImage, copySubresource, i);
                } else {
                    // If copySize.height is odd and there is an empty row at the beginning of the
                    // first slice of the copy region, we can split the copy region into two copies:
                    // copy0 to copy the first slice, copy1 to copy the rest slices because the
                    // offset of slice 1 is aligned to D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512)
                    // without an empty row. This is an easier case relative to cases with even copy
                    // height.
                    Recompute3DTextureCopyRegionWithEmptyFirstRowAndOddCopyHeight(
                        copySize, bytesPerRow, copySubresource, i);
                }
            }
        }

        return copySubresource;
    }
}  // namespace dawn::native::d3d12
