Deprecate BufferCopyView.rowPitch/imageHeight -> bytesPerRow/rowsPerImage

Bug: dawn:22

Change-Id: Ib4d93a73a6c40326d180f569fd51216c2d87df1e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/20201
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index ab7defd..341139d 100644
--- a/dawn.json
+++ b/dawn.json
@@ -215,8 +215,10 @@
         "members": [
             {"name": "buffer", "type": "buffer"},
             {"name": "offset", "type": "uint64_t", "default": 0},
-            {"name": "row pitch", "type": "uint32_t"},
-            {"name": "image height", "type": "uint32_t"}
+            {"name": "row pitch", "type": "uint32_t", "default": 0},
+            {"name": "image height", "type": "uint32_t", "default": 0},
+            {"name": "bytes per row", "type": "uint32_t", "default": 0},
+            {"name": "rows per image", "type": "uint32_t", "default": 0}
         ]
     },
     "buffer descriptor": {
diff --git a/src/common/Constants.h b/src/common/Constants.h
index c157c06..df792cd 100644
--- a/src/common/Constants.h
+++ b/src/common/Constants.h
@@ -32,7 +32,7 @@
 static constexpr uint32_t kMaxVertexBufferStride = 2048u;
 static constexpr uint32_t kNumStages = 3;
 static constexpr uint32_t kMaxColorAttachments = 4u;
-static constexpr uint32_t kTextureRowPitchAlignment = 256u;
+static constexpr uint32_t kTextureBytesPerRowAlignment = 256u;
 // Dynamic buffer offsets require offset to be divisible by 256
 static constexpr uint64_t kMinDynamicBufferOffsetAlignment = 256u;
 // Max numbers of dynamic uniform buffers
diff --git a/src/dawn_native/CommandEncoder.cpp b/src/dawn_native/CommandEncoder.cpp
index bb6109f..91905d7 100644
--- a/src/dawn_native/CommandEncoder.cpp
+++ b/src/dawn_native/CommandEncoder.cpp
@@ -110,16 +110,16 @@
             return {};
         }
 
-        MaybeError ValidateImageHeight(const Format& format,
-                                       uint32_t imageHeight,
-                                       uint32_t copyHeight) {
-            if (imageHeight < copyHeight) {
-                return DAWN_VALIDATION_ERROR("Image height must not be less than the copy height.");
+        MaybeError ValidateRowsPerImage(const Format& format,
+                                        uint32_t rowsPerImage,
+                                        uint32_t copyHeight) {
+            if (rowsPerImage < copyHeight) {
+                return DAWN_VALIDATION_ERROR("rowsPerImage must not be less than the copy height.");
             }
 
-            if (imageHeight % format.blockHeight != 0) {
+            if (rowsPerImage % format.blockHeight != 0) {
                 return DAWN_VALIDATION_ERROR(
-                    "Image height must be a multiple of compressed texture format block width");
+                    "rowsPerImage must be a multiple of compressed texture format block width");
             }
 
             return {};
@@ -180,37 +180,37 @@
 
         MaybeError ComputeTextureCopyBufferSize(const Format& textureFormat,
                                                 const Extent3D& copySize,
-                                                uint32_t rowPitch,
-                                                uint32_t imageHeight,
+                                                uint32_t bytesPerRow,
+                                                uint32_t rowsPerImage,
                                                 uint32_t* bufferSize) {
-            ASSERT(imageHeight >= copySize.height);
+            ASSERT(rowsPerImage >= copySize.height);
             uint32_t blockByteSize = textureFormat.blockByteSize;
             uint32_t blockWidth = textureFormat.blockWidth;
             uint32_t blockHeight = textureFormat.blockHeight;
 
             // TODO(cwallez@chromium.org): check for overflows
-            uint32_t slicePitch = rowPitch * imageHeight / blockWidth;
-            uint32_t sliceSize = rowPitch * (copySize.height / blockHeight - 1) +
+            uint32_t slicePitch = bytesPerRow * rowsPerImage / blockWidth;
+            uint32_t sliceSize = bytesPerRow * (copySize.height / blockHeight - 1) +
                                  (copySize.width / blockWidth) * blockByteSize;
             *bufferSize = (slicePitch * (copySize.depth - 1)) + sliceSize;
 
             return {};
         }
 
-        uint32_t ComputeDefaultRowPitch(const Format& format, uint32_t width) {
+        uint32_t ComputeDefaultBytesPerRow(const Format& format, uint32_t width) {
             return width / format.blockWidth * format.blockByteSize;
         }
 
-        MaybeError ValidateRowPitch(const Format& format,
-                                    const Extent3D& copySize,
-                                    uint32_t rowPitch) {
-            if (rowPitch % kTextureRowPitchAlignment != 0) {
-                return DAWN_VALIDATION_ERROR("Row pitch must be a multiple of 256");
+        MaybeError ValidateBytesPerRow(const Format& format,
+                                       const Extent3D& copySize,
+                                       uint32_t bytesPerRow) {
+            if (bytesPerRow % kTextureBytesPerRowAlignment != 0) {
+                return DAWN_VALIDATION_ERROR("bytesPerRow must be a multiple of 256");
             }
 
-            if (rowPitch < copySize.width / format.blockWidth * format.blockByteSize) {
+            if (bytesPerRow < copySize.width / format.blockWidth * format.blockByteSize) {
                 return DAWN_VALIDATION_ERROR(
-                    "Row pitch must not be less than the number of bytes per row");
+                    "bytesPerRow must not be less than the number of bytes per row");
             }
 
             return {};
@@ -483,6 +483,40 @@
             return {};
         }
 
+        // TODO(dawn:22): Remove this once users bytesPerRow/rowsPerImage
+        ResultOrError<BufferCopyView> FixBufferCopyView(DeviceBase* device,
+                                                        const BufferCopyView* original) {
+            BufferCopyView fixed = *original;
+
+            if (fixed.rowPitch != 0) {
+                if (fixed.bytesPerRow != 0) {
+                    return DAWN_VALIDATION_ERROR(
+                        "Cannot use rowPitch and bytesPerRow at the same time");
+                } else {
+                    device->EmitDeprecationWarning(
+                        "BufferCopyView::rowPitch is deprecated, use BufferCopyView::bytesPerRow "
+                        "instead");
+                    fixed.bytesPerRow = fixed.rowPitch;
+                    fixed.rowPitch = 0;
+                }
+            }
+
+            if (fixed.imageHeight != 0) {
+                if (fixed.rowsPerImage != 0) {
+                    return DAWN_VALIDATION_ERROR(
+                        "Cannot use imageHeight and rowsPerImage at the same time");
+                } else {
+                    device->EmitDeprecationWarning(
+                        "BufferCopyView::imageHeight is deprecated, use "
+                        "BufferCopyView::rowsPerImage instead");
+                    fixed.rowsPerImage = fixed.imageHeight;
+                    fixed.imageHeight = 0;
+                }
+            }
+
+            return fixed;
+        }
+
     }  // namespace
 
     CommandEncoder::CommandEncoder(DeviceBase* device, const CommandEncoderDescriptor*)
@@ -629,32 +663,36 @@
                                              const TextureCopyView* destination,
                                              const Extent3D* copySize) {
         mEncodingContext.TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError {
-            DAWN_TRY(GetDevice()->ValidateObject(source->buffer));
+            // TODO(dawn:22): Remove this once users bytesPerRow/rowsPerImage
+            BufferCopyView fixedSource;
+            DAWN_TRY_ASSIGN(fixedSource, FixBufferCopyView(GetDevice(), source));
+
+            DAWN_TRY(GetDevice()->ValidateObject(fixedSource.buffer));
             DAWN_TRY(GetDevice()->ValidateObject(destination->texture));
 
             CopyBufferToTextureCmd* copy =
                 allocator->Allocate<CopyBufferToTextureCmd>(Command::CopyBufferToTexture);
-            copy->source.buffer = source->buffer;
-            copy->source.offset = source->offset;
+            copy->source.buffer = fixedSource.buffer;
+            copy->source.offset = fixedSource.offset;
             copy->destination.texture = destination->texture;
             copy->destination.origin = destination->origin;
             copy->copySize = *copySize;
             copy->destination.mipLevel = destination->mipLevel;
             copy->destination.arrayLayer = destination->arrayLayer;
-            if (source->rowPitch == 0) {
-                copy->source.rowPitch =
-                    ComputeDefaultRowPitch(destination->texture->GetFormat(), copySize->width);
+            if (fixedSource.bytesPerRow == 0) {
+                copy->source.bytesPerRow =
+                    ComputeDefaultBytesPerRow(destination->texture->GetFormat(), copySize->width);
             } else {
-                copy->source.rowPitch = source->rowPitch;
+                copy->source.bytesPerRow = fixedSource.bytesPerRow;
             }
-            if (source->imageHeight == 0) {
-                copy->source.imageHeight = copySize->height;
+            if (fixedSource.rowsPerImage == 0) {
+                copy->source.rowsPerImage = copySize->height;
             } else {
-                copy->source.imageHeight = source->imageHeight;
+                copy->source.rowsPerImage = fixedSource.rowsPerImage;
             }
 
             if (GetDevice()->IsValidationEnabled()) {
-                mTopLevelBuffers.insert(source->buffer);
+                mTopLevelBuffers.insert(fixedSource.buffer);
                 mTopLevelTextures.insert(destination->texture);
             }
             return {};
@@ -665,8 +703,12 @@
                                              const BufferCopyView* destination,
                                              const Extent3D* copySize) {
         mEncodingContext.TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError {
+            // TODO(dawn:22): Remove this once users bytesPerRow/rowsPerImage
+            BufferCopyView fixedDestination;
+            DAWN_TRY_ASSIGN(fixedDestination, FixBufferCopyView(GetDevice(), destination));
+
             DAWN_TRY(GetDevice()->ValidateObject(source->texture));
-            DAWN_TRY(GetDevice()->ValidateObject(destination->buffer));
+            DAWN_TRY(GetDevice()->ValidateObject(fixedDestination.buffer));
 
             CopyTextureToBufferCmd* copy =
                 allocator->Allocate<CopyTextureToBufferCmd>(Command::CopyTextureToBuffer);
@@ -675,23 +717,23 @@
             copy->copySize = *copySize;
             copy->source.mipLevel = source->mipLevel;
             copy->source.arrayLayer = source->arrayLayer;
-            copy->destination.buffer = destination->buffer;
-            copy->destination.offset = destination->offset;
-            if (destination->rowPitch == 0) {
-                copy->destination.rowPitch =
-                    ComputeDefaultRowPitch(source->texture->GetFormat(), copySize->width);
+            copy->destination.buffer = fixedDestination.buffer;
+            copy->destination.offset = fixedDestination.offset;
+            if (fixedDestination.bytesPerRow == 0) {
+                copy->destination.bytesPerRow =
+                    ComputeDefaultBytesPerRow(source->texture->GetFormat(), copySize->width);
             } else {
-                copy->destination.rowPitch = destination->rowPitch;
+                copy->destination.bytesPerRow = fixedDestination.bytesPerRow;
             }
-            if (destination->imageHeight == 0) {
-                copy->destination.imageHeight = copySize->height;
+            if (fixedDestination.rowsPerImage == 0) {
+                copy->destination.rowsPerImage = copySize->height;
             } else {
-                copy->destination.imageHeight = destination->imageHeight;
+                copy->destination.rowsPerImage = fixedDestination.rowsPerImage;
             }
 
             if (GetDevice()->IsValidationEnabled()) {
                 mTopLevelTextures.insert(source->texture);
-                mTopLevelBuffers.insert(destination->buffer);
+                mTopLevelBuffers.insert(fixedDestination.buffer);
             }
             return {};
         });
@@ -825,20 +867,21 @@
                     DAWN_TRY(
                         ValidateTextureSampleCountInCopyCommands(copy->destination.texture.Get()));
 
-                    DAWN_TRY(ValidateImageHeight(copy->destination.texture->GetFormat(),
-                                                 copy->source.imageHeight, copy->copySize.height));
+                    DAWN_TRY(ValidateRowsPerImage(copy->destination.texture->GetFormat(),
+                                                  copy->source.rowsPerImage,
+                                                  copy->copySize.height));
                     DAWN_TRY(ValidateImageOrigin(copy->destination.texture->GetFormat(),
                                                  copy->destination.origin));
                     DAWN_TRY(ValidateImageCopySize(copy->destination.texture->GetFormat(),
                                                    copy->copySize));
 
                     uint32_t bufferCopySize = 0;
-                    DAWN_TRY(ValidateRowPitch(copy->destination.texture->GetFormat(),
-                                              copy->copySize, copy->source.rowPitch));
+                    DAWN_TRY(ValidateBytesPerRow(copy->destination.texture->GetFormat(),
+                                                 copy->copySize, copy->source.bytesPerRow));
 
                     DAWN_TRY(ComputeTextureCopyBufferSize(
                         copy->destination.texture->GetFormat(), copy->copySize,
-                        copy->source.rowPitch, copy->source.imageHeight, &bufferCopySize));
+                        copy->source.bytesPerRow, copy->source.rowsPerImage, &bufferCopySize));
 
                     DAWN_TRY(ValidateCopySizeFitsInTexture(copy->destination, copy->copySize));
                     DAWN_TRY(ValidateCopySizeFitsInBuffer(copy->source, bufferCopySize));
@@ -858,20 +901,20 @@
 
                     DAWN_TRY(ValidateTextureSampleCountInCopyCommands(copy->source.texture.Get()));
 
-                    DAWN_TRY(ValidateImageHeight(copy->source.texture->GetFormat(),
-                                                 copy->destination.imageHeight,
-                                                 copy->copySize.height));
+                    DAWN_TRY(ValidateRowsPerImage(copy->source.texture->GetFormat(),
+                                                  copy->destination.rowsPerImage,
+                                                  copy->copySize.height));
                     DAWN_TRY(ValidateImageOrigin(copy->source.texture->GetFormat(),
                                                  copy->source.origin));
                     DAWN_TRY(
                         ValidateImageCopySize(copy->source.texture->GetFormat(), copy->copySize));
 
                     uint32_t bufferCopySize = 0;
-                    DAWN_TRY(ValidateRowPitch(copy->source.texture->GetFormat(), copy->copySize,
-                                              copy->destination.rowPitch));
+                    DAWN_TRY(ValidateBytesPerRow(copy->source.texture->GetFormat(), copy->copySize,
+                                                 copy->destination.bytesPerRow));
                     DAWN_TRY(ComputeTextureCopyBufferSize(
                         copy->source.texture->GetFormat(), copy->copySize,
-                        copy->destination.rowPitch, copy->destination.imageHeight,
+                        copy->destination.bytesPerRow, copy->destination.rowsPerImage,
                         &bufferCopySize));
 
                     DAWN_TRY(ValidateCopySizeFitsInTexture(copy->source, copy->copySize));
diff --git a/src/dawn_native/Commands.h b/src/dawn_native/Commands.h
index 8113b5d..6ccd2f3 100644
--- a/src/dawn_native/Commands.h
+++ b/src/dawn_native/Commands.h
@@ -93,9 +93,9 @@
 
     struct BufferCopy {
         Ref<BufferBase> buffer;
-        uint64_t offset;       // Bytes
-        uint32_t rowPitch;     // Bytes
-        uint32_t imageHeight;  // Texels
+        uint64_t offset;
+        uint32_t bytesPerRow;
+        uint32_t rowsPerImage;
     };
 
     struct TextureCopy {
diff --git a/src/dawn_native/d3d12/CommandBufferD3D12.cpp b/src/dawn_native/d3d12/CommandBufferD3D12.cpp
index e195c03..cea9516 100644
--- a/src/dawn_native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn_native/d3d12/CommandBufferD3D12.cpp
@@ -564,7 +564,7 @@
 
                     auto copySplit = ComputeTextureCopySplit(
                         copy->destination.origin, copy->copySize, texture->GetFormat(),
-                        copy->source.offset, copy->source.rowPitch, copy->source.imageHeight);
+                        copy->source.offset, copy->source.bytesPerRow, copy->source.rowsPerImage);
 
                     D3D12_TEXTURE_COPY_LOCATION textureLocation =
                         ComputeTextureCopyLocationForTexture(texture, copy->destination.mipLevel,
@@ -576,7 +576,7 @@
                         D3D12_TEXTURE_COPY_LOCATION bufferLocation =
                             ComputeBufferLocationForCopyTextureRegion(
                                 texture, buffer->GetD3D12Resource().Get(), info.bufferSize,
-                                copySplit.offset, copy->source.rowPitch);
+                                copySplit.offset, copy->source.bytesPerRow);
                         D3D12_BOX sourceRegion =
                             ComputeD3D12BoxFromOffsetAndSize(info.bufferOffset, info.copySize);
 
@@ -601,8 +601,8 @@
 
                     TextureCopySplit copySplit = ComputeTextureCopySplit(
                         copy->source.origin, copy->copySize, texture->GetFormat(),
-                        copy->destination.offset, copy->destination.rowPitch,
-                        copy->destination.imageHeight);
+                        copy->destination.offset, copy->destination.bytesPerRow,
+                        copy->destination.rowsPerImage);
 
                     D3D12_TEXTURE_COPY_LOCATION textureLocation =
                         ComputeTextureCopyLocationForTexture(texture, copy->source.mipLevel,
@@ -614,7 +614,7 @@
                         D3D12_TEXTURE_COPY_LOCATION bufferLocation =
                             ComputeBufferLocationForCopyTextureRegion(
                                 texture, buffer->GetD3D12Resource().Get(), info.bufferSize,
-                                copySplit.offset, copy->destination.rowPitch);
+                                copySplit.offset, copy->destination.bytesPerRow);
 
                         D3D12_BOX sourceRegion =
                             ComputeD3D12BoxFromOffsetAndSize(info.textureOffset, info.copySize);
diff --git a/src/dawn_native/d3d12/TextureCopySplitter.cpp b/src/dawn_native/d3d12/TextureCopySplitter.cpp
index c206fe2..cfa1d1e 100644
--- a/src/dawn_native/d3d12/TextureCopySplitter.cpp
+++ b/src/dawn_native/d3d12/TextureCopySplitter.cpp
@@ -23,15 +23,15 @@
     namespace {
         Origin3D ComputeTexelOffsets(const Format& format,
                                      uint32_t offset,
-                                     uint32_t rowPitch,
+                                     uint32_t bytesPerRow,
                                      uint32_t slicePitch) {
-            uint32_t byteOffsetX = offset % rowPitch;
+            uint32_t byteOffsetX = offset % bytesPerRow;
             offset -= byteOffsetX;
             uint32_t byteOffsetY = offset % slicePitch;
             uint32_t byteOffsetZ = offset - byteOffsetY;
 
             return {byteOffsetX / format.blockByteSize * format.blockWidth,
-                    byteOffsetY / rowPitch * format.blockHeight, byteOffsetZ / slicePitch};
+                    byteOffsetY / bytesPerRow * format.blockHeight, byteOffsetZ / slicePitch};
         }
     }  // namespace
 
@@ -39,11 +39,11 @@
                                              Extent3D copySize,
                                              const Format& format,
                                              uint64_t offset,
-                                             uint32_t rowPitch,
-                                             uint32_t imageHeight) {
+                                             uint32_t bytesPerRow,
+                                             uint32_t rowsPerImage) {
         TextureCopySplit copy;
 
-        ASSERT(rowPitch % format.blockByteSize == 0);
+        ASSERT(bytesPerRow % format.blockByteSize == 0);
 
         uint64_t alignedOffset =
             offset & ~static_cast<uint64_t>(D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT - 1);
@@ -69,16 +69,16 @@
         ASSERT(alignedOffset < offset);
         ASSERT(offset - alignedOffset < D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);
 
-        uint32_t slicePitch = rowPitch * (imageHeight / format.blockHeight);
+        uint32_t slicePitch = bytesPerRow * (rowsPerImage / format.blockHeight);
         Origin3D texelOffset = ComputeTexelOffsets(
-            format, static_cast<uint32_t>(offset - alignedOffset), rowPitch, slicePitch);
+            format, static_cast<uint32_t>(offset - alignedOffset), bytesPerRow, slicePitch);
 
         uint32_t copyBytesPerRowPitch = copySize.width / format.blockWidth * format.blockByteSize;
         uint32_t byteOffsetInRowPitch = texelOffset.x / format.blockWidth * format.blockByteSize;
-        if (copyBytesPerRowPitch + byteOffsetInRowPitch <= rowPitch) {
-            // The region's rows fit inside the row pitch. In this case, extend the width of the
+        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
-            //  |<--------------- row pitch --------------->|
+            //  |<------------- bytes per row ------------->|
             //
             //  |-------------------------------------------|
             //  |                                           |
@@ -107,14 +107,14 @@
 
             copy.copies[0].bufferOffset = texelOffset;
             copy.copies[0].bufferSize.width = copySize.width + texelOffset.x;
-            copy.copies[0].bufferSize.height = imageHeight + texelOffset.y;
+            copy.copies[0].bufferSize.height = rowsPerImage + texelOffset.y;
             copy.copies[0].bufferSize.depth = copySize.depth + texelOffset.z;
 
             return copy;
         }
 
-        // The region's rows straddle the row pitch. Split the copy into two copies
-        //  |<--------------- row pitch --------------->|
+        // The region's rows straddle the bytes per row. Split the copy into two copies
+        //  |<------------- bytes per row ------------->|
         //
         //  |-------------------------------------------|
         //  |                                           |
@@ -151,15 +151,15 @@
 
         copy.copies[0].textureOffset = origin;
 
-        ASSERT(rowPitch > byteOffsetInRowPitch);
-        uint32_t texelsPerRow = rowPitch / format.blockByteSize * format.blockWidth;
+        ASSERT(bytesPerRow > byteOffsetInRowPitch);
+        uint32_t texelsPerRow = bytesPerRow / format.blockByteSize * format.blockWidth;
         copy.copies[0].copySize.width = texelsPerRow - texelOffset.x;
         copy.copies[0].copySize.height = copySize.height;
         copy.copies[0].copySize.depth = copySize.depth;
 
         copy.copies[0].bufferOffset = texelOffset;
         copy.copies[0].bufferSize.width = texelsPerRow;
-        copy.copies[0].bufferSize.height = imageHeight + texelOffset.y;
+        copy.copies[0].bufferSize.height = rowsPerImage + texelOffset.y;
         copy.copies[0].bufferSize.depth = copySize.depth + texelOffset.z;
 
         copy.copies[1].textureOffset.x = origin.x + copy.copies[0].copySize.width;
@@ -175,7 +175,7 @@
         copy.copies[1].bufferOffset.y = texelOffset.y + format.blockHeight;
         copy.copies[1].bufferOffset.z = texelOffset.z;
         copy.copies[1].bufferSize.width = copy.copies[1].copySize.width;
-        copy.copies[1].bufferSize.height = imageHeight + texelOffset.y + format.blockHeight;
+        copy.copies[1].bufferSize.height = rowsPerImage + texelOffset.y + format.blockHeight;
         copy.copies[1].bufferSize.depth = copySize.depth + texelOffset.z;
 
         return copy;
diff --git a/src/dawn_native/d3d12/TextureCopySplitter.h b/src/dawn_native/d3d12/TextureCopySplitter.h
index 0e06ebd..cd7037b 100644
--- a/src/dawn_native/d3d12/TextureCopySplitter.h
+++ b/src/dawn_native/d3d12/TextureCopySplitter.h
@@ -47,8 +47,8 @@
                                              Extent3D copySize,
                                              const Format& format,
                                              uint64_t offset,
-                                             uint32_t rowPitch,
-                                             uint32_t imageHeight);
+                                             uint32_t bytesPerRow,
+                                             uint32_t rowsPerImage);
 }}  // namespace dawn_native::d3d12
 
 #endif  // DAWNNATIVE_D3D12_TEXTURECOPYSPLITTER_H_
