diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index 16ef8be1b0..9d35af87ee 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -618,7 +618,7 @@ bool CommandQueue::blitEnqueueAllowed(cl_command_type cmdType) const { bool commandAllowed = (CL_COMMAND_READ_BUFFER == cmdType) || (CL_COMMAND_WRITE_BUFFER == cmdType) || (CL_COMMAND_COPY_BUFFER == cmdType) || (CL_COMMAND_READ_BUFFER_RECT == cmdType) || - (CL_COMMAND_WRITE_BUFFER_RECT == cmdType); + (CL_COMMAND_WRITE_BUFFER_RECT == cmdType) || (CL_COMMAND_COPY_BUFFER_RECT == cmdType); return commandAllowed && blitAllowed; } diff --git a/opencl/source/helpers/cl_blit_properties.h b/opencl/source/helpers/cl_blit_properties.h index b2841be2d4..794db361d5 100644 --- a/opencl/source/helpers/cl_blit_properties.h +++ b/opencl/source/helpers/cl_blit_properties.h @@ -25,7 +25,11 @@ struct ClBlitProperties { return BlitProperties::constructPropertiesForCopyBuffer(builtinOpParams.dstMemObj->getGraphicsAllocation(), builtinOpParams.srcMemObj->getGraphicsAllocation(), - dstOffset, srcOffset, builtinOpParams.size.x); + {dstOffset, builtinOpParams.dstOffset.y, builtinOpParams.dstOffset.z}, + {srcOffset, builtinOpParams.srcOffset.y, builtinOpParams.srcOffset.z}, + builtinOpParams.size, + builtinOpParams.srcRowPitch, builtinOpParams.srcSlicePitch, + builtinOpParams.dstRowPitch, builtinOpParams.dstSlicePitch); } GraphicsAllocation *gpuAllocation = nullptr; @@ -109,6 +113,8 @@ struct ClBlitProperties { return BlitterConstants::BlitDirection::HostPtrToBuffer; } else if (CL_COMMAND_READ_BUFFER == commandType || CL_COMMAND_READ_BUFFER_RECT == commandType) { return BlitterConstants::BlitDirection::BufferToHostPtr; + } else if (CL_COMMAND_COPY_BUFFER_RECT == commandType) { + return BlitterConstants::BlitDirection::BufferToBuffer; } else { UNRECOVERABLE_IF(CL_COMMAND_COPY_BUFFER != commandType); return BlitterConstants::BlitDirection::BufferToBuffer; diff --git a/opencl/test/unit_test/command_stream/aub_command_stream_receiver_1_tests.cpp b/opencl/test/unit_test/command_stream/aub_command_stream_receiver_1_tests.cpp index 0981a6c894..36feee0f6b 100644 --- a/opencl/test/unit_test/command_stream/aub_command_stream_receiver_1_tests.cpp +++ b/opencl/test/unit_test/command_stream/aub_command_stream_receiver_1_tests.cpp @@ -1164,7 +1164,7 @@ HWTEST_F(AubCommandStreamReceiverTests, WhenBlitBufferIsCalledThenCounterIsCorre EXPECT_EQ(0u, aubCsr->blitBufferCalled); MockGraphicsAllocation allocation(reinterpret_cast(0x1000), 0); - BlitProperties blitProperties = BlitProperties::constructPropertiesForCopyBuffer(&allocation, &allocation, 0, 0, 0); + BlitProperties blitProperties = BlitProperties::constructPropertiesForCopyBuffer(&allocation, &allocation, 0, 0, 0, 0, 0, 0, 0); BlitPropertiesContainer blitPropertiesContainer; blitPropertiesContainer.push_back(blitProperties); aubCsr->blitBuffer(blitPropertiesContainer, true); diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp index e2ec40720d..634e39628b 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_tests.cpp @@ -784,6 +784,80 @@ HWTEST_P(BcsDetaliedTestsWithParams, givenBltSizeWithLeftoverWhenDispatchedThenP } } +HWTEST_P(BcsDetaliedTestsWithParams, givenBltSizeWithLeftoverWhenDispatchedThenProgramAllRequiredCommandsForCopyBufferRect) { + auto &csr = pDevice->getUltCommandStreamReceiver(); + static_cast(csr.getMemoryManager())->turnOnFakingBigAllocations(); + + uint32_t bltLeftover = 17; + Vec3 bltSize = std::get<0>(GetParam()).copySize; + + size_t numberOfBltsForSingleBltSizeProgramm = 3; + size_t totalNumberOfBits = numberOfBltsForSingleBltSizeProgramm * bltSize.y * bltSize.z; + + cl_int retVal = CL_SUCCESS; + + auto buffer1 = clUniquePtr(Buffer::create(context.get(), CL_MEM_READ_WRITE, static_cast(8 * BlitterConstants::maxBlitWidth * BlitterConstants::maxBlitHeight), nullptr, retVal)); + + Vec3 buffer1Offset = std::get<0>(GetParam()).hostPtrOffset; + Vec3 buffer2Offset = std::get<0>(GetParam()).copyOffset; + + size_t buffer1RowPitch = std::get<0>(GetParam()).dstRowPitch; + size_t buffer1SlicePitch = std::get<0>(GetParam()).dstSlicePitch; + size_t buffer2RowPitch = std::get<0>(GetParam()).srcRowPitch; + size_t buffer2SlicePitch = std::get<0>(GetParam()).srcSlicePitch; + + auto blitProperties = BlitProperties::constructPropertiesForCopyBuffer(buffer1->getGraphicsAllocation(), //dstAllocation + buffer1->getGraphicsAllocation(), //srcAllocation + buffer1Offset, //dstOffset + buffer2Offset, //srcOffset + bltSize, //copySize + buffer1RowPitch, //srcRowPitch + buffer1SlicePitch, //srcSlicePitch + buffer2RowPitch, //dstRowPitch + buffer2SlicePitch //dstSlicePitch + ); + blitBuffer(&csr, blitProperties, true); + + HardwareParse hwParser; + hwParser.parseCommands(csr.commandStream); + auto &cmdList = hwParser.cmdList; + + auto cmdIterator = cmdList.begin(); + + uint64_t offset = 0; + for (uint32_t i = 0; i < totalNumberOfBits; i++) { + auto bltCmd = genCmdCast(*(cmdIterator++)); + EXPECT_NE(nullptr, bltCmd); + + uint32_t expectedWidth = static_cast(BlitterConstants::maxBlitWidth); + uint32_t expectedHeight = static_cast(BlitterConstants::maxBlitHeight); + if (i % numberOfBltsForSingleBltSizeProgramm == numberOfBltsForSingleBltSizeProgramm - 1) { + expectedWidth = bltLeftover; + expectedHeight = 1; + } + + if (i % numberOfBltsForSingleBltSizeProgramm == 0) { + offset = 0; + } + + EXPECT_EQ(expectedWidth, bltCmd->getTransferWidth()); + EXPECT_EQ(expectedHeight, bltCmd->getTransferHeight()); + EXPECT_EQ(expectedWidth, bltCmd->getDestinationPitch()); + EXPECT_EQ(expectedWidth, bltCmd->getSourcePitch()); + + auto rowIndex = (i / numberOfBltsForSingleBltSizeProgramm) % blitProperties.copySize.y; + auto sliceIndex = i / (numberOfBltsForSingleBltSizeProgramm * blitProperties.copySize.y); + + auto dstAddr = NEO::BlitCommandsHelper::calculateBlitCommandDestinationBaseAddress(blitProperties, offset, rowIndex, sliceIndex); + auto srcAddr = NEO::BlitCommandsHelper::calculateBlitCommandSourceBaseAddress(blitProperties, offset, rowIndex, sliceIndex); + + EXPECT_EQ(dstAddr, bltCmd->getDestinationBaseAddress()); + EXPECT_EQ(srcAddr, bltCmd->getSourceBaseAddress()); + + offset += (expectedWidth * expectedHeight); + } +} + INSTANTIATE_TEST_CASE_P(BcsDetaliedTest, BcsDetaliedTestsWithParams, ::testing::Combine( @@ -1154,7 +1228,7 @@ HWTEST_F(BcsTests, givenBufferWhenBlitOperationCalledThenProgramCorrectGpuAddres HardwareParse hwParser; auto offset = csr.commandStream.getUsed(); auto blitProperties = BlitProperties::constructPropertiesForCopyBuffer(buffer1->getGraphicsAllocation(), - buffer2->getGraphicsAllocation(), 0, 0, 1); + buffer2->getGraphicsAllocation(), 0, 0, {1, 1, 1}, 0, 0, 0, 0); blitBuffer(&csr, blitProperties, true); @@ -1505,7 +1579,7 @@ HWTEST_F(BcsTests, givenBufferWithOffsetWhenBlitOperationCalledThenProgramCorrec auto offset = csr.commandStream.getUsed(); auto blitProperties = BlitProperties::constructPropertiesForCopyBuffer(buffer1->getGraphicsAllocation(), buffer2->getGraphicsAllocation(), - buffer1Offset, buffer2Offset, 1); + {buffer1Offset, 0, 0}, {buffer2Offset, 0, 0}, {1, 1, 1}, 0, 0, 0, 0); blitBuffer(&csr, blitProperties, true); diff --git a/opencl/test/unit_test/mem_obj/buffer_tests.cpp b/opencl/test/unit_test/mem_obj/buffer_tests.cpp index 987d29a3e6..08bb3f1f64 100644 --- a/opencl/test/unit_test/mem_obj/buffer_tests.cpp +++ b/opencl/test/unit_test/mem_obj/buffer_tests.cpp @@ -794,6 +794,9 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenEnqueueBufferOperationIs commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); DebugManager.flags.EnableBlitterOperationsForReadWriteBuffers.set(1); hwInfo->capabilityTable.blitterOperationsSupported = false; @@ -806,6 +809,9 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenEnqueueBufferOperationIs commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); DebugManager.flags.EnableBlitterOperationsForReadWriteBuffers.set(0); hwInfo->capabilityTable.blitterOperationsSupported = true; @@ -818,6 +824,9 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenEnqueueBufferOperationIs commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); DebugManager.flags.EnableBlitterOperationsForReadWriteBuffers.set(-1); hwInfo->capabilityTable.blitterOperationsSupported = true; @@ -830,25 +839,32 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenEnqueueBufferOperationIs commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); - EXPECT_EQ(5u, bcsCsr->blitBufferCalled); + EXPECT_EQ(6u, bcsCsr->blitBufferCalled); DebugManager.flags.EnableBlitterOperationsForReadWriteBuffers.set(1); hwInfo->capabilityTable.blitterOperationsSupported = true; commandQueue->enqueueWriteBuffer(bufferForBlt0.get(), CL_TRUE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); - EXPECT_EQ(6u, bcsCsr->blitBufferCalled); - commandQueue->enqueueReadBuffer(bufferForBlt0.get(), CL_TRUE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); EXPECT_EQ(7u, bcsCsr->blitBufferCalled); - commandQueue->enqueueCopyBuffer(bufferForBlt0.get(), bufferForBlt1.get(), 0, 1, 1, 0, nullptr, nullptr); + commandQueue->enqueueReadBuffer(bufferForBlt0.get(), CL_TRUE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); EXPECT_EQ(8u, bcsCsr->blitBufferCalled); + commandQueue->enqueueCopyBuffer(bufferForBlt0.get(), bufferForBlt1.get(), 0, 1, 1, 0, nullptr, nullptr); + EXPECT_EQ(9u, bcsCsr->blitBufferCalled); commandQueue->enqueueReadBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); - EXPECT_EQ(9u, bcsCsr->blitBufferCalled); + EXPECT_EQ(10u, bcsCsr->blitBufferCalled); commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_TRUE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); - EXPECT_EQ(10u, bcsCsr->blitBufferCalled); + EXPECT_EQ(11u, bcsCsr->blitBufferCalled); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); + EXPECT_EQ(12u, bcsCsr->blitBufferCalled); } HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenQueueIsBlockedThenDispatchBlitWhenUnblocked) { @@ -874,26 +890,33 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBcsSupportedWhenQueueIsBlockedThenDispat commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_FALSE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); EXPECT_EQ(0u, bcsCsr->blitBufferCalled); userEvent.setStatus(CL_COMPLETE); - EXPECT_EQ(5u, bcsCsr->blitBufferCalled); + EXPECT_EQ(6u, bcsCsr->blitBufferCalled); commandQueue->enqueueWriteBuffer(bufferForBlt0.get(), CL_FALSE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); - EXPECT_EQ(6u, bcsCsr->blitBufferCalled); - commandQueue->enqueueReadBuffer(bufferForBlt0.get(), CL_FALSE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); EXPECT_EQ(7u, bcsCsr->blitBufferCalled); - commandQueue->enqueueCopyBuffer(bufferForBlt0.get(), bufferForBlt1.get(), 0, 1, 1, 0, nullptr, nullptr); + commandQueue->enqueueReadBuffer(bufferForBlt0.get(), CL_FALSE, 0, 1, &hostPtr, nullptr, 0, nullptr, nullptr); EXPECT_EQ(8u, bcsCsr->blitBufferCalled); + commandQueue->enqueueCopyBuffer(bufferForBlt0.get(), bufferForBlt1.get(), 0, 1, 1, 0, nullptr, nullptr); + EXPECT_EQ(9u, bcsCsr->blitBufferCalled); commandQueue->enqueueReadBufferRect(bufferForBlt0.get(), CL_FALSE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); - EXPECT_EQ(9u, bcsCsr->blitBufferCalled); + EXPECT_EQ(10u, bcsCsr->blitBufferCalled); commandQueue->enqueueWriteBufferRect(bufferForBlt0.get(), CL_FALSE, bufferOrigin, hostOrigin, region, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, &hostPtr, 0, nullptr, nullptr); + EXPECT_EQ(11u, bcsCsr->blitBufferCalled); + commandQueue->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, MemoryConstants::cacheLineSize, + MemoryConstants::cacheLineSize, 0, nullptr, nullptr); } HWTEST_TEMPLATED_F(BcsBufferTests, givenBuffersWhenCopyBufferCalledThenUseBcs) { @@ -917,6 +940,31 @@ HWTEST_TEMPLATED_F(BcsBufferTests, givenBuffersWhenCopyBufferCalledThenUseBcs) { EXPECT_EQ(bufferForBlt1->getGraphicsAllocation()->getGpuAddress(), copyBltCmd->getDestinationBaseAddress()); } +HWTEST_TEMPLATED_F(BcsBufferTests, givenBuffersWhenCopyBufferRectCalledThenUseBcs) { + using XY_COPY_BLT = typename FamilyType::XY_COPY_BLT; + auto cmdQ = clUniquePtr(new MockCommandQueueHw(bcsMockContext.get(), device.get(), nullptr)); + + auto bufferForBlt0 = clUniquePtr(Buffer::create(bcsMockContext.get(), CL_MEM_READ_WRITE, 1, nullptr, retVal)); + auto bufferForBlt1 = clUniquePtr(Buffer::create(bcsMockContext.get(), CL_MEM_READ_WRITE, 1, nullptr, retVal)); + bufferForBlt0->forceDisallowCPUCopy = true; + bufferForBlt1->forceDisallowCPUCopy = true; + + size_t bufferOrigin[] = {0, 0, 0}; + size_t hostOrigin[] = {0, 0, 0}; + size_t region[] = {1, 2, 1}; + + cmdQ->enqueueCopyBufferRect(bufferForBlt0.get(), bufferForBlt1.get(), bufferOrigin, hostOrigin, region, + 0, 0, 0, 0, 0, nullptr, nullptr); + HardwareParse hwParser; + hwParser.parseCommands(commandQueue->getBcsCommandStreamReceiver()->getCS(0)); + auto commandItor = find(hwParser.cmdList.begin(), hwParser.cmdList.end()); + EXPECT_NE(hwParser.cmdList.end(), commandItor); + auto copyBltCmd = genCmdCast(*commandItor); + + EXPECT_EQ(bufferForBlt0->getGraphicsAllocation()->getGpuAddress(), copyBltCmd->getSourceBaseAddress()); + EXPECT_EQ(bufferForBlt1->getGraphicsAllocation()->getGpuAddress(), copyBltCmd->getDestinationBaseAddress()); +} + HWTEST_TEMPLATED_F(BcsBufferTests, givenBlockedBlitEnqueueWhenUnblockingThenMakeResidentAllTimestampPackets) { auto bcsCsr = static_cast *>(commandQueue->getBcsCommandStreamReceiver()); bcsCsr->storeMakeResidentAllocations = true; diff --git a/shared/source/helpers/blit_commands_helper.cpp b/shared/source/helpers/blit_commands_helper.cpp index ef8ad7ef4c..b40bc91a92 100644 --- a/shared/source/helpers/blit_commands_helper.cpp +++ b/shared/source/helpers/blit_commands_helper.cpp @@ -75,7 +75,11 @@ BlitProperties BlitProperties::constructPropertiesForReadWriteBuffer(BlitterCons } BlitProperties BlitProperties::constructPropertiesForCopyBuffer(GraphicsAllocation *dstAllocation, GraphicsAllocation *srcAllocation, - size_t dstOffset, size_t srcOffset, size_t copySize) { + Vec3 dstOffset, Vec3 srcOffset, Vec3 copySize, + size_t srcRowPitch, size_t srcSlicePitch, + size_t dstRowPitch, size_t dstSlicePitch) { + copySize.y = copySize.y ? copySize.y : 1; + copySize.z = copySize.z ? copySize.z : 1; return { nullptr, // outputTimestampPacket @@ -86,9 +90,13 @@ BlitProperties BlitProperties::constructPropertiesForCopyBuffer(GraphicsAllocati srcAllocation, // srcAllocation dstAllocation->getGpuAddress(), // dstGpuAddress srcAllocation->getGpuAddress(), // srcGpuAddress - {copySize, 1, 1}, // copySize - {dstOffset, 0, 0}, // dstOffset - {srcOffset, 0, 0}}; // srcOffset + copySize, // copySize + dstOffset, // dstOffset + srcOffset, // srcOffset + dstRowPitch, // dstRowPitch + dstSlicePitch, // dstSlicePitch + srcRowPitch, // srcRowPitch + srcSlicePitch}; // srcSlicePitch } BlitProperties BlitProperties::constructPropertiesForAuxTranslation(AuxTranslationDirection auxTranslationDirection, diff --git a/shared/source/helpers/blit_commands_helper.h b/shared/source/helpers/blit_commands_helper.h index 871d5b9a27..4c60f26481 100644 --- a/shared/source/helpers/blit_commands_helper.h +++ b/shared/source/helpers/blit_commands_helper.h @@ -41,7 +41,9 @@ struct BlitProperties { size_t gpuRowPitch, size_t gpuSlicePitch); static BlitProperties constructPropertiesForCopyBuffer(GraphicsAllocation *dstAllocation, GraphicsAllocation *srcAllocation, - size_t dstOffset, size_t srcOffset, size_t copySize); + Vec3 dstOffset, Vec3 srcOffset, Vec3 copySize, + size_t srcRowPitch, size_t srcSlicePitch, + size_t dstRowPitch, size_t dstSlicePitch); static BlitProperties constructPropertiesForAuxTranslation(AuxTranslationDirection auxTranslationDirection, GraphicsAllocation *allocation);