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"),
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
3536using 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+
126171TEST_F (BufferSetArgTest, setKernelArgBufferFor32BitAddressing) {
127172 auto pKernelArg = (void **)(pKernel->getCrossThreadData () +
128173 pKernelInfo->kernelArgInfo [0 ].kernelArgPatchInfoVector [0 ].crossthreadOffset );
0 commit comments