Ensure that builtin kernel is patched and can't transform images

Related-To: NEO-3691
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2021-06-17 12:06:57 +00:00
committed by Compute-Runtime-Automation
parent e4c30d7b9b
commit 2ab961be49
5 changed files with 50 additions and 6 deletions

View File

@ -137,6 +137,7 @@ class CommandComputeKernel : public Command {
CompletionStamp &submit(uint32_t taskLevel, bool terminated) override;
LinearStream *getCommandStream() override { return kernelOperation->commandStream.get(); }
Kernel *peekKernel() const { return kernel; }
protected:
std::vector<Surface *> surfaces;

View File

@ -765,6 +765,14 @@ void Kernel::resizeSurfaceStateHeap(void *pNewSsh, size_t newSshSize, size_t new
localBindingTableOffset = newBindingTableOffset;
}
void Kernel::markArgPatchedAndResolveArgs(uint32_t argIndex) {
if (!kernelArguments[argIndex].isPatched) {
patchedArgumentsNum++;
kernelArguments[argIndex].isPatched = true;
}
resolveArgs();
}
cl_int Kernel::setArg(uint32_t argIndex, size_t argSize, const void *argVal) {
cl_int retVal = CL_SUCCESS;
bool updateExposedKernel = true;
@ -781,13 +789,9 @@ cl_int Kernel::setArg(uint32_t argIndex, size_t argSize, const void *argVal) {
retVal = (this->*argHandler)(argIndex, argSize, argVal);
}
if (retVal == CL_SUCCESS) {
if (!kernelArguments[argIndex].isPatched) {
patchedArgumentsNum++;
kernelArguments[argIndex].isPatched = true;
}
auto argIsUncacheable = kernelArguments[argIndex].isStatelessUncacheable;
statelessUncacheableArgsCount += (argIsUncacheable ? 1 : 0) - (argWasUncacheable ? 1 : 0);
resolveArgs();
markArgPatchedAndResolveArgs(argIndex);
}
return retVal;
}
@ -805,7 +809,11 @@ cl_int Kernel::setArg(uint32_t argIndex, cl_mem argVal) {
}
cl_int Kernel::setArg(uint32_t argIndex, cl_mem argVal, uint32_t mipLevel) {
return setArgImageWithMipLevel(argIndex, sizeof(argVal), &argVal, mipLevel);
auto retVal = setArgImageWithMipLevel(argIndex, sizeof(argVal), &argVal, mipLevel);
if (retVal == CL_SUCCESS) {
markArgPatchedAndResolveArgs(argIndex);
}
return retVal;
}
void *Kernel::patchBufferOffset(const ArgDescPointer &argAsPtr, void *svmPtr, GraphicsAllocation *svmAlloc) {

View File

@ -506,6 +506,7 @@ class Kernel : public ReferenceTrackedObject<Kernel> {
void patchBlocksCurbeWithConstantValues();
void markArgPatchedAndResolveArgs(uint32_t argIndex);
void resolveArgs();
void reconfigureKernel();

View File

@ -66,6 +66,32 @@ HWTEST_F(EnqueueReadImageTest, GivenBlockingEnqueueWhenReadingImageThenTaskLevel
EXPECT_EQ(oldCsrTaskLevel, pCmdQ->taskLevel);
}
HWTEST_F(EnqueueReadImageTest, whenEnqueueReadImageThenBuiltinKernelIsResolved) {
UserEvent userEvent{};
cl_event inputEvent = &userEvent;
cl_event outputEvent{};
EnqueueReadImageHelper<>::enqueueReadImage(pCmdQ, srcImage, CL_FALSE,
EnqueueReadImageTraits::origin,
EnqueueReadImageTraits::region,
EnqueueReadImageTraits::rowPitch,
EnqueueReadImageTraits::slicePitch,
EnqueueReadImageTraits::hostPtr,
EnqueueReadImageTraits::mapAllocation,
1u,
&inputEvent,
&outputEvent);
auto pEvent = castToObject<Event>(outputEvent);
auto pCommand = static_cast<CommandComputeKernel *>(pEvent->peekCommand());
EXPECT_FALSE(pCommand->peekKernel()->Kernel::canTransformImages());
EXPECT_TRUE(pCommand->peekKernel()->isPatched());
userEvent.setStatus(CL_COMPLETE);
pEvent->release();
pCmdQ->finish();
}
HWTEST_F(EnqueueReadImageTest, GivenNonBlockingEnqueueWhenReadingImageThenTaskLevelIsIncremented) {
//this test case assumes IOQ
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();

View File

@ -157,6 +157,14 @@ TEST_F(KernelImageArgTest, givenImageWithWriteOnlyAccessAndReadOnlyArgWhenCheckC
EXPECT_EQ(retVal, CL_INVALID_ARG_INDEX);
}
TEST_F(KernelImageArgTest, givenInvalidImageWhenSettingArgImageThenInvalidArgValueErrorIsReturned) {
cl_mem memObj = reinterpret_cast<cl_mem>(pKernel);
retVal = pKernel->setArg(0, memObj, 0u);
EXPECT_EQ(retVal, CL_INVALID_ARG_VALUE);
}
TEST_F(KernelImageArgTest, givenImageWithReadOnlyAccessAndWriteOnlyArgWhenCheckCorrectImageAccessQualifierIsCalledThenReturnsInvalidArgValue) {
cl_image_format imgFormat = {CL_RGBA, CL_UNORM_INT8};
cl_image_desc imgDesc = {};