diff --git a/src/dawn_native/d3d12/TextureD3D12.cpp b/src/dawn_native/d3d12/TextureD3D12.cpp
index a6043e7..56aed13 100644
--- a/src/dawn_native/d3d12/TextureD3D12.cpp
+++ b/src/dawn_native/d3d12/TextureD3D12.cpp
@@ -691,10 +691,10 @@
         } else {
             // TODO(natlee@microsoft.com): test compressed textures are cleared
             // create temp buffer with clear color to copy to the texture image
-            uint32_t rowPitch =
+            uint32_t bytesPerRow =
                 Align((GetSize().width / GetFormat().blockWidth) * GetFormat().blockByteSize,
-                      kTextureRowPitchAlignment);
-            uint64_t bufferSize64 = rowPitch * (GetSize().height / GetFormat().blockHeight);
+                      kTextureBytesPerRowAlignment);
+            uint64_t bufferSize64 = bytesPerRow * (GetSize().height / GetFormat().blockHeight);
             if (bufferSize64 > std::numeric_limits<uint32_t>::max()) {
                 return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate buffer.");
             }
@@ -711,7 +711,7 @@
                 // compute d3d12 texture copy locations for texture and buffer
                 Extent3D copySize = GetMipLevelVirtualSize(level);
                 TextureCopySplit copySplit = ComputeTextureCopySplit(
-                    {0, 0, 0}, copySize, GetFormat(), uploadHandle.startOffset, rowPitch, 0);
+                    {0, 0, 0}, copySize, GetFormat(), uploadHandle.startOffset, bytesPerRow, 0);
 
                 for (uint32_t layer = baseArrayLayer; layer < baseArrayLayer + layerCount;
                      ++layer) {
@@ -729,7 +729,7 @@
                         D3D12_TEXTURE_COPY_LOCATION bufferLocation =
                             ComputeBufferLocationForCopyTextureRegion(
                                 this, ToBackend(uploadHandle.stagingBuffer)->GetResource(),
-                                info.bufferSize, copySplit.offset, rowPitch);
+                                info.bufferSize, copySplit.offset, bytesPerRow);
                         D3D12_BOX sourceRegion =
                             ComputeD3D12BoxFromOffsetAndSize(info.bufferOffset, info.copySize);
 
diff --git a/src/dawn_native/metal/CommandBufferMTL.mm b/src/dawn_native/metal/CommandBufferMTL.mm
index 6fc8c92..e032692 100644
--- a/src/dawn_native/metal/CommandBufferMTL.mm
+++ b/src/dawn_native/metal/CommandBufferMTL.mm
@@ -335,14 +335,14 @@
                                                              Extent3D virtualSizeAtLevel,
                                                              uint64_t bufferSize,
                                                              uint64_t bufferOffset,
