mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
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:

committed by
Compute-Runtime-Automation

parent
e4c30d7b9b
commit
2ab961be49
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -506,6 +506,7 @@ class Kernel : public ReferenceTrackedObject<Kernel> {
|
||||
|
||||
void patchBlocksCurbeWithConstantValues();
|
||||
|
||||
void markArgPatchedAndResolveArgs(uint32_t argIndex);
|
||||
void resolveArgs();
|
||||
|
||||
void reconfigureKernel();
|
||||
|
@ -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>();
|
||||
|
@ -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 = {};
|
||||
|
Reference in New Issue
Block a user