From 99358dc55a3531fa157a246798957aed254cbda3 Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 6 Jul 2018 15:13:22 -0400 Subject: [PATCH] P4 to Git Change 1577282 by skudchad@skudchad_test2_win_opencl on 2018/07/06 15:02:32 SWDEV-145570 - [HIP] Fix hipMalloc3D ReviewBoardURL = http://ocltc.amd.com/reviews/r/15358/diff/ Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/hip_memory.cpp#36 edit [ROCm/hip commit: f2ea9a1a8b428aefa913ca3e94a2928cdb5aa63a] --- projects/hip/api/hip/hip_memory.cpp | 60 +++++++++++++++++++---------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/projects/hip/api/hip/hip_memory.cpp b/projects/hip/api/hip/hip_memory.cpp index 98c4c50e03..0ad00cea78 100644 --- a/projects/hip/api/hip/hip_memory.cpp +++ b/projects/hip/api/hip/hip_memory.cpp @@ -366,13 +366,13 @@ hipError_t hipMalloc3D(hipPitchedPtr* pitchedDevPtr, hipExtent extent) { hipError_t hipMemset3D(hipPitchedPtr pitchedDevPtr, int value, hipExtent extent) { HIP_INIT_API(pitchedDevPtr, value, &extent); - void *dst = &pitchedDevPtr.ptr; + void *dst = pitchedDevPtr.ptr; size_t sizeBytes = pitchedDevPtr.pitch * extent.height * extent.depth; hip::syncStreams(); amd::HostQueue* queue = hip::getNullStream(); - return ihipMemset(&dst, value, sizeBytes, *queue); + return ihipMemset(dst, value, sizeBytes, *queue); } hipError_t hipArrayCreate(hipArray** array, const HIP_ARRAY_DESCRIPTOR* pAllocateArray) { @@ -1129,9 +1129,9 @@ hipError_t hipMemcpy3D(const struct hipMemcpy3DParms* p) { amd::BufferRect srcRect; amd::BufferRect dstRect; size_t offset = 0; - amd::Memory* src = getMemoryObject(srcPtr, offset); + amd::Memory* srcMemory = getMemoryObject(srcPtr, offset); assert(offset == 0); - amd::Memory* dst = getMemoryObject(dstPtr, offset); + amd::Memory* dstMemory = getMemoryObject(dstPtr, offset); assert(offset == 0); size_t src_slice_pitch = srcPitchInBytes * p->srcHeight; @@ -1147,28 +1147,46 @@ hipError_t hipMemcpy3D(const struct hipMemcpy3DParms* p) { amd::Coord3D srcEnd(srcRect.end_, 1, 1); amd::Coord3D dstEnd(dstRect.end_, 1, 1); - if (!src->asBuffer()->validateRegion(srcStart, srcEnd) || - !dst->asBuffer()->validateRegion(dstStart, dstEnd)) { - return hipErrorInvalidValue; - } - - // Check if regions overlap each other - if ((src->asBuffer() == dst->asBuffer()) && - (std::abs(static_cast(srcOrigin[0]) - static_cast(dstOrigin[0])) < - static_cast(region[0])) && - (std::abs(static_cast(srcOrigin[1]) - static_cast(dstOrigin[1])) < - static_cast(region[1])) && - (std::abs(static_cast(srcOrigin[2]) - static_cast(dstOrigin[2])) < - static_cast(region[2]))) { - return hipErrorUnknown; + hipMemcpyKind kind = p->kind; + + if (kind == hipMemcpyDefault) { + // Determine kind on VA + if (srcMemory == nullptr && dstMemory != nullptr) { + kind = hipMemcpyHostToDevice; + } else if (srcMemory != nullptr && dstMemory == nullptr) { + kind = hipMemcpyDeviceToHost; + } else if (srcMemory != nullptr && dstMemory != nullptr) { + kind = hipMemcpyDeviceToDevice; + } else { + kind = hipMemcpyHostToHost; + } } + amd::Command* command = nullptr; amd::Command::EventWaitList waitList; amd::Coord3D size(region[0], region[1], region[2]); - amd::CopyMemoryCommand* command = - new amd::CopyMemoryCommand(*queue, CL_COMMAND_COPY_BUFFER_RECT, waitList, *src->asBuffer(), - *dst->asBuffer(), srcStart, dstStart, size, srcRect, dstRect); + switch (kind) { + case hipMemcpyDeviceToHost: + command = new amd::ReadMemoryCommand(*queue, CL_COMMAND_READ_BUFFER_RECT, waitList, + *srcMemory->asBuffer(), srcStart, size, dstPtr, srcRect, dstRect); + break; + case hipMemcpyHostToDevice: + command = new amd::WriteMemoryCommand(*queue, CL_COMMAND_WRITE_BUFFER_RECT, waitList, + *dstMemory->asBuffer(), srcStart, size, srcPtr, srcRect, dstRect); + break; + case hipMemcpyDeviceToDevice: + command = new amd::CopyMemoryCommand(*queue, CL_COMMAND_COPY_BUFFER_RECT, waitList, + *srcMemory->asBuffer(),*dstMemory->asBuffer(), srcStart, dstStart, size, + srcRect, dstRect); + break; + case hipMemcpyHostToHost: + memcpy(dstPtr, srcPtr, region[0] * region[1] * region[2]); + return hipSuccess; + default: + assert(!"Shouldn't reach here"); + break; + } if (command == nullptr) { return hipErrorOutOfMemory;