From 0758f1e95b80f0ee16bbcf05ef85ed15ccfdada2 Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 29 Jul 2014 13:52:27 -0400
Subject: [PATCH] P4 to Git Change 1060466 by
skudchad@skudchad_test_win_opencl2 on 2014/07/29 13:45:27
ECR #304775 - Use accelerated copy path for read/writeRect if the host memory has offsets. This avoids re-pinning the memory giving nearly a 100% perf boost for such copies.
ReviewBoardURL = http://ocltc.amd.com/reviews/r/5371/diff/
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#328 edit
---
rocclr/runtime/device/gpu/gpuvirtual.cpp | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/rocclr/runtime/device/gpu/gpuvirtual.cpp b/rocclr/runtime/device/gpu/gpuvirtual.cpp
index 2664676f5e..730c6e744e 100644
--- a/rocclr/runtime/device/gpu/gpuvirtual.cpp
+++ b/rocclr/runtime/device/gpu/gpuvirtual.cpp
@@ -721,11 +721,14 @@ VirtualGPU::submitReadMemory(amd::ReadMemoryCommand& vcmd)
}
}
break;
- case CL_COMMAND_READ_BUFFER_RECT:
- // Runtime can't use accelerated copy if offset isn't 0 for the rect copy
- if ((hostMemory != NULL) && (offset == 0)) {
+ case CL_COMMAND_READ_BUFFER_RECT: {
+ amd::BufferRect hostbufferRect;
+ amd::Coord3D region(0);
+ amd::Coord3D hostOrigin(vcmd.hostRect().start_+ offset);
+ hostbufferRect.create(hostOrigin.c, vcmd.size().c , vcmd.hostRect().rowPitch_, vcmd.hostRect().slicePitch_);
+ if (hostMemory != NULL) {
result = blitMgr().copyBufferRect(*memory, *hostMemory,
- vcmd.bufRect(), vcmd.hostRect(), vcmd.size(),
+ vcmd.bufRect(), hostbufferRect, vcmd.size(),
vcmd.isEntireMemory());
}
else {
@@ -733,6 +736,7 @@ VirtualGPU::submitReadMemory(amd::ReadMemoryCommand& vcmd)
vcmd.destination(), vcmd.bufRect(), vcmd.hostRect(), vcmd.size(),
vcmd.isEntireMemory());
}
+ }
break;
case CL_COMMAND_READ_IMAGE:
if (hostMemory != NULL) {
@@ -826,11 +830,14 @@ VirtualGPU::submitWriteMemory(amd::WriteMemoryCommand& vcmd)
}
}
break;
- case CL_COMMAND_WRITE_BUFFER_RECT:
- // Runtime can't use accelerated copy if offset isn't 0 for the rect copy
+ case CL_COMMAND_WRITE_BUFFER_RECT: {
+ amd::BufferRect hostbufferRect;
+ amd::Coord3D region(0);
+ amd::Coord3D hostOrigin(vcmd.hostRect().start_+ offset);
+ hostbufferRect.create(hostOrigin.c, vcmd.size().c , vcmd.hostRect().rowPitch_, vcmd.hostRect().slicePitch_);
if ((hostMemory != NULL) && (offset == 0)) {
result = blitMgr().copyBufferRect(*hostMemory, *memory,
- vcmd.hostRect(), vcmd.bufRect(), vcmd.size(),
+ hostbufferRect, vcmd.bufRect(), vcmd.size(),
vcmd.isEntireMemory());
}
else {
@@ -838,6 +845,7 @@ VirtualGPU::submitWriteMemory(amd::WriteMemoryCommand& vcmd)
vcmd.hostRect(), vcmd.bufRect(), vcmd.size(),
vcmd.isEntireMemory());
}
+ }
break;
case CL_COMMAND_WRITE_IMAGE:
if (hostMemory != NULL) {