diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index a2802001d8..207c3d12f3 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -1096,11 +1096,15 @@ bool CommandQueue::blitEnqueueAllowed(const CsrSelectionArgs &args) const { case CL_COMMAND_SVM_UNMAP: return true; case CL_COMMAND_READ_IMAGE: + UNRECOVERABLE_IF(args.srcResource.image == nullptr); return blitEnqueueImageAllowed(args.srcResource.imageOrigin, args.size, *args.srcResource.image); case CL_COMMAND_WRITE_IMAGE: + UNRECOVERABLE_IF(args.dstResource.image == nullptr); return blitEnqueueImageAllowed(args.dstResource.imageOrigin, args.size, *args.dstResource.image); case CL_COMMAND_COPY_IMAGE: + UNRECOVERABLE_IF(args.srcResource.image == nullptr); + UNRECOVERABLE_IF(args.dstResource.image == nullptr); return blitEnqueueImageAllowed(args.srcResource.imageOrigin, args.size, *args.srcResource.image) && blitEnqueueImageAllowed(args.dstResource.imageOrigin, args.size, *args.dstResource.image); @@ -1534,7 +1538,7 @@ cl_int CommandQueue::enqueueStagingBufferMemcpy(cl_bool blockingCopy, void *dstP // If there was only one chunk copy, no barrier for OOQ is needed bool isSingleTransfer = false; - auto chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) -> int32_t { + ChunkCopyFunction chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) -> int32_t { auto isFirstTransfer = (chunkDst == dstPtr); auto isLastTransfer = ptrOffset(chunkDst, chunkSize) == ptrOffset(dstPtr, size); isSingleTransfer = isFirstTransfer && isLastTransfer; diff --git a/shared/offline_compiler/source/ocloc_interface.cpp b/shared/offline_compiler/source/ocloc_interface.cpp index 573764e9d0..351de7fc06 100644 --- a/shared/offline_compiler/source/ocloc_interface.cpp +++ b/shared/offline_compiler/source/ocloc_interface.cpp @@ -126,6 +126,7 @@ int compile(OclocArgHelper *argHelper, const std::vector &args) { if (onlySpirV) { int deviceArgIndex = NEO::getDeviceArgValueIdx(args); + UNRECOVERABLE_IF(deviceArgIndex < 0); std::vector targetProducts = NEO::getTargetProductsForFatbinary(ConstStringRef(args[deviceArgIndex]), argHelper); ConstStringRef firstDevice = targetProducts.front(); argsCopy[deviceArgIndex] = firstDevice.str(); diff --git a/shared/source/utilities/staging_buffer_manager.cpp b/shared/source/utilities/staging_buffer_manager.cpp index b921c3dd5a..4975561898 100644 --- a/shared/source/utilities/staging_buffer_manager.cpp +++ b/shared/source/utilities/staging_buffer_manager.cpp @@ -42,7 +42,7 @@ StagingBufferManager::~StagingBufferManager() { * 3. Store used buffer to tracking container (with current task count) * 4. Update tag if required to reuse this buffer in next chunk copies */ -int32_t StagingBufferManager::performChunkCopy(void *chunkDst, const void *chunkSrc, size_t size, ChunkCopyFunction chunkCopyFunc, CommandStreamReceiver *csr) { +int32_t StagingBufferManager::performChunkCopy(void *chunkDst, const void *chunkSrc, size_t size, ChunkCopyFunction &chunkCopyFunc, CommandStreamReceiver *csr) { auto allocatedSize = size; auto [allocator, chunkBuffer] = requestStagingBuffer(allocatedSize, csr); auto ret = chunkCopyFunc(chunkDst, addrToPtr(chunkBuffer), chunkSrc, size); @@ -61,7 +61,7 @@ int32_t StagingBufferManager::performChunkCopy(void *chunkDst, const void *chunk * Each chunk copy contains staging buffer which should be used instead of non-usm memory during transfers on GPU. * Caller provides actual function to transfer data for single chunk. */ -int32_t StagingBufferManager::performCopy(void *dstPtr, const void *srcPtr, size_t size, ChunkCopyFunction chunkCopyFunc, CommandStreamReceiver *csr) { +int32_t StagingBufferManager::performCopy(void *dstPtr, const void *srcPtr, size_t size, ChunkCopyFunction &chunkCopyFunc, CommandStreamReceiver *csr) { auto copiesNum = size / chunkSize; auto remainder = size % chunkSize; diff --git a/shared/source/utilities/staging_buffer_manager.h b/shared/source/utilities/staging_buffer_manager.h index 5f9fc9729f..56344f0329 100644 --- a/shared/source/utilities/staging_buffer_manager.h +++ b/shared/source/utilities/staging_buffer_manager.h @@ -51,9 +51,13 @@ class StagingBufferManager { public: StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map &deviceBitfields); ~StagingBufferManager(); + StagingBufferManager(StagingBufferManager &&other) noexcept = delete; + StagingBufferManager(const StagingBufferManager &other) = delete; + StagingBufferManager &operator=(StagingBufferManager &&other) noexcept = delete; + StagingBufferManager &operator=(const StagingBufferManager &other) = delete; bool isValidForCopy(Device &device, void *dstPtr, const void *srcPtr, size_t size, bool hasDependencies, uint32_t osContextId) const; - int32_t performCopy(void *dstPtr, const void *srcPtr, size_t size, ChunkCopyFunction chunkCopyFunc, CommandStreamReceiver *csr); + int32_t performCopy(void *dstPtr, const void *srcPtr, size_t size, ChunkCopyFunction &chunkCopyFunc, CommandStreamReceiver *csr); private: std::pair requestStagingBuffer(size_t &size, CommandStreamReceiver *csr); @@ -61,7 +65,7 @@ class StagingBufferManager { void *allocateStagingBuffer(); void clearTrackedChunks(CommandStreamReceiver *csr); - int32_t performChunkCopy(void *chunkDst, const void *chunkSrc, size_t size, ChunkCopyFunction chunkCopyFunc, CommandStreamReceiver *csr); + int32_t performChunkCopy(void *chunkDst, const void *chunkSrc, size_t size, ChunkCopyFunction &chunkCopyFunc, CommandStreamReceiver *csr); size_t chunkSize = MemoryConstants::pageSize2M; std::mutex mtx; diff --git a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp index 4421c76be3..df6ed1706c 100644 --- a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp +++ b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp @@ -55,7 +55,7 @@ class StagingBufferManagerFixture : public DeviceFixture { memset(usmBuffer, 0, copySize); memset(nonUsmBuffer, 0xFF, copySize); - auto chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { + ChunkCopyFunction chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { chunkCounter++; memcpy(stagingBuffer, chunkSrc, chunkSize); memcpy(chunkDst, stagingBuffer, chunkSize); @@ -181,7 +181,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenFailedChunkCopyThenEarlyR memset(usmBuffer, 0, totalCopySize); memset(nonUsmBuffer, 0xFF, totalCopySize); - auto chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { + ChunkCopyFunction chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { chunkCounter++; memcpy(stagingBuffer, chunkSrc, chunkSize); memcpy(chunkDst, stagingBuffer, chunkSize); @@ -211,7 +211,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenFailedRemainderCopyThenRe memset(usmBuffer, 0, totalCopySize); memset(nonUsmBuffer, 0xFF, totalCopySize); - auto chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { + ChunkCopyFunction chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { chunkCounter++; memcpy(stagingBuffer, chunkSrc, chunkSize); memcpy(chunkDst, stagingBuffer, chunkSize); @@ -256,7 +256,7 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenDirectSubmissionEnabled auto nonUsmBuffer = new unsigned char[totalCopySize]; size_t flushTagsCalled = 0; - auto chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { + ChunkCopyFunction chunkCopy = [&](void *chunkDst, void *stagingBuffer, const void *chunkSrc, size_t chunkSize) { if (ultCsr->flushTagUpdateCalled) { flushTagsCalled++; ultCsr->flushTagUpdateCalled = false; @@ -272,4 +272,4 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenDirectSubmissionEnabled EXPECT_EQ(flushTagsCalled, numOfChunkCopies); svmAllocsManager->freeSVMAlloc(usmBuffer); delete[] nonUsmBuffer; -} \ No newline at end of file +}