diff --git a/level_zero/core/source/builtin/builtin_functions_lib.h b/level_zero/core/source/builtin/builtin_functions_lib.h index 53cf1e2877..ba865243c6 100644 --- a/level_zero/core/source/builtin/builtin_functions_lib.h +++ b/level_zero/core/source/builtin/builtin_functions_lib.h @@ -8,6 +8,7 @@ #pragma once #include +#include namespace NEO { class BuiltIns; @@ -44,6 +45,7 @@ enum class ImageBuiltin : uint32_t { }; struct BuiltinFunctionsLib { + using MutexType = std::mutex; virtual ~BuiltinFunctionsLib() = default; static std::unique_ptr create(Device *device, NEO::BuiltIns *builtins); @@ -54,9 +56,12 @@ struct BuiltinFunctionsLib { virtual void initImageFunctions() = 0; virtual Kernel *getPageFaultFunction() = 0; virtual void initPageFaultFunction() = 0; + MOCKABLE_VIRTUAL std::unique_lock obtainUniqueOwnership(); protected: BuiltinFunctionsLib() = default; + + MutexType ownershipMutex; }; } // namespace L0 diff --git a/level_zero/core/source/builtin/builtin_functions_lib_impl.cpp b/level_zero/core/source/builtin/builtin_functions_lib_impl.cpp index e60258b1b0..e0b1beff8a 100644 --- a/level_zero/core/source/builtin/builtin_functions_lib_impl.cpp +++ b/level_zero/core/source/builtin/builtin_functions_lib_impl.cpp @@ -16,6 +16,10 @@ std::unique_ptr BuiltinFunctionsLib::create(Device *device, return std::unique_ptr(new BuiltinFunctionsLibImpl(device, builtins)); } +std::unique_lock BuiltinFunctionsLib::obtainUniqueOwnership() { + return std::unique_lock(this->ownershipMutex); +} + void BuiltinFunctionsLibImpl::initFunctions() { for (uint32_t builtId = 0; builtId < static_cast(Builtin::COUNT); builtId++) { const char *builtinName = nullptr; diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index ec25689c43..cb8c9aae14 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -277,6 +277,8 @@ ze_result_t CommandListCoreFamily::appendImageCopyFromMemory(ze_i rowPitch, slicePitch, bytesPerPixel, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, imgSize, hEvent); } + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + Kernel *builtinKernel = nullptr; switch (bytesPerPixel) { @@ -391,6 +393,8 @@ ze_result_t CommandListCoreFamily::appendImageCopyToMemory(void * rowPitch, slicePitch, bytesPerPixel, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, imgSize, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, hEvent); } + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + Kernel *builtinKernel = nullptr; switch (bytesPerPixel) { @@ -537,6 +541,8 @@ ze_result_t CommandListCoreFamily::appendImageCopyRegion(ze_image dstRowPitch, dstSlicePitch, bytesPerPixel, {srcRegion.width, srcRegion.height, srcRegion.depth}, srcImgSize, dstImgSize, hEvent); } + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + auto kernel = device->getBuiltinFunctionsLib()->getImageFunction(ImageBuiltin::CopyImageRegion); if (kernel->suggestGroupSize(groupSizeX, groupSizeY, groupSizeZ, &groupSizeX, @@ -603,6 +609,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopyKernelWithGA(v uint32_t elementSize, Builtin builtin) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin); uint32_t groupSizeX = builtinFunction->getImmutableData() @@ -713,6 +721,8 @@ ze_result_t CommandListCoreFamily::appendPageFaultCopy(NEO::Graph NEO::GraphicsAllocation *srcptr, size_t size, bool flushHost) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + auto builtinFunction = device->getBuiltinFunctionsLib()->getPageFaultFunction(); uint32_t groupSizeX = builtinFunction->getImmutableData() @@ -758,6 +768,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopy(void *dstptr, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; uintptr_t start = reinterpret_cast(dstptr); @@ -846,6 +858,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopyRegion(void *d uint32_t srcPitch, uint32_t srcSlicePitch, ze_event_handle_t hSignalEvent) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + size_t dstSize = 0; size_t srcSize = 0; @@ -917,6 +931,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopyKernel3d(NEO:: uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin); uint32_t groupSizeX = srcRegion->width; @@ -975,6 +991,8 @@ ze_result_t CommandListCoreFamily::appendMemoryCopyKernel2d(NEO:: uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) { + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin); uint32_t groupSizeX = srcRegion->width; @@ -1061,6 +1079,8 @@ ze_result_t CommandListCoreFamily::appendMemoryFill(void *ptr, size_t srcOffset = 0; NEO::EncodeSurfaceState::getSshAlignedPointer(srcPtr, srcOffset); + auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership(); + Kernel *builtinFunction = nullptr; uint32_t groupSizeX = 1u;