diff --git a/runtime/command_queue/enqueue_map_image.h b/runtime/command_queue/enqueue_map_image.h index cb064e108e..9725d1e4e9 100644 --- a/runtime/command_queue/enqueue_map_image.h +++ b/runtime/command_queue/enqueue_map_image.h @@ -50,10 +50,8 @@ void *CommandQueueHw::enqueueMapImage(cl_mem image, cl_bool blockingM } } - TakeOwnershipWrapper deviceOwnership(*device); - if (pImage->allowTiling() || pImage->peekSharingHandler()) { - + TakeOwnershipWrapper imageOwnership(*pImage); size_t slicePitch = pImage->getHostPtrSlicePitch(); GetInfoHelper retSlice(imageSlicePitch, sizeof(size_t), nullptr); retSlice.set(slicePitch); @@ -93,6 +91,7 @@ void *CommandQueueHw::enqueueMapImage(cl_mem image, cl_bool blockingM } EventBuilder eventBuilder; + TakeOwnershipWrapper deviceOwnership(*device); TakeOwnershipWrapper> queueOwnership(*this); auto taskLevel = getTaskLevelFromWaitList(this->taskLevel, numEventsInWaitList, eventWaitList); @@ -165,7 +164,6 @@ void *CommandQueueHw::enqueueMapImage(cl_mem image, cl_bool blockingM ptrToReturn = ptrOffset(pImage->getHostPtr(), offset); } errcodeRet = CL_SUCCESS; - deviceOwnership.lock(); pImage->setMappedPtr(ptrToReturn); return ptrToReturn; } diff --git a/runtime/mem_obj/mem_obj.h b/runtime/mem_obj/mem_obj.h index 7fcead0550..2e5b532614 100644 --- a/runtime/mem_obj/mem_obj.h +++ b/runtime/mem_obj/mem_obj.h @@ -76,7 +76,7 @@ class MemObj : public BaseObject<_cl_mem> { void *getAllocatedMappedPtr() const; void *getMappedPtr() const; void setMappedPtr(void *mappedPtr); - void setAllocatedMappedPtr(void *allocatedMappedPtr); + MOCKABLE_VIRTUAL void setAllocatedMappedPtr(void *allocatedMappedPtr); size_t getMappedSize() { return mappedSize; } void setMappedSize(size_t size) { mappedSize = size; } size_t getMappedOffset() { return mappedOffset; } diff --git a/unit_tests/command_queue/enqueue_map_image_tests.cpp b/unit_tests/command_queue/enqueue_map_image_tests.cpp index 3a97b1a26c..048bf03256 100644 --- a/unit_tests/command_queue/enqueue_map_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_map_image_tests.cpp @@ -94,6 +94,50 @@ TEST_F(EnqueueMapImageTest, reuseMappedPtrForTiledImg) { EXPECT_EQ(CL_SUCCESS, retVal); } +template +struct mockedImage : public ImageHw { + using ImageHw::ImageHw; + void setAllocatedMappedPtr(void *allocatedMappedPtr) override { + ownershipTaken = this->hasOwnership(); + MemObj::setAllocatedMappedPtr(allocatedMappedPtr); + } + bool ownershipTaken = false; +}; + +HWTEST_F(EnqueueMapImageTest, givenTiledImageWhenMapImageIsCalledThenStorageIsSetWithImageMutexTaken) { + + auto imageFormat = image->getImageFormat(); + auto imageDesc = image->getImageDesc(); + auto graphicsAllocation = image->getGraphicsAllocation(); + auto surfaceFormatInfo = image->getSurfaceFormatInfo(); + + mockedImage mockImage(context, + 0, + 4096u, + nullptr, + imageFormat, + imageDesc, + false, + graphicsAllocation, + true, + true, + 0, + &surfaceFormatInfo, + nullptr); + + mockImage.createFunction = image->createFunction; + + auto mapFlags = CL_MAP_READ; + const size_t origin[3] = {0, 0, 0}; + const size_t region[3] = {0, 0, 0}; + + pCmdQ->enqueueMapImage( + &mockImage, true, mapFlags, origin, + region, nullptr, nullptr, 0, + nullptr, nullptr, retVal); + EXPECT_TRUE(mockImage.ownershipTaken); +} + TEST_F(EnqueueMapImageTest, checkPointer) { auto mapFlags = CL_MAP_READ; const size_t origin[3] = {0, 0, 0};