// 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
