Improve support for L0 uncached device allocations (2)

Make sure UNCACHED flags are used in stateful paths.

Related-To: NEO-5500

Signed-off-by: Jaime Arteaga <jaime.a.arteaga.molina@intel.com>
This commit is contained in:
Jaime Arteaga 2021-04-10 01:41:54 +00:00 committed by Compute-Runtime-Automation
parent d4823a463a
commit a56b413392
2 changed files with 23 additions and 16 deletions

View File

@ -496,7 +496,8 @@ ze_result_t KernelImp::setArgBufferWithAlloc(uint32_t argIndex, uintptr_t argVal
NEO::patchPointer(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), arg, val);
if (NEO::isValidOffset(arg.bindful) || NEO::isValidOffset(arg.bindless)) {
setBufferSurfaceState(argIndex, reinterpret_cast<void *>(val), allocation);
} else {
}
auto allocData = this->module->getDevice()->getDriverHandle()->getSvmAllocsManager()->getSVMAlloc(reinterpret_cast<void *>(allocation->getGpuAddress()));
if (allocData) {
bool argWasUncacheable = isArgUncached[argIndex];
@ -508,7 +509,7 @@ ze_result_t KernelImp::setArgBufferWithAlloc(uint32_t argIndex, uintptr_t argVal
}
this->setKernelArgUncached(argIndex, argIsUncacheable);
}
}
residencyContainer[argIndex] = allocation;
return ZE_RESULT_SUCCESS;

View File

@ -141,6 +141,10 @@ HWTEST2_F(ModuleTest, givenNonPatchedTokenThenSurfaceBaseAddressIsCorrectlySet,
using ModuleUncachedBufferTest = Test<ModuleFixture>;
struct KernelImpUncachedTest : public KernelImp {
using KernelImp::kernelRequiresUncachedMocsCount;
};
HWTEST2_F(ModuleUncachedBufferTest,
givenKernelWithNonUncachedArgumentAndPreviouslyNotSetUncachedThenUncachedMocsNotSet, ModuleTestSupport) {
ze_kernel_handle_t kernelHandle;
@ -186,7 +190,7 @@ HWTEST2_F(ModuleUncachedBufferTest,
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
auto kernelImp = reinterpret_cast<L0::KernelImp *>(L0::Kernel::fromHandle(kernelHandle));
auto kernelImp = reinterpret_cast<KernelImpUncachedTest *>(L0::Kernel::fromHandle(kernelHandle));
void *devicePtr = nullptr;
ze_device_mem_alloc_desc_t deviceDesc = {};
@ -202,6 +206,7 @@ HWTEST2_F(ModuleUncachedBufferTest,
uint32_t argIndex = 0u;
kernelImp->setKernelArgUncached(argIndex, true);
kernelImp->kernelRequiresUncachedMocsCount++;
kernelImp->setArgBufferWithAlloc(argIndex, reinterpret_cast<uintptr_t>(devicePtr), gpuAlloc);
EXPECT_FALSE(kernelImp->getKernelRequiresUncachedMocs());
@ -238,7 +243,7 @@ HWTEST2_F(ModuleUncachedBufferTest,
uint32_t argIndex = 0u;
kernelImp->setArgBufferWithAlloc(argIndex, reinterpret_cast<uintptr_t>(devicePtr), gpuAlloc);
EXPECT_FALSE(kernelImp->getKernelRequiresUncachedMocs());
EXPECT_TRUE(kernelImp->getKernelRequiresUncachedMocs());
Kernel::fromHandle(kernelHandle)->destroy();
@ -257,7 +262,7 @@ HWTEST2_F(ModuleUncachedBufferTest,
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
auto kernelImp = reinterpret_cast<L0::KernelImp *>(L0::Kernel::fromHandle(kernelHandle));
auto kernelImp = reinterpret_cast<KernelImpUncachedTest *>(L0::Kernel::fromHandle(kernelHandle));
void *devicePtr = nullptr;
ze_device_mem_alloc_desc_t deviceDesc = {};
@ -274,8 +279,9 @@ HWTEST2_F(ModuleUncachedBufferTest,
uint32_t argIndex = 0u;
kernelImp->setKernelArgUncached(argIndex, true);
kernelImp->kernelRequiresUncachedMocsCount++;
kernelImp->setArgBufferWithAlloc(argIndex, reinterpret_cast<uintptr_t>(devicePtr), gpuAlloc);
EXPECT_FALSE(kernelImp->getKernelRequiresUncachedMocs());
EXPECT_TRUE(kernelImp->getKernelRequiresUncachedMocs());
auto argInfo = kernelImp->getImmutableData()->getDescriptor().payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescPointer>();
auto surfaceStateAddressRaw = ptrOffset(kernelImp->getSurfaceStateHeapData(), argInfo.bindful);