2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2019-02-27 18:39:32 +08:00
|
|
|
* Copyright (C) 2017-2019 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2019-02-27 18:39:32 +08:00
|
|
|
#include "unit_tests/fixtures/kernel_data_fixture.h"
|
|
|
|
|
2019-08-03 04:25:45 +08:00
|
|
|
#include "core/helpers/aligned_memory.h"
|
2019-06-19 15:21:29 +08:00
|
|
|
#include "core/helpers/string.h"
|
2019-09-18 03:26:09 +08:00
|
|
|
#include "core/memory_manager/graphics_allocation.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
void KernelDataTest::buildAndDecode() {
|
|
|
|
cl_int error = CL_SUCCESS;
|
|
|
|
kernelBinaryHeader.CheckSum = checkSum;
|
|
|
|
kernelBinaryHeader.DynamicStateHeapSize = dshSize;
|
|
|
|
kernelBinaryHeader.GeneralStateHeapSize = gshSize;
|
|
|
|
kernelBinaryHeader.KernelHeapSize = kernelHeapSize;
|
|
|
|
kernelBinaryHeader.KernelNameSize = kernelNameSize;
|
|
|
|
kernelBinaryHeader.KernelUnpaddedSize = kernelUnpaddedSize;
|
|
|
|
kernelBinaryHeader.PatchListSize = patchListSize + sizeof(SPatchDataParameterStream);
|
|
|
|
|
|
|
|
kernelBinaryHeader.ShaderHashCode = shaderHashCode;
|
|
|
|
kernelBinaryHeader.SurfaceStateHeapSize = sshSize;
|
|
|
|
|
|
|
|
kernelDataSize = sizeof(SKernelBinaryHeaderCommon) +
|
|
|
|
kernelNameSize + sshSize + dshSize + gshSize + kernelHeapSize + patchListSize;
|
|
|
|
|
|
|
|
kernelDataSize += sizeof(SPatchDataParameterStream);
|
2018-08-09 17:34:50 +08:00
|
|
|
program->setDevice(pDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-07-29 22:11:51 +08:00
|
|
|
pKernelData = static_cast<char *>(alignedMalloc(kernelDataSize, MemoryConstants::cacheLineSize));
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, pKernelData);
|
|
|
|
|
|
|
|
// kernel blob
|
|
|
|
pCurPtr = pKernelData;
|
|
|
|
|
|
|
|
// kernel header
|
|
|
|
// first clear it because sizeof() > sum of sizeof(fields). this is due to packing
|
|
|
|
memset(pCurPtr, 0, sizeof(SKernelBinaryHeaderCommon));
|
|
|
|
*(SKernelBinaryHeaderCommon *)pCurPtr = kernelBinaryHeader;
|
|
|
|
pCurPtr += sizeof(SKernelBinaryHeaderCommon);
|
|
|
|
|
|
|
|
// kernel name
|
|
|
|
memset(pCurPtr, 0, kernelNameSize);
|
|
|
|
strcpy_s(pCurPtr, strlen(kernelName.c_str()) + 1, kernelName.c_str());
|
|
|
|
pCurPtr += kernelNameSize;
|
|
|
|
|
|
|
|
// kernel heap
|
|
|
|
memcpy_s(pCurPtr, kernelHeapSize, pKernelHeap, kernelHeapSize);
|
|
|
|
pCurPtr += kernelHeapSize;
|
|
|
|
|
|
|
|
// general state heap
|
|
|
|
memcpy_s(pCurPtr, gshSize, pGsh, gshSize);
|
|
|
|
pCurPtr += gshSize;
|
|
|
|
|
|
|
|
// dynamic state heap
|
|
|
|
memcpy_s(pCurPtr, dshSize, pDsh, dshSize);
|
|
|
|
pCurPtr += dshSize;
|
|
|
|
|
|
|
|
// surface state heap
|
|
|
|
memcpy_s(pCurPtr, sshSize, pSsh, sshSize);
|
|
|
|
pCurPtr += sshSize;
|
|
|
|
|
|
|
|
// patch list
|
|
|
|
memcpy_s(pCurPtr, patchListSize, pPatchList, patchListSize);
|
|
|
|
pCurPtr += patchListSize;
|
|
|
|
|
|
|
|
// add a data stream member
|
|
|
|
iOpenCL::SPatchDataParameterStream dataParameterStream;
|
|
|
|
dataParameterStream.Token = PATCH_TOKEN_DATA_PARAMETER_STREAM;
|
|
|
|
dataParameterStream.Size = sizeof(SPatchDataParameterStream);
|
|
|
|
dataParameterStream.DataParameterStreamSize = 0x40;
|
|
|
|
memcpy_s(pCurPtr, sizeof(SPatchDataParameterStream),
|
|
|
|
&dataParameterStream, sizeof(SPatchDataParameterStream));
|
|
|
|
|
|
|
|
pCurPtr += sizeof(SPatchDataParameterStream);
|
|
|
|
|
|
|
|
// now build a program with this kernel data
|
2018-08-09 17:34:50 +08:00
|
|
|
error = program->build(pKernelData, kernelDataSize);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, error);
|
|
|
|
|
|
|
|
// extract the kernel info
|
2018-08-09 17:34:50 +08:00
|
|
|
pKernelInfo = program->Program::getKernelInfo(kernelName.c_str());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// validate kernel info
|
|
|
|
// vaidate entire set of data
|
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pBlob, pKernelData, kernelDataSize));
|
|
|
|
|
|
|
|
// validate header
|
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pKernelHeader, &kernelBinaryHeader, sizeof(SKernelBinaryHeaderCommon)));
|
|
|
|
|
|
|
|
// validate name
|
|
|
|
EXPECT_STREQ(pKernelInfo->name.c_str(), kernelName.c_str());
|
|
|
|
|
|
|
|
// validate each heap
|
2018-01-24 09:00:40 +08:00
|
|
|
if (pKernelHeap != nullptr) {
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pKernelHeap, pKernelHeap, kernelHeapSize));
|
2018-01-24 09:00:40 +08:00
|
|
|
}
|
|
|
|
if (pGsh != nullptr) {
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pGsh, pGsh, gshSize));
|
2018-01-24 09:00:40 +08:00
|
|
|
}
|
|
|
|
if (pDsh != nullptr) {
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pDsh, pDsh, dshSize));
|
2018-01-24 09:00:40 +08:00
|
|
|
}
|
|
|
|
if (pSsh != nullptr) {
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pSsh, pSsh, sshSize));
|
2018-01-24 09:00:40 +08:00
|
|
|
}
|
|
|
|
if (pPatchList != nullptr) {
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(0, memcmp(pKernelInfo->heapInfo.pPatchList, pPatchList, patchListSize));
|
2018-01-24 09:00:40 +08:00
|
|
|
}
|
2018-03-08 18:56:44 +08:00
|
|
|
if (kernelHeapSize) {
|
|
|
|
auto kernelAllocation = pKernelInfo->getGraphicsAllocation();
|
|
|
|
UNRECOVERABLE_IF(kernelAllocation == nullptr);
|
|
|
|
EXPECT_EQ(kernelAllocation->getUnderlyingBufferSize(), kernelHeapSize);
|
|
|
|
auto kernelIsa = kernelAllocation->getUnderlyingBuffer();
|
|
|
|
EXPECT_EQ(0, memcmp(kernelIsa, pKernelInfo->heapInfo.pKernelHeap, kernelHeapSize));
|
|
|
|
} else {
|
|
|
|
EXPECT_EQ(nullptr, pKernelInfo->getGraphicsAllocation());
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|