-                                                             uint32_t rowPitch,
-                                                             uint32_t imageHeight) {
+                                                             uint32_t bytesPerRow,
+                                                             uint32_t rowsPerImage) {
             TextureBufferCopySplit copy;
 
             // When copying textures from/to an unpacked buffer, the Metal validation layer doesn't
             // compute the correct range when checking if the buffer is big enough to contain the
             // data for the whole copy. Instead of looking at the position of the last texel in the
-            // buffer, it computes the volume of the 3D box with rowPitch * (imageHeight /
+            // buffer, it computes the volume of the 3D box with bytesPerRow * (rowsPerImage /
             // format.blockHeight) * copySize.depth. For example considering the pixel buffer below
             // where in memory, each row data (D) of the texture is followed by some padding data
             // (P):
@@ -356,8 +356,8 @@
 
             // We work around this limitation by detecting when Metal would complain and copy the
             // last image and row separately using tight sourceBytesPerRow or sourceBytesPerImage.
-            uint32_t rowPitchCountPerImage = imageHeight / textureFormat.blockHeight;
-            uint32_t bytesPerImage = rowPitch * rowPitchCountPerImage;
+            uint32_t dataRowsPerImage = rowsPerImage / textureFormat.blockHeight;
+            uint32_t bytesPerImage = bytesPerRow * dataRowsPerImage;
 
             // Metal validation layer requires that if the texture's pixel format is a compressed
             // format, the sourceSize must be a multiple of the pixel format's block size or be
@@ -377,7 +377,7 @@
             if (!needWorkaround) {
                 copy.count = 1;
                 copy.copies[0].bufferOffset = bufferOffset;
-                copy.copies[0].bytesPerRow = rowPitch;
+                copy.copies[0].bytesPerRow = bytesPerRow;
                 copy.copies[0].bytesPerImage = bytesPerImage;
                 copy.copies[0].textureOrigin = MakeMTLOrigin(origin);
                 copy.copies[0].copyExtent =
@@ -390,7 +390,7 @@
             // Doing all the copy except the last image.
             if (copyExtent.depth > 1) {
                 copy.copies[copy.count].bufferOffset = currentOffset;
-                copy.copies[copy.count].bytesPerRow = rowPitch;
+                copy.copies[copy.count].bytesPerRow = bytesPerRow;
                 copy.copies[copy.count].bytesPerImage = bytesPerImage;
                 copy.copies[copy.count].textureOrigin = MakeMTLOrigin(origin);
                 copy.copies[copy.count].copyExtent = MTLSizeMake(
@@ -406,8 +406,8 @@
             uint32_t copyBlockRowCount = copyExtent.height / textureFormat.blockHeight;
             if (copyBlockRowCount > 1) {
                 copy.copies[copy.count].bufferOffset = currentOffset;
-                copy.copies[copy.count].bytesPerRow = rowPitch;
-                copy.copies[copy.count].bytesPerImage = rowPitch * (copyBlockRowCount - 1);
+                copy.copies[copy.count].bytesPerRow = bytesPerRow;
+                copy.copies[copy.count].bytesPerImage = bytesPerRow * (copyBlockRowCount - 1);
                 copy.copies[copy.count].textureOrigin =
                     MTLOriginMake(origin.x, origin.y, origin.z + copyExtent.depth - 1);
 
@@ -418,7 +418,7 @@
                 ++copy.count;
 
                 // Update offset to copy to the last row.
-                currentOffset += (copyBlockRowCount - 1) * rowPitch;
+                currentOffset += (copyBlockRowCount - 1) * bytesPerRow;
             }
 
             // Doing the last row copy with the exact number of bytes in last row.
@@ -752,7 +752,7 @@
                     Extent3D virtualSizeAtLevel = texture->GetMipLevelVirtualSize(dst.mipLevel);
                     TextureBufferCopySplit splittedCopies = ComputeTextureBufferCopySplit(
                         dst.origin, copySize, texture->GetFormat(), virtualSizeAtLevel,
-                        buffer->GetSize(), src.offset, src.rowPitch, src.imageHeight);
+                        buffer->GetSize(), src.offset, src.bytesPerRow, src.rowsPerImage);
 
                     for (uint32_t i = 0; i < splittedCopies.count; ++i) {
                         const TextureBufferCopySplit::CopyInfo& copyInfo = splittedCopies.copies[i];
@@ -782,7 +782,7 @@
                     Extent3D virtualSizeAtLevel = texture->GetMipLevelVirtualSize(src.mipLevel);
                     TextureBufferCopySplit splittedCopies = ComputeTextureBufferCopySplit(
                         src.origin, copySize, texture->GetFormat(), virtualSizeAtLevel,
-                        buffer->GetSize(), dst.offset, dst.rowPitch, dst.imageHeight);
+                        buffer->GetSize(), dst.offset, dst.bytesPerRow, dst.rowsPerImage);
 
                     for (uint32_t i = 0; i < splittedCopies.count; ++i) {
                         const TextureBufferCopySplit::CopyInfo& copyInfo = splittedCopies.copies[i];
diff --git a/src/dawn_native/opengl/CommandBufferGL.cpp b/src/dawn_native/opengl/CommandBufferGL.cpp
index e6ff9f9..a658c6d 100644
--- a/src/dawn_native/opengl/CommandBufferGL.cpp
+++ b/src/dawn_native/opengl/CommandBufferGL.cpp
@@ -490,9 +490,10 @@
                     gl.BindTexture(target, texture->GetHandle());
 
                     const Format& formatInfo = texture->GetFormat();
-                    gl.PixelStorei(GL_UNPACK_ROW_LENGTH,
-                                   src.rowPitch / formatInfo.blockByteSize * formatInfo.blockWidth);
-                    gl.PixelStorei(GL_UNPACK_IMAGE_HEIGHT, src.imageHeight);
+                    gl.PixelStorei(
+                        GL_UNPACK_ROW_LENGTH,
+                        src.bytesPerRow / formatInfo.blockByteSize * formatInfo.blockWidth);
+                    gl.PixelStorei(GL_UNPACK_IMAGE_HEIGHT, src.rowsPerImage);
 
                     if (formatInfo.isCompressed) {
                         gl.PixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, formatInfo.blockByteSize);
@@ -592,8 +593,8 @@
 
                     gl.BindBuffer(GL_PIXEL_PACK_BUFFER, buffer->GetHandle());
                     gl.PixelStorei(GL_PACK_ROW_LENGTH,
-                                   dst.rowPitch / texture->GetFormat().blockByteSize);
-                    gl.PixelStorei(GL_PACK_IMAGE_HEIGHT, dst.imageHeight);
+                                   dst.bytesPerRow / texture->GetFormat().blockByteSize);
+                    gl.PixelStorei(GL_PACK_IMAGE_HEIGHT, dst.rowsPerImage);
                     ASSERT(copySize.depth == 1 && src.origin.z == 0);
                     void* offset = reinterpret_cast<void*>(static_cast<uintptr_t>(dst.offset));
                     gl.ReadPixels(src.origin.x, src.origin.y, copySize.width, copySize.height,
diff --git a/src/dawn_native/opengl/TextureGL.cpp b/src/dawn_native/opengl/TextureGL.cpp
index 30bb0d5..9f2c163 100644
--- a/src/dawn_native/opengl/TextureGL.cpp
+++ b/src/dawn_native/opengl/TextureGL.cpp
@@ -286,17 +286,17 @@
         } else {
             // TODO(natlee@microsoft.com): test compressed textures are cleared
             // create temp buffer with clear color to copy to the texture image
-            ASSERT(kTextureRowPitchAlignment % GetFormat().blockByteSize == 0);
-            uint32_t rowPitch =
+            ASSERT(kTextureBytesPerRowAlignment % GetFormat().blockByteSize == 0);
+            uint32_t bytesPerRow =
                 Align((GetSize().width / GetFormat().blockWidth) * GetFormat().blockByteSize,
-                      kTextureRowPitchAlignment);
+                      kTextureBytesPerRowAlignment);
 
             // Make sure that we are not rounding
-            ASSERT(rowPitch % GetFormat().blockByteSize == 0);
+            ASSERT(bytesPerRow % GetFormat().blockByteSize == 0);
             ASSERT(GetSize().height % GetFormat().blockHeight == 0);
 
             dawn_native::BufferDescriptor descriptor;
-            descriptor.size = rowPitch * (GetSize().height / GetFormat().blockHeight);
+            descriptor.size = bytesPerRow * (GetSize().height / GetFormat().blockHeight);
             if (descriptor.size > std::numeric_limits<uint32_t>::max()) {
                 return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate buffer.");
             }
@@ -317,7 +317,7 @@
 
             // Bind buffer and texture, and make the buffer to texture copy
             gl.PixelStorei(GL_UNPACK_ROW_LENGTH,
-                           (rowPitch / GetFormat().blockByteSize) * GetFormat().blockWidth);
+                           (bytesPerRow / GetFormat().blockByteSize) * GetFormat().blockWidth);
             gl.PixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
             for (GLint level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
                 gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, srcBuffer->GetHandle());
diff --git a/src/dawn_native/vulkan/CommandBufferVk.cpp b/src/dawn_native/vulkan/CommandBufferVk.cpp
index 3542ee9..5ab1b8f 100644
--- a/src/dawn_native/vulkan/CommandBufferVk.cpp
+++ b/src/dawn_native/vulkan/CommandBufferVk.cpp
@@ -329,9 +329,9 @@
 
         BufferCopy tempBufferCopy;
         tempBufferCopy.buffer = tempBuffer.Get();
-        tempBufferCopy.imageHeight = copySize.height;
+        tempBufferCopy.rowsPerImage = copySize.height;
         tempBufferCopy.offset = 0;
-        tempBufferCopy.rowPitch = copySize.width / format.blockWidth * format.blockByteSize;
+        tempBufferCopy.bytesPerRow = copySize.width / format.blockWidth * format.blockByteSize;
 
         VkCommandBuffer commands = recordingContext->commandBuffer;
         VkImage srcImage = ToBackend(srcCopy.texture)->GetHandle();
diff --git a/src/dawn_native/vulkan/TextureVk.cpp b/src/dawn_native/vulkan/TextureVk.cpp
index 0c85fa9..35ade8b 100644
--- a/src/dawn_native/vulkan/TextureVk.cpp
+++ b/src/dawn_native/vulkan/TextureVk.cpp
@@ -721,10 +721,10 @@
         } else {
             // TODO(natlee@microsoft.com): test compressed textures are cleared
             // create temp buffer with clear color to copy to the texture image
-            uint32_t rowPitch =
+            uint32_t bytesPerRow =
                 Align((GetSize().width / GetFormat().blockWidth) * GetFormat().blockByteSize,
-                      kTextureRowPitchAlignment);
-            uint64_t bufferSize64 = rowPitch * (GetSize().height / GetFormat().blockHeight);
+                      kTextureBytesPerRowAlignment);
+            uint64_t bufferSize64 = bytesPerRow * (GetSize().height / GetFormat().blockHeight);
             if (bufferSize64 > std::numeric_limits<uint32_t>::max()) {
                 return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate buffer.");
             }
@@ -737,9 +737,9 @@
 
             // compute the buffer image copy to set the clear region of entire texture
             dawn_native::BufferCopy bufferCopy;
-            bufferCopy.imageHeight = 0;
+            bufferCopy.rowsPerImage = 0;
             bufferCopy.offset = uploadHandle.startOffset;
-            bufferCopy.rowPitch = rowPitch;
+            bufferCopy.bytesPerRow = bytesPerRow;
 
             for (uint32_t level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
                 Extent3D copySize = GetMipLevelVirtualSize(level);
diff --git a/src/dawn_native/vulkan/UtilsVulkan.cpp b/src/dawn_native/vulkan/UtilsVulkan.cpp
index 173bacc..91b45ca 100644
--- a/src/dawn_native/vulkan/UtilsVulkan.cpp
+++ b/src/dawn_native/vulkan/UtilsVulkan.cpp
@@ -75,9 +75,9 @@
         region.bufferOffset = bufferCopy.offset;
         // In Vulkan the row length is in texels while it is in bytes for Dawn
         const Format& format = texture->GetFormat();
-        ASSERT(bufferCopy.rowPitch % format.blockByteSize == 0);
-        region.bufferRowLength = bufferCopy.rowPitch / format.blockByteSize * format.blockWidth;
-        region.bufferImageHeight = bufferCopy.imageHeight;
+        ASSERT(bufferCopy.bytesPerRow % format.blockByteSize == 0);
+        region.bufferRowLength = bufferCopy.bytesPerRow / format.blockByteSize * format.blockWidth;
+        region.bufferImageHeight = bufferCopy.rowsPerImage;
 
         region.imageSubresource.aspectMask = texture->GetVkAspectMask();
         region.imageSubresource.mipLevel = textureCopy.mipLevel;
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index 0ca89ff..bffa776 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -796,7 +796,7 @@
     deferred.readbackOffset = readback.offset;
     deferred.size = size;
     deferred.rowBytes = size;
-    deferred.rowPitch = size;
+    deferred.bytesPerRow = size;
     deferred.expectation.reset(expectation);
 
     mDeferredExpectations.push_back(std::move(deferred));
@@ -815,8 +815,8 @@
                                                         uint32_t slice,
                                                         uint32_t pixelSize,
                                                         detail::Expectation* expectation) {
-    uint32_t rowPitch = Align(width * pixelSize, kTextureRowPitchAlignment);
-    uint32_t size = rowPitch * (height - 1) + width * pixelSize;
+    uint32_t bytesPerRow = Align(width * pixelSize, kTextureBytesPerRowAlignment);
+    uint32_t size = bytesPerRow * (height - 1) + width * pixelSize;
 
     auto readback = ReserveReadback(size);
 
@@ -825,7 +825,7 @@
     wgpu::TextureCopyView textureCopyView =
         utils::CreateTextureCopyView(texture, level, slice, {x, y, 0});
     wgpu::BufferCopyView bufferCopyView =
-        utils::CreateBufferCopyView(readback.buffer, readback.offset, rowPitch, 0);
+        utils::CreateBufferCopyView(readback.buffer, readback.offset, bytesPerRow, 0);
     wgpu::Extent3D copySize = {width, height, 1};
 
     wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
@@ -841,7 +841,7 @@
     deferred.readbackOffset = readback.offset;
     deferred.size = size;
     deferred.rowBytes = width * pixelSize;
-    deferred.rowPitch = rowPitch;
+    deferred.bytesPerRow = bytesPerRow;
     deferred.expectation.reset(expectation);
 
     mDeferredExpectations.push_back(std::move(deferred));
@@ -929,15 +929,16 @@
 
         uint32_t size;
         std::vector<char> packedData;
-        if (expectation.rowBytes != expectation.rowPitch) {
-            DAWN_ASSERT(expectation.rowPitch > expectation.rowBytes);
+        if (expectation.rowBytes != expectation.bytesPerRow) {
+            DAWN_ASSERT(expectation.bytesPerRow > expectation.rowBytes);
             uint32_t rowCount =
-                (expectation.size + expectation.rowPitch - 1) / expectation.rowPitch;
+                (expectation.size + expectation.bytesPerRow - 1) / expectation.bytesPerRow;
             uint32_t packedSize = rowCount * expectation.rowBytes;
             packedData.resize(packedSize);
             for (uint32_t r = 0; r < rowCount; ++r) {
                 for (uint32_t i = 0; i < expectation.rowBytes; ++i) {
-                    packedData[i + r * expectation.rowBytes] = data[i + r * expectation.rowPitch];
+                    packedData[i + r * expectation.rowBytes] =
+                        data[i + r * expectation.bytesPerRow];
                 }
             }
             data = packedData.data();
diff --git a/src/tests/DawnTest.h b/src/tests/DawnTest.h
index 3dc13a7..20ca258 100644
--- a/src/tests/DawnTest.h
+++ b/src/tests/DawnTest.h
@@ -302,7 +302,7 @@
         uint64_t readbackOffset;
         uint64_t size;
         uint32_t rowBytes;
-        uint32_t rowPitch;
+        uint32_t bytesPerRow;
         std::unique_ptr<detail::Expectation> expectation;
         // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316
         // Use unique_ptr because of missing move/copy constructors on std::basic_ostringstream
diff --git a/src/tests/end2end/ComparisonSamplerTests.cpp b/src/tests/end2end/ComparisonSamplerTests.cpp
index 5bcc984..98fbc90 100644
--- a/src/tests/end2end/ComparisonSamplerTests.cpp
+++ b/src/tests/end2end/ComparisonSamplerTests.cpp
@@ -158,7 +158,7 @@
                 wgpu::BufferCopyView bufferCopyView = {
                     .buffer = mTextureUploadBuffer,
                     .offset = 0,
-                    .rowPitch = kTextureRowPitchAlignment,
+                    .rowPitch = kTextureBytesPerRowAlignment,
                     .imageHeight = 1,
                 };
                 wgpu::TextureCopyView textureCopyView = {
diff --git a/src/tests/end2end/CompressedTextureFormatTests.cpp b/src/tests/end2end/CompressedTextureFormatTests.cpp
index 85208fe..41ea507 100644
--- a/src/tests/end2end/CompressedTextureFormatTests.cpp
+++ b/src/tests/end2end/CompressedTextureFormatTests.cpp
@@ -28,8 +28,8 @@
     uint32_t viewMipmapLevel = 0;
     uint32_t viewArrayLayer = 0;
     uint32_t bufferOffset = 0;
-    uint32_t rowPitchAlignment = kTextureRowPitchAlignment;
-    uint32_t imageHeight = 0;
+    uint32_t bytesPerRowAlignment = kTextureBytesPerRowAlignment;
+    uint32_t rowsPerImage = 0;
 };
 
 class CompressedTextureBCFormatTest : public DawnTest {
@@ -52,7 +52,7 @@
                                            const CopyConfig& copyConfig) {
         ASSERT(IsBCFormatSupported());
 
-        // Compute the upload buffer size with rowPitchAlignment and the copy region.
+        // Compute the upload buffer size with bytesPerRowAlignment and the copy region.
         const wgpu::Extent3D textureSize = copyConfig.textureDescriptor.size;
         uint32_t actualWidthAtLevel = textureSize.width >> copyConfig.viewMipmapLevel;
         uint32_t actualHeightAtLevel = textureSize.height >> copyConfig.viewMipmapLevel;
@@ -61,8 +61,8 @@
         uint32_t copyHeightInBlockAtLevel =
             (actualHeightAtLevel + kBCBlockHeightInTexels - 1) / kBCBlockHeightInTexels;
         uint32_t bufferRowPitchInBytes = 0;
-        if (copyConfig.rowPitchAlignment != 0) {
-            bufferRowPitchInBytes = copyConfig.rowPitchAlignment;
+        if (copyConfig.bytesPerRowAlignment != 0) {
+            bufferRowPitchInBytes = copyConfig.bytesPerRowAlignment;
         } else {
             bufferRowPitchInBytes =
                 copyWidthInBlockAtLevel *
@@ -89,7 +89,7 @@
             device, uploadData.data(), uploadBufferSize, wgpu::BufferUsage::CopySrc);
         wgpu::BufferCopyView bufferCopyView =
             utils::CreateBufferCopyView(stagingBuffer, copyConfig.bufferOffset,
-                                        copyConfig.rowPitchAlignment, copyConfig.imageHeight);
+                                        copyConfig.bytesPerRowAlignment, copyConfig.rowsPerImage);
         wgpu::TextureCopyView textureCopyView =
             utils::CreateTextureCopyView(bcCompressedTexture, copyConfig.viewMipmapLevel,
                                          copyConfig.viewArrayLayer, copyConfig.copyOrigin3D);
@@ -488,7 +488,7 @@
     }
 }
 
-// Test using rowPitch == 0 in the copies with BC formats works correctly.
+// Test using bytesPerRow == 0 in the copies with BC formats works correctly.
 TEST_P(CompressedTextureBCFormatTest, CopyWithZeroRowPitch) {
     // TODO(jiawei.shao@intel.com): find out why this test is flaky on Windows Intel Vulkan
     // bots.
@@ -504,11 +504,11 @@
     config.textureDescriptor.size.height = 8;
     config.textureDescriptor.size.depth = 1;
 
-    config.rowPitchAlignment = 0;
+    config.bytesPerRowAlignment = 0;
 
     for (wgpu::TextureFormat format : kBCFormats) {
         config.textureDescriptor.format = format;
-        config.textureDescriptor.size.width = kTextureRowPitchAlignment /
+        config.textureDescriptor.size.width = kTextureBytesPerRowAlignment /
                                               CompressedFormatBlockSizeInBytes(format) *
                                               kBCBlockWidthInTexels;
         config.copyExtent3D = config.textureDescriptor.size;
@@ -870,7 +870,7 @@
         config.textureDescriptor.format = format;
 
         const uint32_t blockSizeInBytes = CompressedFormatBlockSizeInBytes(format);
-        const uint32_t blockCountPerRowPitch = config.rowPitchAlignment / blockSizeInBytes;
+        const uint32_t blockCountPerRowPitch = config.bytesPerRowAlignment / blockSizeInBytes;
 
         config.bufferOffset = (blockCountPerRowPitch - blockCountPerRow) * blockSizeInBytes;
 
@@ -879,7 +879,7 @@
 }
 
 // Test the special case of the B2T copies on the D3D12 backend that the buffer offset exceeds the
-// slice pitch (slicePitch = rowPitch * (imageHeightInTexels / blockHeightInTexels)). On D3D12
+// slice pitch (slicePitch = bytesPerRow * (rowsPerImage / blockHeightInTexels)). On D3D12
 // backend the texelOffset.y will be greater than 0 after calcuting the texelOffset in the function
 // ComputeTexelOffsets().
 TEST_P(CompressedTextureBCFormatTest, BufferOffsetExceedsSlicePitch) {
@@ -900,16 +900,16 @@
     const wgpu::Extent3D textureSizeLevel0 = config.textureDescriptor.size;
     const uint32_t blockCountPerRow = textureSizeLevel0.width / kBCBlockWidthInTexels;
     const uint32_t slicePitchInBytes =
-        config.rowPitchAlignment * (textureSizeLevel0.height / kBCBlockHeightInTexels);
+        config.bytesPerRowAlignment * (textureSizeLevel0.height / kBCBlockHeightInTexels);
 
     for (wgpu::TextureFormat format : kBCFormats) {
         config.textureDescriptor.format = format;
 
         const uint32_t blockSizeInBytes = CompressedFormatBlockSizeInBytes(format);
-        const uint32_t blockCountPerRowPitch = config.rowPitchAlignment / blockSizeInBytes;
+        const uint32_t blockCountPerRowPitch = config.bytesPerRowAlignment / blockSizeInBytes;
 
         config.bufferOffset = (blockCountPerRowPitch - blockCountPerRow) * blockSizeInBytes +
-                              config.rowPitchAlignment + slicePitchInBytes;
+                              config.bytesPerRowAlignment + slicePitchInBytes;
 
         TestCopyRegionIntoBCFormatTextures(config);
     }
@@ -940,7 +940,7 @@
         config.textureDescriptor.format = format;
 
         const uint32_t blockSizeInBytes = CompressedFormatBlockSizeInBytes(format);
-        const uint32_t blockCountPerRowPitch = config.rowPitchAlignment / blockSizeInBytes;
+        const uint32_t blockCountPerRowPitch = config.bytesPerRowAlignment / blockSizeInBytes;
         config.bufferOffset =
             (blockCountPerRowPitch - blockCountPerRow + kExceedRowBlockCount) * blockSizeInBytes;
 
@@ -949,7 +949,7 @@
 }
 
 // Test the special case of the B2T copies on the D3D12 backend that the slicePitch is equal to the
-// rowPitch. On D3D12 backend the texelOffset.z will be greater than 0 after calcuting the
+// bytesPerRow. On D3D12 backend the texelOffset.z will be greater than 0 after calcuting the
 // texelOffset in the function ComputeTexelOffsets().
 TEST_P(CompressedTextureBCFormatTest, RowPitchEqualToSlicePitch) {
     // TODO(jiawei.shao@intel.com): find out why this test is flaky on Windows Intel Vulkan
@@ -964,13 +964,13 @@
     config.copyExtent3D = config.textureDescriptor.size;
 
     const uint32_t blockCountPerRow = config.textureDescriptor.size.width / kBCBlockWidthInTexels;
-    const uint32_t slicePitchInBytes = config.rowPitchAlignment;
+    const uint32_t slicePitchInBytes = config.bytesPerRowAlignment;
 
     for (wgpu::TextureFormat format : kBCFormats) {
         config.textureDescriptor.format = format;
 
         const uint32_t blockSizeInBytes = CompressedFormatBlockSizeInBytes(format);
-        const uint32_t blockCountPerRowPitch = config.rowPitchAlignment / blockSizeInBytes;
+        const uint32_t blockCountPerRowPitch = config.bytesPerRowAlignment / blockSizeInBytes;
 
         config.bufferOffset =
             (blockCountPerRowPitch - blockCountPerRow) * blockSizeInBytes + slicePitchInBytes;
@@ -997,7 +997,7 @@
     config.textureDescriptor.size = {8, 8, 1};
     config.copyExtent3D = config.textureDescriptor.size;
 
-    config.imageHeight = config.textureDescriptor.size.height * 2;
+    config.rowsPerImage = config.textureDescriptor.size.height * 2;
 
     for (wgpu::TextureFormat format : kBCFormats) {
         config.textureDescriptor.format = format;
@@ -1040,7 +1040,7 @@
 
     config.copyExtent3D = {kCopyWidthAtLevel, kCopyHeightAtLevel, 1};
 
-    config.imageHeight = kCopyHeightAtLevel * 2;
+    config.rowsPerImage = kCopyHeightAtLevel * 2;
 
     for (wgpu::TextureFormat format : kBCFormats) {
         config.textureDescriptor.format = format;
diff --git a/src/tests/end2end/CopyTests.cpp b/src/tests/end2end/CopyTests.cpp
index 9513975..f00df82 100644
--- a/src/tests/end2end/CopyTests.cpp
+++ b/src/tests/end2end/CopyTests.cpp
@@ -37,7 +37,7 @@
         struct BufferSpec {
             uint64_t size;
             uint64_t offset;
-            uint32_t rowPitch;
+            uint32_t bytesPerRow;
         };
 
         static void FillTextureData(uint32_t width,
@@ -56,8 +56,8 @@
         }
 
         BufferSpec MinimumBufferSpec(uint32_t width, uint32_t height) {
-            uint32_t rowPitch = Align(width * kBytesPerTexel, kTextureRowPitchAlignment);
-            return { rowPitch * (height - 1) + width * kBytesPerTexel, 0, rowPitch };
+            uint32_t bytesPerRow = Align(width * kBytesPerTexel, kTextureBytesPerRowAlignment);
+            return {bytesPerRow * (height - 1) + width * kBytesPerTexel, 0, bytesPerRow};
         }
 
         static void PackTextureData(const RGBA8* srcData, uint32_t width, uint32_t height, uint32_t srcTexelsPerRow, RGBA8* dstData, uint32_t dstTexelsPerRow) {
@@ -90,8 +90,8 @@
 
             uint32_t width = textureSpec.width >> textureSpec.level;
             uint32_t height = textureSpec.height >> textureSpec.level;
-            uint32_t rowPitch = Align(kBytesPerTexel * width, kTextureRowPitchAlignment);
-            uint32_t texelsPerRow = rowPitch / kBytesPerTexel;
+            uint32_t bytesPerRow = Align(kBytesPerTexel * width, kTextureBytesPerRowAlignment);
+            uint32_t texelsPerRow = bytesPerRow / kBytesPerTexel;
             uint32_t texelCountPerLayer = texelsPerRow * (height - 1) + width;
 
             wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
@@ -99,7 +99,7 @@
             std::vector<std::vector<RGBA8>> textureArrayData(textureSpec.arraySize);
             for (uint32_t slice = 0; slice < textureSpec.arraySize; ++slice) {
                 textureArrayData[slice].resize(texelCountPerLayer);
-                FillTextureData(width, height, rowPitch / kBytesPerTexel, slice,
+                FillTextureData(width, height, bytesPerRow / kBytesPerTexel, slice,
                                 textureArrayData[slice].data());
 
                 // Create an upload buffer and use it to populate the current slice of the texture in `level` mip level
@@ -108,16 +108,17 @@
                     static_cast<uint32_t>(sizeof(RGBA8) * textureArrayData[slice].size()),
                     wgpu::BufferUsage::CopySrc);
                 wgpu::BufferCopyView bufferCopyView =
-                    utils::CreateBufferCopyView(uploadBuffer, 0, rowPitch, 0);
+                    utils::CreateBufferCopyView(uploadBuffer, 0, bytesPerRow, 0);
                 wgpu::TextureCopyView textureCopyView =
                     utils::CreateTextureCopyView(texture, textureSpec.level, slice, {0, 0, 0});
                 wgpu::Extent3D copySize = {width, height, 1};
                 encoder.CopyBufferToTexture(&bufferCopyView, &textureCopyView, &copySize);
             }
 
-            // Create a buffer of size `size * textureSpec.arrayLayer` and populate it with empty data (0,0,0,0)
-            // Note: Prepopulating the buffer with empty data ensures that there is not random data in the expectation
-            // and helps ensure that the padding due to the row pitch is not modified by the copy
+            // Create a buffer of size `size * textureSpec.arrayLayer` and populate it with empty
+            // data (0,0,0,0) Note: Prepopulating the buffer with empty data ensures that there is
+            // not random data in the expectation and helps ensure that the padding due to the bytes
+            // per row is not modified by the copy
             wgpu::BufferDescriptor bufDescriptor;
             bufDescriptor.size = bufferSpec.size * textureSpec.arraySize;
             bufDescriptor.usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst;
@@ -128,11 +129,12 @@
 
             uint64_t bufferOffset = bufferSpec.offset;
             for (uint32_t slice = 0; slice < textureSpec.arraySize; ++slice) {
-                // Copy the region [(`x`, `y`), (`x + copyWidth, `y + copyWidth`)] from the `level` mip into the buffer at `offset + bufferSpec.size * slice` and `rowPitch`
+                // Copy the region [(`x`, `y`), (`x + copyWidth, `y + copyWidth`)] from the `level`
+                // mip into the buffer at `offset + bufferSpec.size * slice` and `bytesPerRow`
                 wgpu::TextureCopyView textureCopyView = utils::CreateTextureCopyView(
                     texture, textureSpec.level, slice, {textureSpec.x, textureSpec.y, 0});
                 wgpu::BufferCopyView bufferCopyView =
-                    utils::CreateBufferCopyView(buffer, bufferOffset, bufferSpec.rowPitch, 0);
+                    utils::CreateBufferCopyView(buffer, bufferOffset, bufferSpec.bytesPerRow, 0);
                 wgpu::Extent3D copySize = {textureSpec.copyWidth, textureSpec.copyHeight, 1};
                 encoder.CopyTextureToBuffer(&textureCopyView, &bufferCopyView, &copySize);
                 bufferOffset += bufferSpec.size;
@@ -142,22 +144,28 @@
             queue.Submit(1, &commands);
 
             bufferOffset = bufferSpec.offset;
-            std::vector<RGBA8> expected(bufferSpec.rowPitch / kBytesPerTexel * (textureSpec.copyHeight - 1) + textureSpec.copyWidth);
+            std::vector<RGBA8> expected(bufferSpec.bytesPerRow / kBytesPerTexel *
+                                            (textureSpec.copyHeight - 1) +
+                                        textureSpec.copyWidth);
             for (uint32_t slice = 0; slice < textureSpec.arraySize; ++slice) {
                 // Pack the data used to create the upload buffer in the specified copy region to have the same format as the expected buffer data.
                 std::fill(expected.begin(), expected.end(), RGBA8());
                 PackTextureData(
-                    &textureArrayData[slice][textureSpec.x + textureSpec.y * (rowPitch / kBytesPerTexel)],
-                    textureSpec.copyWidth,
-                    textureSpec.copyHeight,
-                    rowPitch / kBytesPerTexel,
-                    expected.data(),
-                    bufferSpec.rowPitch / kBytesPerTexel);
+                    &textureArrayData[slice][textureSpec.x +
+                                             textureSpec.y * (bytesPerRow / kBytesPerTexel)],
+                    textureSpec.copyWidth, textureSpec.copyHeight, bytesPerRow / kBytesPerTexel,
+                    expected.data(), bufferSpec.bytesPerRow / kBytesPerTexel);
 
-                EXPECT_BUFFER_U32_RANGE_EQ(reinterpret_cast<const uint32_t*>(expected.data()), buffer, bufferOffset, static_cast<uint32_t>(expected.size())) <<
-                    "Texture to Buffer copy failed copying region [(" << textureSpec.x << ", " << textureSpec.y << "), (" << textureSpec.x + textureSpec.copyWidth << ", " << textureSpec.y + textureSpec.copyHeight <<
-                    ")) from " << textureSpec.width << " x " << textureSpec.height << " texture at mip level " << textureSpec.level << " layer " << slice <<
-                    " to " << bufDescriptor.size << "-byte buffer with offset " << bufferOffset << " and row pitch " << bufferSpec.rowPitch << std::endl;
+                EXPECT_BUFFER_U32_RANGE_EQ(reinterpret_cast<const uint32_t*>(expected.data()),
+                                           buffer, bufferOffset,
+                                           static_cast<uint32_t>(expected.size()))
+                    << "Texture to Buffer copy failed copying region [(" << textureSpec.x << ", "
+                    << textureSpec.y << "), (" << textureSpec.x + textureSpec.copyWidth << ", "
+                    << textureSpec.y + textureSpec.copyHeight << ")) from " << textureSpec.width
+                    << " x " << textureSpec.height << " texture at mip level " << textureSpec.level
+                    << " layer " << slice << " to " << bufDescriptor.size
+                    << "-byte buffer with offset " << bufferOffset << " and bytes per row "
+                    << bufferSpec.bytesPerRow << std::endl;
 
                 bufferOffset += bufferSpec.size;
             }
@@ -205,14 +213,15 @@
 
         wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
 
-        // Create an upload buffer filled with empty data and use it to populate the `level` mip of the texture
-        // Note: Prepopulating the texture with empty data ensures that there is not random data in the expectation
-        // and helps ensure that the padding due to the row pitch is not modified by the copy
+        // Create an upload buffer filled with empty data and use it to populate the `level` mip of
+        // the texture Note: Prepopulating the texture with empty data ensures that there is not
+        // random data in the expectation and helps ensure that the padding due to the bytes per row
+        // is not modified by the copy
         {
             uint32_t width = textureSpec.width >> textureSpec.level;
             uint32_t height = textureSpec.height >> textureSpec.level;
-            uint32_t rowPitch = Align(kBytesPerTexel * width, kTextureRowPitchAlignment);
-            uint32_t texelsPerRow = rowPitch / kBytesPerTexel;
+            uint32_t bytesPerRow = Align(kBytesPerTexel * width, kTextureBytesPerRowAlignment);
+            uint32_t texelsPerRow = bytesPerRow / kBytesPerTexel;
             uint32_t texelCount = texelsPerRow * (height - 1) + width;
 
             std::vector<RGBA8> emptyData(texelCount);
@@ -220,17 +229,18 @@
                 device, emptyData.data(), static_cast<uint32_t>(sizeof(RGBA8) * emptyData.size()),
                 wgpu::BufferUsage::CopySrc);
             wgpu::BufferCopyView bufferCopyView =
-                utils::CreateBufferCopyView(uploadBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(uploadBuffer, 0, bytesPerRow, 0);
             wgpu::TextureCopyView textureCopyView =
                 utils::CreateTextureCopyView(texture, textureSpec.level, 0, {0, 0, 0});
             wgpu::Extent3D copySize = {width, height, 1};
             encoder.CopyBufferToTexture(&bufferCopyView, &textureCopyView, &copySize);
         }
 
-        // Copy to the region [(`x`, `y`), (`x + copyWidth, `y + copyWidth`)] at the `level` mip from the buffer at the specified `offset` and `rowPitch`
+        // Copy to the region [(`x`, `y`), (`x + copyWidth, `y + copyWidth`)] at the `level` mip
+        // from the buffer at the specified `offset` and `bytesPerRow`
         {
             wgpu::BufferCopyView bufferCopyView =
-                utils::CreateBufferCopyView(buffer, bufferSpec.offset, bufferSpec.rowPitch, 0);
+                utils::CreateBufferCopyView(buffer, bufferSpec.offset, bufferSpec.bytesPerRow, 0);
             wgpu::TextureCopyView textureCopyView = utils::CreateTextureCopyView(
                 texture, textureSpec.level, 0, {textureSpec.x, textureSpec.y, 0});
             wgpu::Extent3D copySize = {textureSpec.copyWidth, textureSpec.copyHeight, 1};
@@ -241,15 +251,23 @@
         queue.Submit(1, &commands);
 
         // Pack the data used to create the buffer in the specified copy region to have the same format as the expected texture data.
-        uint32_t rowPitch = Align(kBytesPerTexel * textureSpec.copyWidth, kTextureRowPitchAlignment);
-        std::vector<RGBA8> expected(rowPitch / kBytesPerTexel * (textureSpec.copyHeight - 1) + textureSpec.copyWidth);
-        PackTextureData(&bufferData[bufferSpec.offset / kBytesPerTexel], textureSpec.copyWidth, textureSpec.copyHeight, bufferSpec.rowPitch / kBytesPerTexel, expected.data(), textureSpec.copyWidth);
+        uint32_t bytesPerRow =
+            Align(kBytesPerTexel * textureSpec.copyWidth, kTextureBytesPerRowAlignment);
+        std::vector<RGBA8> expected(bytesPerRow / kBytesPerTexel * (textureSpec.copyHeight - 1) +
+                                    textureSpec.copyWidth);
+        PackTextureData(&bufferData[bufferSpec.offset / kBytesPerTexel], textureSpec.copyWidth,
+                        textureSpec.copyHeight, bufferSpec.bytesPerRow / kBytesPerTexel,
+                        expected.data(), textureSpec.copyWidth);
 
-        EXPECT_TEXTURE_RGBA8_EQ(expected.data(), texture, textureSpec.x, textureSpec.y, textureSpec.copyWidth, textureSpec.copyHeight, textureSpec.level, 0) <<
-            "Buffer to Texture copy failed copying "
-            << bufferSpec.size << "-byte buffer with offset " << bufferSpec.offset << " and row pitch " << bufferSpec.rowPitch << " to [("
-            << textureSpec.x << ", " << textureSpec.y << "), (" << textureSpec.x + textureSpec.copyWidth << ", " << textureSpec.y + textureSpec.copyHeight <<
-            ")) region of " << textureSpec.width << " x " << textureSpec.height << " texture at mip level " << textureSpec.level << std::endl;
+        EXPECT_TEXTURE_RGBA8_EQ(expected.data(), texture, textureSpec.x, textureSpec.y,
+                                textureSpec.copyWidth, textureSpec.copyHeight, textureSpec.level, 0)
+            << "Buffer to Texture copy failed copying " << bufferSpec.size
+            << "-byte buffer with offset " << bufferSpec.offset << " and bytes per row "
+            << bufferSpec.bytesPerRow << " to [(" << textureSpec.x << ", " << textureSpec.y
+            << "), (" << textureSpec.x + textureSpec.copyWidth << ", "
+            << textureSpec.y + textureSpec.copyHeight << ")) region of " << textureSpec.width
+            << " x " << textureSpec.height << " texture at mip level " << textureSpec.level
+            << std::endl;
     }
 
 
@@ -302,14 +320,14 @@
         // `level` mip level
         uint32_t width = srcSpec.width >> srcSpec.level;
         uint32_t height = srcSpec.height >> srcSpec.level;
-        uint32_t rowPitch = Align(kBytesPerTexel * width, kTextureRowPitchAlignment);
-        uint32_t texelsPerRow = rowPitch / kBytesPerTexel;
+        uint32_t bytesPerRow = Align(kBytesPerTexel * width, kTextureBytesPerRowAlignment);
+        uint32_t texelsPerRow = bytesPerRow / kBytesPerTexel;
         uint32_t texelCountPerLayer = texelsPerRow * (height - 1) + width;
 
         std::vector<std::vector<RGBA8>> textureArrayData(srcSpec.arraySize);
         for (uint32_t slice = 0; slice < srcSpec.arraySize; ++slice) {
             textureArrayData[slice].resize(texelCountPerLayer);
-            FillTextureData(width, height, rowPitch / kBytesPerTexel, slice,
+            FillTextureData(width, height, bytesPerRow / kBytesPerTexel, slice,
                             textureArrayData[slice].data());
 
             wgpu::Buffer uploadBuffer = utils::CreateBufferFromData(
@@ -317,7 +335,7 @@
                 static_cast<uint32_t>(sizeof(RGBA8) * textureArrayData[slice].size()),
                 wgpu::BufferUsage::CopySrc);
             wgpu::BufferCopyView bufferCopyView =
-                utils::CreateBufferCopyView(uploadBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(uploadBuffer, 0, bytesPerRow, 0);
             wgpu::TextureCopyView textureCopyView =
                 utils::CreateTextureCopyView(srcTexture, srcSpec.level, slice, {0, 0, 0});
             wgpu::Extent3D bufferCopySize = {width, height, 1};
@@ -327,12 +345,12 @@
 
         // Create an upload buffer filled with empty data and use it to populate the `level` mip of
         // the texture. Note: Prepopulating the texture with empty data ensures that there is not
-        // random data in the expectation and helps ensure that the padding due to the row pitch is
-        // not modified by the copy
+        // random data in the expectation and helps ensure that the padding due to the bytes per row
+        // is not modified by the copy
         {
             uint32_t dstWidth = dstSpec.width >> dstSpec.level;
             uint32_t dstHeight = dstSpec.height >> dstSpec.level;
-            uint32_t dstRowPitch = Align(kBytesPerTexel * dstWidth, kTextureRowPitchAlignment);
+            uint32_t dstRowPitch = Align(kBytesPerTexel * dstWidth, kTextureBytesPerRowAlignment);
             uint32_t dstTexelsPerRow = dstRowPitch / kBytesPerTexel;
             uint32_t dstTexelCount = dstTexelsPerRow * (dstHeight - 1) + dstWidth;
 
@@ -361,11 +379,11 @@
         wgpu::CommandBuffer commands = encoder.Finish();
         queue.Submit(1, &commands);
 
-        std::vector<RGBA8> expected(rowPitch / kBytesPerTexel * (copy.height - 1) + copy.width);
+        std::vector<RGBA8> expected(bytesPerRow / kBytesPerTexel * (copy.height - 1) + copy.width);
         for (uint32_t slice = 0; slice < srcSpec.arraySize; ++slice) {
             std::fill(expected.begin(), expected.end(), RGBA8());
             PackTextureData(
-                &textureArrayData[slice][srcSpec.x + srcSpec.y * (rowPitch / kBytesPerTexel)],
+                &textureArrayData[slice][srcSpec.x + srcSpec.y * (bytesPerRow / kBytesPerTexel)],
                 copy.width, copy.height, texelsPerRow, expected.data(), copy.width);
 
             EXPECT_TEXTURE_RGBA8_EQ(expected.data(), dstTexture, dstSpec.x, dstSpec.y, copy.width,
@@ -486,7 +504,8 @@
     }
 }
 
-// Test that copying without a 512-byte aligned buffer offset that is greater than the row pitch works
+// Test that copying without a 512-byte aligned buffer offset that is greater than the bytes per row
+// works
 TEST_P(CopyTests_T2B, OffsetBufferUnalignedSmallRowPitch) {
     constexpr uint32_t kWidth = 32;
     constexpr uint32_t kHeight = 128;
@@ -498,25 +517,26 @@
     }
 }
 
-// Test that copying with a greater row pitch than needed on a 256-byte aligned texture works
+// Test that copying with a greater bytes per row than needed on a 256-byte aligned texture works
 TEST_P(CopyTests_T2B, RowPitchAligned) {
     constexpr uint32_t kWidth = 256;
     constexpr uint32_t kHeight = 128;
     BufferSpec bufferSpec = MinimumBufferSpec(kWidth, kHeight);
     for (unsigned int i = 1; i < 4; ++i) {
-        bufferSpec.rowPitch += 256;
+        bufferSpec.bytesPerRow += 256;
         bufferSpec.size += 256 * kHeight;
         DoTest({ kWidth, kHeight, 0, 0, kWidth, kHeight, 0 }, bufferSpec);
     }
 }
 
-// Test that copying with a greater row pitch than needed on a texture that is not 256-byte aligned works
+// Test that copying with a greater bytes per row than needed on a texture that is not 256-byte
+// aligned works
 TEST_P(CopyTests_T2B, RowPitchUnaligned) {
     constexpr uint32_t kWidth = 259;
     constexpr uint32_t kHeight = 127;
     BufferSpec bufferSpec = MinimumBufferSpec(kWidth, kHeight);
     for (unsigned int i = 1; i < 4; ++i) {
-        bufferSpec.rowPitch += 256;
+        bufferSpec.bytesPerRow += 256;
         bufferSpec.size += 256 * kHeight;
         DoTest({ kWidth, kHeight, 0, 0, kWidth, kHeight, 0 }, bufferSpec);
     }
@@ -647,7 +667,8 @@
     }
 }
 
-// Test that copying without a 512-byte aligned buffer offset that is greater than the row pitch works
+// Test that copying without a 512-byte aligned buffer offset that is greater than the bytes per row
+// works
 TEST_P(CopyTests_B2T, OffsetBufferUnalignedSmallRowPitch) {
     constexpr uint32_t kWidth = 32;
     constexpr uint32_t kHeight = 128;
@@ -659,25 +680,26 @@
     }
 }
 
-// Test that copying with a greater row pitch than needed on a 256-byte aligned texture works
+// Test that copying with a greater bytes per row than needed on a 256-byte aligned texture works
 TEST_P(CopyTests_B2T, RowPitchAligned) {
     constexpr uint32_t kWidth = 256;
     constexpr uint32_t kHeight = 128;
     BufferSpec bufferSpec = MinimumBufferSpec(kWidth, kHeight);
     for (unsigned int i = 1; i < 4; ++i) {
-        bufferSpec.rowPitch += 256;
+        bufferSpec.bytesPerRow += 256;
         bufferSpec.size += 256 * kHeight;
         DoTest({ kWidth, kHeight, 0, 0, kWidth, kHeight, 0 }, bufferSpec);
     }
 }
 
-// Test that copying with a greater row pitch than needed on a texture that is not 256-byte aligned works
+// Test that copying with a greater bytes per row than needed on a texture that is not 256-byte
+// aligned works
 TEST_P(CopyTests_B2T, RowPitchUnaligned) {
     constexpr uint32_t kWidth = 259;
     constexpr uint32_t kHeight = 127;
     BufferSpec bufferSpec = MinimumBufferSpec(kWidth, kHeight);
     for (unsigned int i = 1; i < 4; ++i) {
-        bufferSpec.rowPitch += 256;
+        bufferSpec.bytesPerRow += 256;
         bufferSpec.size += 256 * kHeight;
         DoTest({ kWidth, kHeight, 0, 0, kWidth, kHeight, 0 }, bufferSpec);
     }
diff --git a/src/tests/end2end/DeprecatedAPITests.cpp b/src/tests/end2end/DeprecatedAPITests.cpp
index d7ea754..de1ecb1 100644
--- a/src/tests/end2end/DeprecatedAPITests.cpp
+++ b/src/tests/end2end/DeprecatedAPITests.cpp
@@ -19,6 +19,7 @@
 
 #include "tests/DawnTest.h"
 
+#include "common/Constants.h"
 #include "utils/ComboRenderPipelineDescriptor.h"
 #include "utils/WGPUHelpers.h"
 
@@ -364,6 +365,136 @@
     ASSERT_DEVICE_ERROR(device.CreateRenderPipeline(&renderPipelineDesc));
 }
 
+// Tests for BufferCopyView.rowPitch/imageHeight -> bytesPerRow/rowsPerImage
+
+class BufferCopyViewDeprecationTests : public DeprecationTests {
+  protected:
+    void TestSetUp() override {
+        DeprecationTests::TestSetUp();
+
+        wgpu::BufferDescriptor bufferDesc = {
+            .usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst,
+            .size = kTextureBytesPerRowAlignment * 2,
+        };
+        buffer = device.CreateBuffer(&bufferDesc);
+
+        wgpu::TextureDescriptor textureDesc = {
+            .usage = wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::CopyDst,
+            .size = {2, 2, 1},
+            .format = wgpu::TextureFormat::RGBA8Unorm,
+        };
+        texture = device.CreateTexture(&textureDesc);
+    }
+
+    enum CopyType {
+        B2T,
+        T2B,
+    };
+    void DoCopy(CopyType type, const wgpu::BufferCopyView& bufferView) {
+        wgpu::TextureCopyView textureCopyView = {
+            .texture = texture,
+            .mipLevel = 0,
+            .arrayLayer = 0,
+            .origin = {0, 0},
+        };
+        wgpu::Extent3D copySize = {2, 2, 1};
+
+        wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+        switch (type) {
+            case B2T:
+                encoder.CopyBufferToTexture(&bufferView, &textureCopyView, &copySize);
+                break;
+            case T2B:
+                encoder.CopyTextureToBuffer(&textureCopyView, &bufferView, &copySize);
+                break;
+        }
+        encoder.Finish();
+    }
+
+    wgpu::Buffer buffer;
+    wgpu::Texture texture;
+};
+
+// Test that using rowPitch produces a deprecation warning.
+TEST_P(BufferCopyViewDeprecationTests, RowPitchIsDeprecated) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .rowPitch = 256,
+    };
+    EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view));
+    EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view));
+}
+
+// Test that using imageHeight produces a deprecation warning.
+TEST_P(BufferCopyViewDeprecationTests, ImageHeightIsDeprecated) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .imageHeight = 2,
+        .bytesPerRow = 256,
+    };
+    EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view));
+    EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view));
+}
+
+// Test that using both rowPitch and bytesPerRow produces a validation error.
+TEST_P(BufferCopyViewDeprecationTests, BothRowPitchAndBytesPerRowIsInvalid) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .rowPitch = 256,
+        .bytesPerRow = 256,
+    };
+    ASSERT_DEVICE_ERROR(DoCopy(B2T, view));
+    ASSERT_DEVICE_ERROR(DoCopy(T2B, view));
+}
+
+// Test that using both imageHeight and rowsPerImage produces a validation error.
+TEST_P(BufferCopyViewDeprecationTests, BothImageHeightAndRowsPerImageIsInvalid) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .imageHeight = 2,
+        .bytesPerRow = 256,
+        .rowsPerImage = 2,
+    };
+    ASSERT_DEVICE_ERROR(DoCopy(B2T, view));
+    ASSERT_DEVICE_ERROR(DoCopy(T2B, view));
+}
+
+// Test that rowPitch is correctly taken into account for validation
+TEST_P(BufferCopyViewDeprecationTests, RowPitchTakenIntoAccountForValidation) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .rowPitch = 256,
+    };
+    EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view));
+    EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view));
+
+    view.rowPitch = 128;
+    ASSERT_DEVICE_ERROR(EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view)));
+    ASSERT_DEVICE_ERROR(EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view)));
+}
+
+// Test that imageHeight is correctly taken into account for validation
+TEST_P(BufferCopyViewDeprecationTests, ImageHeightTakenIntoAccountForValidation) {
+    wgpu::BufferCopyView view = {
+        .buffer = buffer,
+        .imageHeight = 2,
+        .bytesPerRow = 256,
+    };
+    EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view));
+    EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view));
+
+    view.imageHeight = 1;
+    ASSERT_DEVICE_ERROR(EXPECT_DEPRECATION_WARNING(DoCopy(B2T, view)));
+    ASSERT_DEVICE_ERROR(EXPECT_DEPRECATION_WARNING(DoCopy(T2B, view)));
+}
+
+DAWN_INSTANTIATE_TEST(BufferCopyViewDeprecationTests,
+                      D3D12Backend(),
+                      MetalBackend(),
+                      NullBackend(),
+                      OpenGLBackend(),
+                      VulkanBackend());
+
 DAWN_INSTANTIATE_TEST(DeprecationTests,
                       D3D12Backend(),
                       MetalBackend(),
diff --git a/src/tests/end2end/SamplerTests.cpp b/src/tests/end2end/SamplerTests.cpp
index 157a266..b476b34 100644
--- a/src/tests/end2end/SamplerTests.cpp
+++ b/src/tests/end2end/SamplerTests.cpp
@@ -98,7 +98,7 @@
         wgpu::Texture texture = device.CreateTexture(&descriptor);
 
         // Create a 2x2 checkerboard texture, with black in the top left and bottom right corners.
-        const uint32_t rowPixels = kTextureRowPitchAlignment / sizeof(RGBA8);
+        const uint32_t rowPixels = kTextureBytesPerRowAlignment / sizeof(RGBA8);
         RGBA8 data[rowPixels * 2];
         data[0] = data[rowPixels + 1] = RGBA8::kBlack;
         data[1] = data[rowPixels] = RGBA8::kWhite;
diff --git a/src/tests/end2end/TextureViewTests.cpp b/src/tests/end2end/TextureViewTests.cpp
index 8797948..b133d7b 100644
--- a/src/tests/end2end/TextureViewTests.cpp
+++ b/src/tests/end2end/TextureViewTests.cpp
@@ -117,9 +117,9 @@
 
         // Create a texture with pixel = (0, 0, 0, level * 10 + layer + 1) at level `level` and
         // layer `layer`.
-        static_assert((kTextureRowPitchAlignment % sizeof(RGBA8)) == 0,
-            "Texture row pitch alignment must be a multiple of sizeof(RGBA8).");
-        constexpr uint32_t kPixelsPerRowPitch = kTextureRowPitchAlignment / sizeof(RGBA8);
+        static_assert((kTextureBytesPerRowAlignment % sizeof(RGBA8)) == 0,
+                      "Texture bytes per row alignment must be a multiple of sizeof(RGBA8).");
+        constexpr uint32_t kPixelsPerRowPitch = kTextureBytesPerRowAlignment / sizeof(RGBA8);
         ASSERT_LE(textureWidthLevel0, kPixelsPerRowPitch);
 
         wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
@@ -135,7 +135,7 @@
                 wgpu::Buffer stagingBuffer = utils::CreateBufferFromData(
                     device, data.data(), data.size() * sizeof(RGBA8), wgpu::BufferUsage::CopySrc);
                 wgpu::BufferCopyView bufferCopyView =
-                    utils::CreateBufferCopyView(stagingBuffer, 0, kTextureRowPitchAlignment, 0);
+                    utils::CreateBufferCopyView(stagingBuffer, 0, kTextureBytesPerRowAlignment, 0);
                 wgpu::TextureCopyView textureCopyView =
                     utils::CreateTextureCopyView(mTexture, level, layer, {0, 0, 0});
                 wgpu::Extent3D copySize = {texWidth, texHeight, 1};
@@ -514,9 +514,10 @@
         // Check if the right pixels (Green) have been written into the right part of the texture.
         uint32_t textureViewWidth = textureWidthLevel0 >> textureViewBaseLevel;
         uint32_t textureViewHeight = textureHeightLevel0 >> textureViewBaseLevel;
-        uint32_t rowPitch = Align(kBytesPerTexel * textureWidthLevel0, kTextureRowPitchAlignment);
+        uint32_t bytesPerRow =
+            Align(kBytesPerTexel * textureWidthLevel0, kTextureBytesPerRowAlignment);
         uint32_t expectedDataSize =
-            rowPitch / kBytesPerTexel * (textureWidthLevel0 - 1) + textureHeightLevel0;
+            bytesPerRow / kBytesPerTexel * (textureWidthLevel0 - 1) + textureHeightLevel0;
         constexpr RGBA8 kExpectedPixel(0, 255, 0, 255);
         std::vector<RGBA8> expected(expectedDataSize, kExpectedPixel);
         EXPECT_TEXTURE_RGBA8_EQ(
diff --git a/src/tests/end2end/TextureZeroInitTests.cpp b/src/tests/end2end/TextureZeroInitTests.cpp
index 79993ad..b71f766 100644
--- a/src/tests/end2end/TextureZeroInitTests.cpp
+++ b/src/tests/end2end/TextureZeroInitTests.cpp
@@ -638,13 +638,13 @@
     wgpu::Texture texture = device.CreateTexture(&descriptor);
 
     // Set buffer with dirty data so we know it is cleared by the lazy cleared texture copy
-    uint32_t rowPitch = Align(kSize * kFormatBlockByteSize, kTextureRowPitchAlignment);
-    uint32_t bufferSize = rowPitch * kSize;
+    uint32_t bytesPerRow = Align(kSize * kFormatBlockByteSize, kTextureBytesPerRowAlignment);
+    uint32_t bufferSize = bytesPerRow * kSize;
     std::vector<uint8_t> data(bufferSize, 100);
     wgpu::Buffer bufferDst = utils::CreateBufferFromData(
         device, data.data(), static_cast<uint32_t>(data.size()), wgpu::BufferUsage::CopySrc);
 
-    wgpu::BufferCopyView bufferCopyView = utils::CreateBufferCopyView(bufferDst, 0, rowPitch, 0);
+    wgpu::BufferCopyView bufferCopyView = utils::CreateBufferCopyView(bufferDst, 0, bytesPerRow, 0);
     wgpu::TextureCopyView textureCopyView = utils::CreateTextureCopyView(texture, 0, 0, {0, 0, 0});
     wgpu::Extent3D copySize = {kSize, kSize, 1};
 
@@ -669,12 +669,13 @@
     wgpu::Texture texture = device.CreateTexture(&descriptor);
 
     // Set buffer with dirty data so we know it is cleared by the lazy cleared texture copy
-    uint32_t rowPitch = Align(kUnalignedSize * kFormatBlockByteSize, kTextureRowPitchAlignment);
-    uint32_t bufferSize = rowPitch * kUnalignedSize;
+    uint32_t bytesPerRow =
+        Align(kUnalignedSize * kFormatBlockByteSize, kTextureBytesPerRowAlignment);
+    uint32_t bufferSize = bytesPerRow * kUnalignedSize;
     std::vector<uint8_t> data(bufferSize, 100);
     wgpu::Buffer bufferDst = utils::CreateBufferFromData(
         device, data.data(), static_cast<uint32_t>(data.size()), wgpu::BufferUsage::CopySrc);
-    wgpu::BufferCopyView bufferCopyView = utils::CreateBufferCopyView(bufferDst, 0, rowPitch, 0);
+    wgpu::BufferCopyView bufferCopyView = utils::CreateBufferCopyView(bufferDst, 0, bytesPerRow, 0);
     wgpu::TextureCopyView textureCopyView = utils::CreateTextureCopyView(texture, 0, 0, {0, 0, 0});
     wgpu::Extent3D copySize = {kUnalignedSize, kUnalignedSize, 1};
 
diff --git a/src/tests/unittests/d3d12/CopySplitTests.cpp b/src/tests/unittests/d3d12/CopySplitTests.cpp
index da703a0..46f7047 100644
--- a/src/tests/unittests/d3d12/CopySplitTests.cpp
+++ b/src/tests/unittests/d3d12/CopySplitTests.cpp
@@ -39,8 +39,8 @@
 
     struct BufferSpec {
         uint64_t offset;
-        uint32_t rowPitch;
-        uint32_t imageHeight;
+        uint32_t bytesPerRow;
+        uint32_t rowsPerImage;
     };
 
     // Check that each copy region fits inside the buffer footprint
@@ -123,14 +123,14 @@
         for (uint32_t i = 0; i < copySplit.count; ++i) {
             const auto& copy = copySplit.copies[i];
 
-            uint32_t rowPitchInTexels =
-                bufferSpec.rowPitch / textureSpec.texelBlockSizeInBytes * texelsPerBlock;
+            uint32_t bytesPerRowInTexels =
+                bufferSpec.bytesPerRow / textureSpec.texelBlockSizeInBytes * texelsPerBlock;
             uint32_t slicePitchInTexels =
-                rowPitchInTexels * (bufferSpec.imageHeight / textureSpec.blockHeight);
+                bytesPerRowInTexels * (bufferSpec.rowsPerImage / textureSpec.blockHeight);
             uint32_t absoluteTexelOffset =
                 copySplit.offset / textureSpec.texelBlockSizeInBytes * texelsPerBlock +
                 copy.bufferOffset.x / textureSpec.blockWidth * texelsPerBlock +
-                copy.bufferOffset.y / textureSpec.blockHeight * rowPitchInTexels +
+                copy.bufferOffset.y / textureSpec.blockHeight * bytesPerRowInTexels +
                 copy.bufferOffset.z * slicePitchInTexels;
 
             ASSERT(absoluteTexelOffset >=
@@ -140,8 +140,8 @@
                 bufferSpec.offset / textureSpec.texelBlockSizeInBytes * texelsPerBlock;
 
             uint32_t z = relativeTexelOffset / slicePitchInTexels;
-            uint32_t y = (relativeTexelOffset % slicePitchInTexels) / rowPitchInTexels;
-            uint32_t x = relativeTexelOffset % rowPitchInTexels;
+            uint32_t y = (relativeTexelOffset % slicePitchInTexels) / bytesPerRowInTexels;
+            uint32_t x = relativeTexelOffset % bytesPerRowInTexels;
 
             ASSERT_EQ(copy.textureOffset.x - textureSpec.x, x);
             ASSERT_EQ(copy.textureOffset.y - textureSpec.y, y);
@@ -167,8 +167,8 @@
     }
 
     std::ostream& operator<<(std::ostream& os, const BufferSpec& bufferSpec) {
-        os << "BufferSpec(" << bufferSpec.offset << ", " << bufferSpec.rowPitch << ", "
-           << bufferSpec.imageHeight << ")";
+        os << "BufferSpec(" << bufferSpec.offset << ", " << bufferSpec.bytesPerRow << ", "
+           << bufferSpec.rowsPerImage << ")";
         return os;
     }
 
@@ -217,43 +217,44 @@
         {64, 48, 16, 1024, 1024, 1, 16, 4, 4},
     };
 
-    // Define base buffer sizes to work with: some offsets aligned, some unaligned. rowPitch is the minimum required
+    // Define base buffer sizes to work with: some offsets aligned, some unaligned. bytesPerRow is
+    // the minimum required
     std::array<BufferSpec, 13> BaseBufferSpecs(const TextureSpec& textureSpec) {
-        uint32_t rowPitch =
-            Align(textureSpec.texelBlockSizeInBytes * textureSpec.width, kTextureRowPitchAlignment);
+        uint32_t bytesPerRow = Align(textureSpec.texelBlockSizeInBytes * textureSpec.width,
+                                     kTextureBytesPerRowAlignment);
 
         auto alignNonPow2 = [](uint32_t value, uint32_t size) -> uint32_t {
             return value == 0 ? 0 : ((value - 1) / size + 1) * size;
         };
 
         return {
-            BufferSpec{alignNonPow2(0, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(0, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(512, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(512, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(1024, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(1024, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(1024, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(1024, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height * 2},
 
-            BufferSpec{alignNonPow2(32, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(32, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(64, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(64, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(64, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(64, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height * 2},
 
-            BufferSpec{alignNonPow2(31, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(31, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(257, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(257, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(511, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(511, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(513, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(513, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(1023, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(1023, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height},
-            BufferSpec{alignNonPow2(1023, textureSpec.texelBlockSizeInBytes), rowPitch,
+            BufferSpec{alignNonPow2(1023, textureSpec.texelBlockSizeInBytes), bytesPerRow,
                        textureSpec.height * 2},
         };
     }
@@ -280,7 +281,7 @@
             TextureCopySplit copySplit = ComputeTextureCopySplit(
                 {textureSpec.x, textureSpec.y, textureSpec.z},
                 {textureSpec.width, textureSpec.height, textureSpec.depth}, fakeFormat,
-                bufferSpec.offset, bufferSpec.rowPitch, bufferSpec.imageHeight);
+                bufferSpec.offset, bufferSpec.bytesPerRow, bufferSpec.rowsPerImage);
             ValidateCopySplit(textureSpec, bufferSpec, copySplit);
             return copySplit;
         }
@@ -418,9 +419,9 @@
 TEST_F(CopySplitTest, RowPitch) {
     for (TextureSpec textureSpec : kBaseTextureSpecs) {
         for (BufferSpec bufferSpec : BaseBufferSpecs(textureSpec)) {
-            uint32_t baseRowPitch = bufferSpec.rowPitch;
+            uint32_t baseRowPitch = bufferSpec.bytesPerRow;
             for (uint32_t i = 0; i < 5; ++i) {
-                bufferSpec.rowPitch = baseRowPitch + i * 256;
+                bufferSpec.bytesPerRow = baseRowPitch + i * 256;
 
                 TextureCopySplit copySplit = DoTest(textureSpec, bufferSpec);
                 if (HasFatalFailure()) {
@@ -437,9 +438,9 @@
 TEST_F(CopySplitTest, ImageHeight) {
     for (TextureSpec textureSpec : kBaseTextureSpecs) {
         for (BufferSpec bufferSpec : BaseBufferSpecs(textureSpec)) {
-            uint32_t baseImageHeight = bufferSpec.imageHeight;
+            uint32_t baseImageHeight = bufferSpec.rowsPerImage;
             for (uint32_t i = 0; i < 5; ++i) {
-                bufferSpec.imageHeight = baseImageHeight + i * 256;
+                bufferSpec.rowsPerImage = baseImageHeight + i * 256;
 
                 TextureCopySplit copySplit = DoTest(textureSpec, bufferSpec);
                 if (HasFatalFailure()) {
diff --git a/src/tests/unittests/validation/CopyCommandsValidationTests.cpp b/src/tests/unittests/validation/CopyCommandsValidationTests.cpp
index edc2639..8d195f2 100644
--- a/src/tests/unittests/validation/CopyCommandsValidationTests.cpp
+++ b/src/tests/unittests/validation/CopyCommandsValidationTests.cpp
@@ -68,8 +68,8 @@
         uint32_t depth,
         wgpu::TextureFormat format = wgpu::TextureFormat::RGBA8Unorm) {
         uint32_t bytesPerPixel = TextureFormatPixelSize(format);
-        uint32_t rowPitch = Align(width * bytesPerPixel, kTextureRowPitchAlignment);
-        return (rowPitch * (height - 1) + width * bytesPerPixel) * depth;
+        uint32_t bytesPerRow = Align(width * bytesPerPixel, kTextureBytesPerRowAlignment);
+        return (bytesPerRow * (height - 1) + width * bytesPerPixel) * depth;
     }
 
     void ValidateExpectation(wgpu::CommandEncoder encoder, utils::Expectation expectation) {
@@ -291,7 +291,7 @@
                     {0, 0, 0}, {1, 1, 1});
     }
 
-    // Copies with a 256-byte aligned row pitch but unaligned texture region
+    // Copies with a 256-byte aligned bytes per row but unaligned texture region
     {
         // Unaligned region
         TestB2TCopy(utils::Expectation::Success, source, 0, 256, 0, destination, 0, 0, {0, 0, 0},
@@ -336,16 +336,16 @@
     TestB2TCopy(utils::Expectation::Failure, source, 4, 256, 0, destination, 0, 0, {0, 0, 0},
                 {4, 4, 1});
 
-    // OOB on the buffer because (row pitch * (height - 1) + width * bytesPerPixel) * depth
+    // OOB on the buffer because (bytes per row * (height - 1) + width * bytesPerPixel) * depth
     // overflows
     TestB2TCopy(utils::Expectation::Failure, source, 0, 512, 0, destination, 0, 0, {0, 0, 0},
                 {4, 3, 1});
 
-    // Not OOB on the buffer although row pitch * height overflows
-    // but (row pitch * (height - 1) + width * bytesPerPixel) * depth does not overflow
+    // Not OOB on the buffer although bytes per row * height overflows
+    // but (bytes per row * (height - 1) + width * bytesPerPixel) * depth does not overflow
     {
         uint32_t sourceBufferSize = BufferSizeForTextureCopy(7, 3, 1);
-        ASSERT_TRUE(256 * 3 > sourceBufferSize) << "row pitch * height should overflow buffer";
+        ASSERT_TRUE(256 * 3 > sourceBufferSize) << "bytes per row * height should overflow buffer";
         wgpu::Buffer sourceBuffer = CreateBuffer(sourceBufferSize, wgpu::BufferUsage::CopySrc);
 
         TestB2TCopy(utils::Expectation::Success, source, 0, 256, 0, destination, 0, 0, {0, 0, 0},
@@ -420,15 +420,15 @@
     wgpu::Texture destination = Create2DTexture(128, 16, 5, 1, wgpu::TextureFormat::RGBA8Unorm,
                                                 wgpu::TextureUsage::CopyDst);
 
-    // Default row pitch is not 256-byte aligned
+    // Default bytes per row is not 256-byte aligned
     TestB2TCopy(utils::Expectation::Failure, source, 0, 0, 0, destination, 0, 0, {0, 0, 0},
                 {3, 4, 1});
 
-    // Row pitch is not 256-byte aligned
+    // bytes per row is not 256-byte aligned
     TestB2TCopy(utils::Expectation::Failure, source, 0, 128, 0, destination, 0, 0, {0, 0, 0},
                 {4, 4, 1});
 
-    // Row pitch is less than width * bytesPerPixel
+    // bytes per row is less than width * bytesPerPixel
     TestB2TCopy(utils::Expectation::Failure, source, 0, 256, 0, destination, 0, 0, {0, 0, 0},
                 {65, 1, 1});
 }
@@ -626,7 +626,7 @@
                     bufferSize - 4, 256, 0, {1, 1, 1});
     }
 
-    // Copies with a 256-byte aligned row pitch but unaligned texture region
+    // Copies with a 256-byte aligned bytes per row but unaligned texture region
     {
         // Unaligned region
         TestT2BCopy(utils::Expectation::Success, source, 0, 0, {0, 0, 0}, destination, 0, 256, 0,
@@ -695,16 +695,17 @@
     TestT2BCopy(utils::Expectation::Failure, source, 0, 0, {0, 0, 0}, destination, 4, 256, 0,
                 {4, 4, 1});
 
-    // OOB on the buffer because (row pitch * (height - 1) + width * bytesPerPixel) * depth
+    // OOB on the buffer because (bytes per row * (height - 1) + width * bytesPerPixel) * depth
     // overflows
     TestT2BCopy(utils::Expectation::Failure, source, 0, 0, {0, 0, 0}, destination, 0, 512, 0,
                 {4, 3, 1});
 
-    // Not OOB on the buffer although row pitch * height overflows
-    // but (row pitch * (height - 1) + width * bytesPerPixel) * depth does not overflow
+    // Not OOB on the buffer although bytes per row * height overflows
+    // but (bytes per row * (height - 1) + width * bytesPerPixel) * depth does not overflow
     {
         uint32_t destinationBufferSize = BufferSizeForTextureCopy(7, 3, 1);
-        ASSERT_TRUE(256 * 3 > destinationBufferSize) << "row pitch * height should overflow buffer";
+        ASSERT_TRUE(256 * 3 > destinationBufferSize)
+            << "bytes per row * height should overflow buffer";
         wgpu::Buffer destinationBuffer =
             CreateBuffer(destinationBufferSize, wgpu::BufferUsage::CopyDst);
         TestT2BCopy(utils::Expectation::Success, source, 0, 0, {0, 0, 0}, destinationBuffer, 0, 256,
@@ -752,15 +753,15 @@
                                            wgpu::TextureUsage::CopyDst);
     wgpu::Buffer destination = CreateBuffer(bufferSize, wgpu::BufferUsage::CopySrc);
 
-    // Default row pitch is not 256-byte aligned
+    // Default bytes per row is not 256-byte aligned
     TestT2BCopy(utils::Expectation::Failure, source, 0, 0, {0, 0, 0}, destination, 0, 256, 0,
                 {3, 4, 1});
 
-    // Row pitch is not 256-byte aligned
+    // bytes per row is not 256-byte aligned
     TestT2BCopy(utils::Expectation::Failure, source, 0, 0, {0, 0, 0}, destination, 0, 257, 0,
                 {4, 4, 1});
 
-    // Row pitch is less than width * bytesPerPixel
+    // bytes per row is less than width * bytesPerPixel
     TestT2BCopy(utils::Expectation::Failure, source, 0, 0, {0, 0, 0}, destination, 0, 256, 0,
                 {65, 1, 1});
 }
@@ -1198,16 +1199,16 @@
                           wgpu::Buffer buffer,
                           uint64_t bufferOffset,
                           uint32_t bufferRowPitch,
-                          uint32_t imageHeight,
+                          uint32_t rowsPerImage,
                           wgpu::Texture texture,
                           uint32_t level,
                           uint32_t arraySlice,
                           wgpu::Origin3D origin,
                           wgpu::Extent3D extent3D) {
-        TestB2TCopy(expectation, buffer, bufferOffset, bufferRowPitch, imageHeight, texture, level,
+        TestB2TCopy(expectation, buffer, bufferOffset, bufferRowPitch, rowsPerImage, texture, level,
                     arraySlice, origin, extent3D);
         TestT2BCopy(expectation, texture, level, arraySlice, origin, buffer, bufferOffset,
-                    bufferRowPitch, imageHeight, extent3D);
+                    bufferRowPitch, rowsPerImage, extent3D);
     }
 
     void TestBothT2TCopies(utils::Expectation expectation,
@@ -1336,7 +1337,7 @@
     }
 }
 
-// Tests to verify that imageHeight must be a multiple of the compressed texture block height in
+// Tests to verify that rowsPerImage must be a multiple of the compressed texture block height in
 // buffer-to-texture or texture-to-buffer copies with compressed texture formats.
 TEST_F(CopyCommandTest_CompressedTextureFormats, ImageHeight) {
     wgpu::Buffer buffer =
@@ -1345,14 +1346,14 @@
     for (wgpu::TextureFormat bcFormat : kBCFormats) {
         wgpu::Texture texture = Create2DTexture(bcFormat);
 
-        // Valid usages of imageHeight in B2T and T2B copies with compressed texture formats.
+        // Valid usages of rowsPerImage in B2T and T2B copies with compressed texture formats.
         {
             constexpr uint32_t kValidImageHeight = 8;
             TestBothTBCopies(utils::Expectation::Success, buffer, 0, 256, kValidImageHeight,
                              texture, 0, 0, {0, 0, 0}, {4, 4, 1});
         }
 
-        // Failures on invalid imageHeight.
+        // Failures on invalid rowsPerImage.
         {
             constexpr uint32_t kInvalidImageHeight = 3;
             TestBothTBCopies(utils::Expectation::Failure, buffer, 0, 256, kInvalidImageHeight,
diff --git a/src/tests/white_box/VulkanImageWrappingTestsDmaBuf.cpp b/src/tests/white_box/VulkanImageWrappingTestsDmaBuf.cpp
index ca49605..6300ada 100644
--- a/src/tests/white_box/VulkanImageWrappingTestsDmaBuf.cpp
+++ b/src/tests/white_box/VulkanImageWrappingTestsDmaBuf.cpp
@@ -536,8 +536,8 @@
         wgpu::BufferCopyView copyDst;
         copyDst.buffer = copyDstBuffer;
         copyDst.offset = 0;
-        copyDst.rowPitch = 256;
-        copyDst.imageHeight = 0;
+        copyDst.bytesPerRow = 256;
+        copyDst.rowsPerImage = 0;
 
         wgpu::Extent3D copySize = {1, 1, 1};
 
@@ -588,8 +588,8 @@
         wgpu::BufferCopyView copySrc;
         copySrc.buffer = copySrcBuffer;
         copySrc.offset = 0;
-        copySrc.rowPitch = 256;
-        copySrc.imageHeight = 0;
+        copySrc.bytesPerRow = 256;
+        copySrc.rowsPerImage = 0;
 
         wgpu::TextureCopyView copyDst;
         copyDst.texture = secondDeviceWrappedTexture;
@@ -787,8 +787,8 @@
 
         // Draw a non-trivial picture
         uint32_t width = 640, height = 480, pixelSize = 4;
-        uint32_t rowPitch = Align(width * pixelSize, kTextureRowPitchAlignment);
-        uint32_t size = rowPitch * (height - 1) + width * pixelSize;
+        uint32_t bytesPerRow = Align(width * pixelSize, kTextureBytesPerRowAlignment);
+        uint32_t size = bytesPerRow * (height - 1) + width * pixelSize;
         unsigned char data[size];
         for (uint32_t row = 0; row < height; row++) {
             for (uint32_t col = 0; col < width; col++) {
@@ -808,7 +808,7 @@
             wgpu::Buffer copySrcBuffer =
                 utils::CreateBufferFromData(secondDevice, data, size, wgpu::BufferUsage::CopySrc);
             wgpu::BufferCopyView copySrc =
-                utils::CreateBufferCopyView(copySrcBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(copySrcBuffer, 0, bytesPerRow, 0);
             wgpu::TextureCopyView copyDst =
                 utils::CreateTextureCopyView(wrappedTexture, 0, 0, {0, 0, 0});
             wgpu::Extent3D copySize = {width, height, 1};
@@ -836,7 +836,7 @@
             wgpu::TextureCopyView copySrc =
                 utils::CreateTextureCopyView(nextWrappedTexture, 0, 0, {0, 0, 0});
             wgpu::BufferCopyView copyDst =
-                utils::CreateBufferCopyView(copyDstBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(copyDstBuffer, 0, bytesPerRow, 0);
 
             wgpu::Extent3D copySize = {width, height, 1};
 
diff --git a/src/tests/white_box/VulkanImageWrappingTestsOpaqueFD.cpp b/src/tests/white_box/VulkanImageWrappingTestsOpaqueFD.cpp
index fef1338..6e7764b 100644
--- a/src/tests/white_box/VulkanImageWrappingTestsOpaqueFD.cpp
+++ b/src/tests/white_box/VulkanImageWrappingTestsOpaqueFD.cpp
@@ -676,8 +676,8 @@
         wgpu::BufferCopyView copyDst;
         copyDst.buffer = copyDstBuffer;
         copyDst.offset = 0;
-        copyDst.rowPitch = 256;
-        copyDst.imageHeight = 0;
+        copyDst.bytesPerRow = 256;
+        copyDst.rowsPerImage = 0;
 
         wgpu::Extent3D copySize = {1, 1, 1};
 
@@ -732,8 +732,8 @@
         wgpu::BufferCopyView copySrc;
         copySrc.buffer = copySrcBuffer;
         copySrc.offset = 0;
-        copySrc.rowPitch = 256;
-        copySrc.imageHeight = 0;
+        copySrc.bytesPerRow = 256;
+        copySrc.rowsPerImage = 0;
 
         wgpu::TextureCopyView copyDst;
         copyDst.texture = secondDeviceWrappedTexture;
@@ -961,8 +961,8 @@
 
         // Draw a non-trivial picture
         uint32_t width = 640, height = 480, pixelSize = 4;
-        uint32_t rowPitch = Align(width * pixelSize, kTextureRowPitchAlignment);
-        uint32_t size = rowPitch * (height - 1) + width * pixelSize;
+        uint32_t bytesPerRow = Align(width * pixelSize, kTextureBytesPerRowAlignment);
+        uint32_t size = bytesPerRow * (height - 1) + width * pixelSize;
         unsigned char data[size];
         for (uint32_t row = 0; row < height; row++) {
             for (uint32_t col = 0; col < width; col++) {
@@ -982,7 +982,7 @@
             wgpu::Buffer copySrcBuffer =
                 utils::CreateBufferFromData(secondDevice, data, size, wgpu::BufferUsage::CopySrc);
             wgpu::BufferCopyView copySrc =
-                utils::CreateBufferCopyView(copySrcBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(copySrcBuffer, 0, bytesPerRow, 0);
             wgpu::TextureCopyView copyDst =
                 utils::CreateTextureCopyView(wrappedTexture, 0, 0, {0, 0, 0});
             wgpu::Extent3D copySize = {width, height, 1};
@@ -1010,7 +1010,7 @@
             wgpu::TextureCopyView copySrc =
                 utils::CreateTextureCopyView(nextWrappedTexture, 0, 0, {0, 0, 0});
             wgpu::BufferCopyView copyDst =
-                utils::CreateBufferCopyView(copyDstBuffer, 0, rowPitch, 0);
+                utils::CreateBufferCopyView(copyDstBuffer, 0, bytesPerRow, 0);
 
             wgpu::Extent3D copySize = {width, height, 1};
 
diff --git a/src/utils/WGPUHelpers.cpp b/src/utils/WGPUHelpers.cpp
index adc270b..b2bf223 100644
--- a/src/utils/WGPUHelpers.cpp
+++ b/src/utils/WGPUHelpers.cpp
@@ -235,13 +235,13 @@
 
     wgpu::BufferCopyView CreateBufferCopyView(wgpu::Buffer buffer,
                                               uint64_t offset,
-                                              uint32_t rowPitch,
-                                              uint32_t imageHeight) {
+                                              uint32_t bytesPerRow,
+                                              uint32_t rowsPerImage) {
         wgpu::BufferCopyView bufferCopyView;
         bufferCopyView.buffer = buffer;
         bufferCopyView.offset = offset;
-        bufferCopyView.rowPitch = rowPitch;
-        bufferCopyView.imageHeight = imageHeight;
+        bufferCopyView.bytesPerRow = bytesPerRow;
+        bufferCopyView.rowsPerImage = rowsPerImage;
 
         return bufferCopyView;
     }
diff --git a/src/utils/WGPUHelpers.h b/src/utils/WGPUHelpers.h
index eafc45c..b8c48fb 100644
--- a/src/utils/WGPUHelpers.h
+++ b/src/utils/WGPUHelpers.h
@@ -48,8 +48,8 @@
 
     wgpu::BufferCopyView CreateBufferCopyView(wgpu::Buffer buffer,
                                               uint64_t offset,
-                                              uint32_t rowPitch,
-                                              uint32_t imageHeight);
+                                              uint32_t bytesPerRow,
+                                              uint32_t rowsPerImage);
     wgpu::TextureCopyView CreateTextureCopyView(wgpu::Texture texture,
                                                 uint32_t level,
                                                 uint32_t slice,