Skip to content

Commit 0d973aa

Browse files
Programm smaller buffer size in SS when offset not patched
Signed-off-by: Maciej Plewka <[email protected]>
1 parent 8a2e867 commit 0d973aa

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

level_zero/core/source/kernel/kernel_hw.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ struct KernelHw : public KernelImp {
3636
baseAddress &= sshAlignmentMask;
3737

3838
auto offset = ptrDiff(address, reinterpret_cast<void *>(baseAddress));
39+
size_t bufferSizeForSsh = alloc->getUnderlyingBufferSize();
3940
auto argInfo = kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescPointer>();
4041
bool offsetWasPatched = NEO::patchNonPointer(ArrayRef<uint8_t>(this->crossThreadData.get(), this->crossThreadDataSize),
4142
argInfo.bufferOffset, static_cast<uint32_t>(offset));
4243
if (false == offsetWasPatched) {
4344
// fallback to handling offset in surface state
4445
baseAddress = reinterpret_cast<uintptr_t>(address);
46+
bufferSizeForSsh -= offset;
4547
DEBUG_BREAK_IF(baseAddress != (baseAddress & sshAlignmentMask));
4648
offset = 0;
4749
}
@@ -53,7 +55,6 @@ struct KernelHw : public KernelImp {
5355
}
5456
uint64_t bufferAddressForSsh = baseAddress;
5557
auto alignment = NEO::EncodeSurfaceState<GfxFamily>::getSurfaceBaseAddressAlignment();
56-
size_t bufferSizeForSsh = alloc->getUnderlyingBufferSize();
5758
bufferSizeForSsh = alignUp(bufferSizeForSsh, alignment);
5859

5960
bool l3Enabled = true;

level_zero/core/test/unit_tests/sources/module/test_module.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,52 @@ HWTEST_F(ModuleTest, givenBufferWhenOffsetIsNotPatchedThenPassedPtrIsSetAsBaseAd
222222
context->freeMem(devicePtr);
223223
}
224224

225+
HWTEST_F(ModuleTest, givenBufferWhenOffsetIsNotPatchedThenSizeIsDecereasedByOffset) {
226+
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;
227+
ze_kernel_handle_t kernelHandle;
228+
229+
ze_kernel_desc_t kernelDesc = {};
230+
kernelDesc.pKernelName = kernelName.c_str();
231+
232+
ze_result_t res = module->createKernel(&kernelDesc, &kernelHandle);
233+
234+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
235+
236+
auto kernelImp = reinterpret_cast<L0::KernelImp *>(L0::Kernel::fromHandle(kernelHandle));
237+
auto allocSize = 16384u;
238+
void *devicePtr = nullptr;
239+
ze_device_mem_alloc_desc_t deviceDesc = {};
240+
res = context->allocDeviceMem(device->toHandle(),
241+
&deviceDesc,
242+
allocSize,
243+
0u,
244+
&devicePtr);
245+
ASSERT_EQ(ZE_RESULT_SUCCESS, res);
246+
247+
auto gpuAlloc = device->getDriverHandle()->getSvmAllocsManager()->getSVMAllocs()->get(devicePtr)->gpuAllocations.getGraphicsAllocation(device->getRootDeviceIndex());
248+
ASSERT_NE(nullptr, gpuAlloc);
249+
250+
uint32_t argIndex = 0u;
251+
uint32_t offset = 0x1234;
252+
const_cast<KernelDescriptor *>(&(kernelImp->getImmutableData()->getDescriptor()))->payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescPointer>().bufferOffset = undefined<NEO::CrossThreadDataOffset>;
253+
const_cast<KernelDescriptor *>(&(kernelImp->getImmutableData()->getDescriptor()))->payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescPointer>().bindful = 0x80;
254+
255+
kernelImp->setBufferSurfaceState(argIndex, ptrOffset(devicePtr, offset), gpuAlloc);
256+
257+
auto argInfo = kernelImp->getImmutableData()->getDescriptor().payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescPointer>();
258+
auto surfaceStateAddressRaw = ptrOffset(kernelImp->getSurfaceStateHeapData(), argInfo.bindful);
259+
auto surfaceStateAddress = reinterpret_cast<RENDER_SURFACE_STATE *>(const_cast<unsigned char *>(surfaceStateAddressRaw));
260+
SURFACE_STATE_BUFFER_LENGTH length = {0};
261+
length.Length = static_cast<uint32_t>((gpuAlloc->getUnderlyingBufferSize() - offset) - 1);
262+
EXPECT_EQ(surfaceStateAddress->getWidth(), static_cast<uint32_t>(length.SurfaceState.Width + 1));
263+
EXPECT_EQ(surfaceStateAddress->getHeight(), static_cast<uint32_t>(length.SurfaceState.Height + 1));
264+
EXPECT_EQ(surfaceStateAddress->getDepth(), static_cast<uint32_t>(length.SurfaceState.Depth + 1));
265+
266+
Kernel::fromHandle(kernelHandle)->destroy();
267+
268+
context->freeMem(devicePtr);
269+
}
270+
225271
using ModuleUncachedBufferTest = Test<ModuleFixture>;
226272

227273
struct KernelImpUncachedTest : public KernelImp {

0 commit comments

Comments
 (0)