diff --git a/projects/clr/rocclr/runtime/device/gpu/gpumemory.cpp b/projects/clr/rocclr/runtime/device/gpu/gpumemory.cpp index ba32590eb4..e70cc0b60b 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gpumemory.cpp +++ b/projects/clr/rocclr/runtime/device/gpu/gpumemory.cpp @@ -923,7 +923,7 @@ Memory::allocMapTarget( // If host memory exists, use it if ((owner()->getHostMem() != NULL) && - (isCacheable() || !isHostMemDirectAccess() || !(mapFlags & CL_MAP_READ))) { + isDirectMap(mapFlags)) { mapAddress = reinterpret_cast
(owner()->getHostMem()); } // If resource is a persistent allocation, we can use it directly @@ -1249,7 +1249,7 @@ Image::allocMapTarget( // If host memory exists, use it if ((owner()->getHostMem() != NULL) && - (isCacheable() || !isHostMemDirectAccess() || !(mapFlags & CL_MAP_READ))) { + isDirectMap(mapFlags)) { useRemoteResource = false; mapAddress = reinterpret_cast(owner()->getHostMem()); amd::Image* amdImage = owner()->asImage(); diff --git a/projects/clr/rocclr/runtime/device/gpu/gpumemory.hpp b/projects/clr/rocclr/runtime/device/gpu/gpumemory.hpp index fbcd63d0d7..3709091a1a 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gpumemory.hpp +++ b/projects/clr/rocclr/runtime/device/gpu/gpumemory.hpp @@ -200,6 +200,15 @@ public: //! Returns the interop resource for this memory object const Memory* parent() const { return parent_; } + //! Returns TRUE if direct map is acceaptable + //! The method detects forced USWC memory on APU and + //! will cause a switch to indirect map for MAP_READ operations + bool isDirectMap(uint mapFlags) + { + return (isCacheable() || (owner()->getMemFlags() & CL_MEM_ALLOC_HOST_PTR) || + !isHostMemDirectAccess() || !(mapFlags & CL_MAP_READ)); + } + protected: //! Decrement map count void decIndMapCount(); diff --git a/projects/clr/rocclr/runtime/device/gpu/gpuvirtual.cpp b/projects/clr/rocclr/runtime/device/gpu/gpuvirtual.cpp index 4e1cb76edf..d4085903d2 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gpuvirtual.cpp +++ b/projects/clr/rocclr/runtime/device/gpu/gpuvirtual.cpp @@ -1091,9 +1091,7 @@ VirtualGPU::submitMapMemory(amd::MapMemoryCommand& vcmd) // If we have host memory, use it if ((memory->owner()->getHostMem() != NULL) && - (memory->isCacheable() || - !memory->isHostMemDirectAccess() || - !(vcmd.mapFlags() & CL_MAP_READ))) { + memory->isDirectMap(vcmd.mapFlags())) { if (!memory->isHostMemDirectAccess()) { // Make sure GPU finished operation before // synchronization with the backing store @@ -1179,9 +1177,7 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd) // We used host memory if ((owner->getHostMem() != NULL) && - (memory->isCacheable() || - !memory->isHostMemDirectAccess() || - !memory->isUnmapRead())) { + memory->isDirectMap(memory->isUnmapRead() ? CL_MAP_READ : 0)) { if (memory->isUnmapWrite()) { // Target is the backing store, so sync owner->signalWrite(NULL);