mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 05:24:02 +08:00
Lock BuiltIn to make appendMemory calls thread safe
Change-Id: I14441595d87ef5b0d31cfd96019d3234d4cf29dd
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
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<BuiltinFunctionsLib> 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<MutexType> obtainUniqueOwnership();
|
||||
|
||||
protected:
|
||||
BuiltinFunctionsLib() = default;
|
||||
|
||||
MutexType ownershipMutex;
|
||||
};
|
||||
|
||||
} // namespace L0
|
||||
|
||||
@@ -16,6 +16,10 @@ std::unique_ptr<BuiltinFunctionsLib> BuiltinFunctionsLib::create(Device *device,
|
||||
return std::unique_ptr<BuiltinFunctionsLib>(new BuiltinFunctionsLibImpl(device, builtins));
|
||||
}
|
||||
|
||||
std::unique_lock<BuiltinFunctionsLib::MutexType> BuiltinFunctionsLib::obtainUniqueOwnership() {
|
||||
return std::unique_lock<BuiltinFunctionsLib::MutexType>(this->ownershipMutex);
|
||||
}
|
||||
|
||||
void BuiltinFunctionsLibImpl::initFunctions() {
|
||||
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
|
||||
const char *builtinName = nullptr;
|
||||
|
||||
@@ -277,6 +277,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
|
||||
uint32_t numWaitEvents,
|
||||
ze_event_handle_t *phWaitEvents) {
|
||||
|
||||
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
|
||||
|
||||
using GfxFamily = typename NEO::GfxFamilyMapper<gfxCoreFamily>::GfxFamily;
|
||||
uintptr_t start = reinterpret_cast<uintptr_t>(dstptr);
|
||||
|
||||
@@ -846,6 +858,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::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<gfxCoreFamily>::appendMemoryFill(void *ptr,
|
||||
size_t srcOffset = 0;
|
||||
NEO::EncodeSurfaceState<GfxFamily>::getSshAlignedPointer(srcPtr, srcOffset);
|
||||
|
||||
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
|
||||
|
||||
Kernel *builtinFunction = nullptr;
|
||||
uint32_t groupSizeX = 1u;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user