Skip to content

Commit e01d268

Browse files
Program null surface for stateful buffers.
Change-Id: I4c73dcf3902ac6ad422ffab16f41aa342cf736fd
1 parent efda64e commit e01d268

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

runtime/kernel/kernel.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,11 @@ cl_int Kernel::setArgBuffer(uint32_t argIndex,
11331133

11341134
storeKernelArg(argIndex, BUFFER_OBJ, nullptr, argVal, argSize);
11351135

1136+
if (requiresSshForBuffers()) {
1137+
auto surfaceState = ptrOffset(getSurfaceStateHeap(), kernelArgInfo.offsetHeap);
1138+
Buffer::setSurfaceState(&getContext(), surfaceState, 0, nullptr);
1139+
}
1140+
11361141
return CL_SUCCESS;
11371142
}
11381143
}

unit_tests/mem_obj/buffer_set_arg_tests.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, Intel Corporation
2+
* Copyright (c) 2017 - 2018, Intel Corporation
33
*
44
* Permission is hereby granted, free of charge, to any person obtaining a
55
* copy of this software and associated documentation files (the "Software"),
@@ -31,6 +31,7 @@
3131
#include "unit_tests/mocks/mock_program.h"
3232
#include "unit_tests/helpers/debug_manager_state_restore.h"
3333
#include "gtest/gtest.h"
34+
#include "test.h"
3435

3536
using namespace OCLRT;
3637

@@ -73,6 +74,11 @@ class BufferSetArgTest : public ContextFixture,
7374
pKernelInfo->kernelArgInfo[1].kernelArgPatchInfoVector[0].size = sizeOfPointer;
7475
pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector[0].size = sizeOfPointer;
7576

77+
kernelHeader.SurfaceStateHeapSize = sizeof(surfaceStateHeap);
78+
pKernelInfo->heapInfo.pSsh = surfaceStateHeap;
79+
pKernelInfo->heapInfo.pKernelHeader = &kernelHeader;
80+
pKernelInfo->usesSsh = true;
81+
7682
pProgram = new MockProgram(pContext, false);
7783

7884
pKernel = new MockKernel(pProgram, *pKernelInfo, *pDevice);
@@ -102,6 +108,8 @@ class BufferSetArgTest : public ContextFixture,
102108
MockProgram *pProgram;
103109
MockKernel *pKernel = nullptr;
104110
KernelInfo *pKernelInfo = nullptr;
111+
SKernelBinaryHeaderCommon kernelHeader;
112+
char surfaceStateHeap[0x80];
105113
char pCrossThreadData[64];
106114
Buffer *buffer = nullptr;
107115
};
@@ -123,6 +131,43 @@ TEST_F(BufferSetArgTest, setKernelArgBufferWithWrongSizeReturnsInvalidArgValueEr
123131
EXPECT_EQ(CL_INVALID_ARG_VALUE, err);
124132
}
125133

134+
HWTEST_F(BufferSetArgTest, givenSetArgBufferWhenNullArgStatefulThenProgramNullSurfaceState) {
135+
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;
136+
using SURFACE_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT;
137+
138+
auto surfaceState = reinterpret_cast<const RENDER_SURFACE_STATE *>(
139+
ptrOffset(pKernel->getSurfaceStateHeap(),
140+
pKernelInfo->kernelArgInfo[0].offsetHeap));
141+
142+
pKernelInfo->requiresSshForBuffers = true;
143+
144+
cl_int ret = pKernel->setArgBuffer(0, sizeof(cl_mem), nullptr);
145+
146+
EXPECT_EQ(CL_SUCCESS, ret);
147+
148+
auto surfaceFormat = surfaceState->getSurfaceType();
149+
auto surfacetype = surfaceState->getSurfaceFormat();
150+
151+
EXPECT_EQ(surfaceFormat, RENDER_SURFACE_STATE::SURFACE_TYPE_SURFTYPE_NULL);
152+
EXPECT_EQ(surfacetype, SURFACE_FORMAT::SURFACE_FORMAT_RAW);
153+
}
154+
155+
HWTEST_F(BufferSetArgTest, givenSetArgBufferWithNullArgStatelessThenDontProgramNullSurfaceState) {
156+
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;
157+
using SURFACE_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT;
158+
159+
char sshOriginal[sizeof(surfaceStateHeap)];
160+
memcpy(sshOriginal, surfaceStateHeap, sizeof(surfaceStateHeap));
161+
162+
pKernelInfo->requiresSshForBuffers = false;
163+
164+
cl_int ret = pKernel->setArgBuffer(0, sizeof(cl_mem), nullptr);
165+
166+
EXPECT_EQ(CL_SUCCESS, ret);
167+
168+
EXPECT_EQ(memcmp(sshOriginal, surfaceStateHeap, sizeof(surfaceStateHeap)), 0);
169+
}
170+
126171
TEST_F(BufferSetArgTest, setKernelArgBufferFor32BitAddressing) {
127172
auto pKernelArg = (void **)(pKernel->getCrossThreadData() +
128173
pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector[0].crossthreadOffset);

0 commit comments

Comments
 (0)