From 722f693e0f37ef8ec16253557a02e5eb59696b6b Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Fri, 2 Apr 2021 13:00:33 +0000 Subject: [PATCH] Set Context in program when using builtins Signed-off-by: Mateusz Jablonski --- .../built_ins/builtins_dispatch_builder.cpp | 14 ++++++++--- .../built_ins/builtins_dispatch_builder.h | 4 ++-- opencl/source/command_queue/enqueue_common.h | 4 ++-- .../enqueue_copy_buffer_to_image.h | 2 +- .../source/command_queue/enqueue_copy_image.h | 2 +- .../enqueue_copy_image_to_buffer.h | 2 +- .../command_queue/enqueue_fill_buffer.h | 2 +- .../source/command_queue/enqueue_fill_image.h | 2 +- opencl/source/command_queue/enqueue_svm.h | 4 ++-- opencl/source/program/program.h | 4 ++++ .../unit_test/built_ins/built_in_tests.cpp | 23 +++++++++++++++---- 11 files changed, 44 insertions(+), 19 deletions(-) diff --git a/opencl/source/built_ins/builtins_dispatch_builder.cpp b/opencl/source/built_ins/builtins_dispatch_builder.cpp index 67fc115072..03c69fd474 100644 --- a/opencl/source/built_ins/builtins_dispatch_builder.cpp +++ b/opencl/source/built_ins/builtins_dispatch_builder.cpp @@ -780,19 +780,27 @@ BuiltinDispatchInfoBuilder &BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuil return *operationBuilder.first; } -BuiltInOwnershipWrapper::BuiltInOwnershipWrapper(BuiltinDispatchInfoBuilder &inputBuilder) { - takeOwnership(inputBuilder); +BuiltInOwnershipWrapper::BuiltInOwnershipWrapper(BuiltinDispatchInfoBuilder &inputBuilder, Context *context) { + takeOwnership(inputBuilder, context); } BuiltInOwnershipWrapper::~BuiltInOwnershipWrapper() { if (builder) { for (auto &kernel : builder->peekUsedKernels()) { kernel->releaseOwnership(); } + if (!builder->peekUsedKernels().empty()) { + builder->peekUsedKernels()[0]->getProgram()->setContext(nullptr); + builder->peekUsedKernels()[0]->getProgram()->releaseOwnership(); + } } } -void BuiltInOwnershipWrapper::takeOwnership(BuiltinDispatchInfoBuilder &inputBuilder) { +void BuiltInOwnershipWrapper::takeOwnership(BuiltinDispatchInfoBuilder &inputBuilder, Context *context) { UNRECOVERABLE_IF(builder); builder = &inputBuilder; + if (!builder->peekUsedKernels().empty()) { + builder->peekUsedKernels()[0]->getProgram()->takeOwnership(); + builder->peekUsedKernels()[0]->getProgram()->setContext(context); + } for (auto &kernel : builder->peekUsedKernels()) { kernel->takeOwnership(); } diff --git a/opencl/source/built_ins/builtins_dispatch_builder.h b/opencl/source/built_ins/builtins_dispatch_builder.h index 29ec1ec671..8e31762331 100644 --- a/opencl/source/built_ins/builtins_dispatch_builder.h +++ b/opencl/source/built_ins/builtins_dispatch_builder.h @@ -118,10 +118,10 @@ class BuiltInDispatchBuilderOp { class BuiltInOwnershipWrapper : public NonCopyableOrMovableClass { public: BuiltInOwnershipWrapper() = default; - BuiltInOwnershipWrapper(BuiltinDispatchInfoBuilder &inputBuilder); + BuiltInOwnershipWrapper(BuiltinDispatchInfoBuilder &inputBuilder, Context *context); ~BuiltInOwnershipWrapper(); - void takeOwnership(BuiltinDispatchInfoBuilder &inputBuilder); + void takeOwnership(BuiltinDispatchInfoBuilder &inputBuilder, Context *context); protected: BuiltinDispatchInfoBuilder *builder = nullptr; diff --git a/opencl/source/command_queue/enqueue_common.h b/opencl/source/command_queue/enqueue_common.h index 59c832e752..629f7b23aa 100644 --- a/opencl/source/command_queue/enqueue_common.h +++ b/opencl/source/command_queue/enqueue_common.h @@ -80,7 +80,7 @@ void CommandQueueHw::enqueueHandler(Surface *(&surfaces)[surfaceCount if (AuxTranslationMode::Builtin == auxTranslationMode) { auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(EBuiltInOps::AuxTranslation, getClDevice()); - builtInLock.takeOwnership(builder); + builtInLock.takeOwnership(builder, this->context); dispatchAuxTranslationBuiltin(multiDispatchInfo, AuxTranslationDirection::AuxToNonAux); } @@ -1175,7 +1175,7 @@ void CommandQueueHw::dispatchBcsOrGpgpuEnqueue(MultiDispatchInfo &dis } else { auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(builtInOperation, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); builder.buildDispatchInfos(dispatchInfo); diff --git a/opencl/source/command_queue/enqueue_copy_buffer_to_image.h b/opencl/source/command_queue/enqueue_copy_buffer_to_image.h index 62eed99f27..982c26664c 100644 --- a/opencl/source/command_queue/enqueue_copy_buffer_to_image.h +++ b/opencl/source/command_queue/enqueue_copy_buffer_to_image.h @@ -38,7 +38,7 @@ cl_int CommandQueueHw::enqueueCopyBufferToImage( auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(eBuiltInOpsType, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); MemObjSurface srcBufferSurf(srcBuffer); MemObjSurface dstImgSurf(dstImage); diff --git a/opencl/source/command_queue/enqueue_copy_image.h b/opencl/source/command_queue/enqueue_copy_image.h index 17599392ee..a652879ce8 100644 --- a/opencl/source/command_queue/enqueue_copy_image.h +++ b/opencl/source/command_queue/enqueue_copy_image.h @@ -33,7 +33,7 @@ cl_int CommandQueueHw::enqueueCopyImage( cl_event *event) { auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(EBuiltInOps::CopyImageToImage3d, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); MemObjSurface srcImgSurf(srcImage); MemObjSurface dstImgSurf(dstImage); diff --git a/opencl/source/command_queue/enqueue_copy_image_to_buffer.h b/opencl/source/command_queue/enqueue_copy_image_to_buffer.h index befeff6fe9..0f771f0f4a 100644 --- a/opencl/source/command_queue/enqueue_copy_image_to_buffer.h +++ b/opencl/source/command_queue/enqueue_copy_image_to_buffer.h @@ -37,7 +37,7 @@ cl_int CommandQueueHw::enqueueCopyImageToBuffer( } auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(eBuiltInOpsType, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); MemObjSurface srcImgSurf(srcImage); MemObjSurface dstBufferSurf(dstBuffer); diff --git a/opencl/source/command_queue/enqueue_fill_buffer.h b/opencl/source/command_queue/enqueue_fill_buffer.h index 2742fd51ef..01e2e9f249 100644 --- a/opencl/source/command_queue/enqueue_fill_buffer.h +++ b/opencl/source/command_queue/enqueue_fill_buffer.h @@ -61,7 +61,7 @@ cl_int CommandQueueHw::enqueueFillBuffer( auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(eBuiltInOps, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); BuiltinOpParams dc; auto multiGraphicsAllocation = MultiGraphicsAllocation(getDevice().getRootDeviceIndex()); diff --git a/opencl/source/command_queue/enqueue_fill_image.h b/opencl/source/command_queue/enqueue_fill_image.h index da2cf24dd8..cb50fdc847 100644 --- a/opencl/source/command_queue/enqueue_fill_image.h +++ b/opencl/source/command_queue/enqueue_fill_image.h @@ -31,7 +31,7 @@ cl_int CommandQueueHw::enqueueFillImage( cl_event *event) { auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(EBuiltInOps::FillImage3d, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); MemObjSurface dstImgSurf(image); Surface *surfaces[] = {&dstImgSurf}; diff --git a/opencl/source/command_queue/enqueue_svm.h b/opencl/source/command_queue/enqueue_svm.h index a8b9a0f2c9..490fd6e761 100644 --- a/opencl/source/command_queue/enqueue_svm.h +++ b/opencl/source/command_queue/enqueue_svm.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -461,7 +461,7 @@ cl_int CommandQueueHw::enqueueSVMMemFill(void *svmPtr, auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(builtInType, this->getClDevice()); - BuiltInOwnershipWrapper builtInLock(builder); + BuiltInOwnershipWrapper builtInLock(builder, this->context); BuiltinOpParams operationParams; auto multiGraphicsAllocation = MultiGraphicsAllocation(getDevice().getRootDeviceIndex()); diff --git a/opencl/source/program/program.h b/opencl/source/program/program.h index 4e2750b808..8a99d21928 100644 --- a/opencl/source/program/program.h +++ b/opencl/source/program/program.h @@ -277,6 +277,10 @@ class Program : public BaseObject<_cl_program> { const ExecutionEnvironment &getExecutionEnvironment() const { return executionEnvironment; } + void setContext(Context *pContext) { + this->context = pContext; + } + protected: MOCKABLE_VIRTUAL cl_int createProgramFromBinary(const void *pBinary, size_t binarySize, ClDevice &clDevice); diff --git a/opencl/test/unit_test/built_ins/built_in_tests.cpp b/opencl/test/unit_test/built_ins/built_in_tests.cpp index 95fa06ba1e..d5c8ec4db2 100644 --- a/opencl/test/unit_test/built_ins/built_in_tests.cpp +++ b/opencl/test/unit_test/built_ins/built_in_tests.cpp @@ -2172,30 +2172,43 @@ using BuiltInOwnershipWrapperTests = BuiltInTests; TEST_F(BuiltInOwnershipWrapperTests, givenBuiltinWhenConstructedThenLockAndUnlockOnDestruction) { MockAuxBuilInOp mockAuxBuiltInOp(*pBuiltIns, *pClDevice); + MockContext context(pClDevice); { - BuiltInOwnershipWrapper lock(mockAuxBuiltInOp); + EXPECT_EQ(nullptr, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); + BuiltInOwnershipWrapper lock(mockAuxBuiltInOp, &context); EXPECT_TRUE(mockAuxBuiltInOp.baseKernel->getMultiDeviceKernel()->hasOwnership()); + EXPECT_TRUE(mockAuxBuiltInOp.baseKernel->getProgram()->hasOwnership()); + EXPECT_EQ(&context, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); } EXPECT_FALSE(mockAuxBuiltInOp.baseKernel->getMultiDeviceKernel()->hasOwnership()); + EXPECT_FALSE(mockAuxBuiltInOp.baseKernel->getProgram()->hasOwnership()); + EXPECT_EQ(nullptr, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); } TEST_F(BuiltInOwnershipWrapperTests, givenLockWithoutParametersWhenConstructingThenLockOnlyWhenRequested) { MockAuxBuilInOp mockAuxBuiltInOp(*pBuiltIns, *pClDevice); + MockContext context(pClDevice); { BuiltInOwnershipWrapper lock; - lock.takeOwnership(mockAuxBuiltInOp); + EXPECT_EQ(nullptr, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); + lock.takeOwnership(mockAuxBuiltInOp, &context); EXPECT_TRUE(mockAuxBuiltInOp.baseKernel->getMultiDeviceKernel()->hasOwnership()); + EXPECT_TRUE(mockAuxBuiltInOp.baseKernel->getProgram()->hasOwnership()); + EXPECT_EQ(&context, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); } EXPECT_FALSE(mockAuxBuiltInOp.baseKernel->getMultiDeviceKernel()->hasOwnership()); + EXPECT_FALSE(mockAuxBuiltInOp.baseKernel->getProgram()->hasOwnership()); + EXPECT_EQ(nullptr, mockAuxBuiltInOp.baseKernel->getProgram()->getContextPtr()); } TEST_F(BuiltInOwnershipWrapperTests, givenLockWithAcquiredOwnershipWhenTakeOwnershipCalledThenAbort) { MockAuxBuilInOp mockAuxBuiltInOp1(*pBuiltIns, *pClDevice); MockAuxBuilInOp mockAuxBuiltInOp2(*pBuiltIns, *pClDevice); + MockContext context(pClDevice); - BuiltInOwnershipWrapper lock(mockAuxBuiltInOp1); - EXPECT_THROW(lock.takeOwnership(mockAuxBuiltInOp1), std::exception); - EXPECT_THROW(lock.takeOwnership(mockAuxBuiltInOp2), std::exception); + BuiltInOwnershipWrapper lock(mockAuxBuiltInOp1, &context); + EXPECT_THROW(lock.takeOwnership(mockAuxBuiltInOp1, &context), std::exception); + EXPECT_THROW(lock.takeOwnership(mockAuxBuiltInOp2, &context), std::exception); } HWTEST_F(BuiltInOwnershipWrapperTests, givenBuiltInOwnershipWrapperWhenAskedForTypeTraitsThenDisableCopyConstructorAndOperator) {