mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Adding support for get_image_num_mip_levels
* patch token decoding * crossthread data patching * additionally, fixing nasty ODR violation in VA tests (note : ODR = One Definition Rule) Change-Id: I9803ed599826c97359349d2b8fa0d86e46cb33ea
This commit is contained in:

committed by
sys_ocldev

parent
f6a9e3f6f3
commit
614b69a3bf
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@ -20,102 +20,28 @@
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "runtime/helpers/ptr_math.h"
|
||||
#include "runtime/kernel/kernel.h"
|
||||
#include "unit_tests/fixtures/device_fixture.h"
|
||||
#include "test.h"
|
||||
#include "unit_tests/fixtures/image_fixture.h"
|
||||
#include "unit_tests/fixtures/kernel_arg_fixture.h"
|
||||
#include "unit_tests/gen_common/test.h"
|
||||
#include "unit_tests/mocks/mock_context.h"
|
||||
#include "unit_tests/mocks/mock_csr.h"
|
||||
#include "unit_tests/mocks/mock_graphics_allocation.h"
|
||||
#include "unit_tests/mocks/mock_image.h"
|
||||
#include "unit_tests/mocks/mock_kernel.h"
|
||||
#include "unit_tests/mocks/mock_program.h"
|
||||
#include "unit_tests/mocks/mock_csr.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace OCLRT;
|
||||
|
||||
class KernelImageArgTest : public Test<DeviceFixture> {
|
||||
public:
|
||||
KernelImageArgTest() {
|
||||
}
|
||||
|
||||
protected:
|
||||
void SetUp() override {
|
||||
pKernelInfo = KernelInfo::create();
|
||||
KernelArgPatchInfo kernelArgPatchInfo;
|
||||
|
||||
kernelHeader.SurfaceStateHeapSize = sizeof(surfaceStateHeap);
|
||||
pKernelInfo->heapInfo.pSsh = surfaceStateHeap;
|
||||
pKernelInfo->heapInfo.pKernelHeader = &kernelHeader;
|
||||
pKernelInfo->usesSsh = true;
|
||||
|
||||
pKernelInfo->kernelArgInfo.resize(5);
|
||||
pKernelInfo->kernelArgInfo[4].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
pKernelInfo->kernelArgInfo[2].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
pKernelInfo->kernelArgInfo[1].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
|
||||
pKernelInfo->kernelArgInfo[0].offsetImgWidth = 0x4;
|
||||
pKernelInfo->kernelArgInfo[0].offsetNumSamples = 0x3c;
|
||||
pKernelInfo->kernelArgInfo[1].offsetImgHeight = 0xc;
|
||||
pKernelInfo->kernelArgInfo[2].kernelArgPatchInfoVector[0].crossthreadOffset = 0x20;
|
||||
pKernelInfo->kernelArgInfo[2].kernelArgPatchInfoVector[0].size = sizeof(void *);
|
||||
pKernelInfo->kernelArgInfo[3].offsetImgDepth = 0x30;
|
||||
pKernelInfo->kernelArgInfo[4].offsetHeap = 0x20;
|
||||
pKernelInfo->kernelArgInfo[4].offsetObjectId = 0x0;
|
||||
|
||||
pKernelInfo->kernelArgInfo[4].isImage = true;
|
||||
pKernelInfo->kernelArgInfo[3].isImage = true;
|
||||
pKernelInfo->kernelArgInfo[2].isImage = true;
|
||||
pKernelInfo->kernelArgInfo[1].isImage = true;
|
||||
pKernelInfo->kernelArgInfo[0].isImage = true;
|
||||
|
||||
DeviceFixture::SetUp();
|
||||
pKernel = new MockKernel(&program, *pKernelInfo, *pDevice);
|
||||
ASSERT_EQ(CL_SUCCESS, pKernel->initialize());
|
||||
|
||||
pKernel->setKernelArgHandler(0, &Kernel::setArgImage);
|
||||
pKernel->setKernelArgHandler(1, &Kernel::setArgImage);
|
||||
pKernel->setKernelArgHandler(2, &Kernel::setArgImmediate);
|
||||
pKernel->setKernelArgHandler(3, &Kernel::setArgImage);
|
||||
pKernel->setKernelArgHandler(4, &Kernel::setArgImage);
|
||||
|
||||
uint32_t crossThreadData[0x40] = {};
|
||||
crossThreadData[0x20 / sizeof(uint32_t)] = 0x12344321;
|
||||
pKernel->setCrossThreadData(crossThreadData, sizeof(crossThreadData));
|
||||
|
||||
context = new MockContext(pDevice);
|
||||
image = Image2dHelper<>::create(context);
|
||||
ASSERT_NE(nullptr, image);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
delete pKernelInfo;
|
||||
delete pKernel;
|
||||
delete image;
|
||||
delete context;
|
||||
DeviceFixture::TearDown();
|
||||
}
|
||||
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
MockProgram program;
|
||||
MockKernel *pKernel = nullptr;
|
||||
KernelInfo *pKernelInfo;
|
||||
|
||||
MockContext *context;
|
||||
Image *image;
|
||||
SKernelBinaryHeaderCommon kernelHeader;
|
||||
char surfaceStateHeap[0x80];
|
||||
};
|
||||
|
||||
TEST_F(KernelImageArgTest, GIVENkernelWithImageArgsWHENcheckDifferentScenariosTHENproperBehaviour) {
|
||||
size_t imageWidth = image->getImageDesc().image_width;
|
||||
size_t imageHeight = image->getImageDesc().image_height;
|
||||
size_t imageDepth = image->getImageDesc().image_depth;
|
||||
uint32_t objectId = pKernelInfo->kernelArgInfo[4].offsetHeap;
|
||||
|
||||
cl_mem memObj = image;
|
||||
cl_mem memObj = image.get();
|
||||
|
||||
pKernel->setArg(0, sizeof(memObj), &memObj);
|
||||
pKernel->setArg(1, sizeof(memObj), &memObj);
|
||||
@ -138,6 +64,17 @@ TEST_F(KernelImageArgTest, GIVENkernelWithImageArgsWHENcheckDifferentScenariosTH
|
||||
EXPECT_EQ(objectId, *crossThreadData);
|
||||
}
|
||||
|
||||
TEST_F(KernelImageArgTest, givenKernelWithValidOffsetNumMipLevelsWhenImageArgIsSetThenCrossthreadDataIsProperlyPatched) {
|
||||
MockImageBase image;
|
||||
image.imageDesc.num_mip_levels = 7U;
|
||||
cl_mem imageObj = ℑ
|
||||
|
||||
pKernel->setArg(0, sizeof(imageObj), &imageObj);
|
||||
auto crossThreadData = reinterpret_cast<uint32_t *>(pKernel->getCrossThreadData());
|
||||
auto patchedNumMipLevels = ptrOffset(crossThreadData, offsetNumMipLevelsImage0);
|
||||
EXPECT_EQ(7U, *patchedNumMipLevels);
|
||||
}
|
||||
|
||||
TEST_F(KernelImageArgTest, givenImageWithNumSamplesWhenSetArgIsCalledThenPatchNumSamplesInfo) {
|
||||
cl_image_format imgFormat = {CL_RGBA, CL_UNORM_INT8};
|
||||
cl_image_desc imgDesc = {};
|
||||
@ -147,7 +84,7 @@ TEST_F(KernelImageArgTest, givenImageWithNumSamplesWhenSetArgIsCalledThenPatchNu
|
||||
imgDesc.image_height = 5;
|
||||
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
auto sampleImg = Image::create(context, 0, surfaceFormat, &imgDesc, nullptr, retVal);
|
||||
auto sampleImg = Image::create(context.get(), 0, surfaceFormat, &imgDesc, nullptr, retVal);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
cl_mem memObj = sampleImg;
|
||||
@ -169,14 +106,14 @@ TEST_F(KernelImageArgTest, givenImageWithWriteOnlyAccessAndReadOnlyArgWhenCheckC
|
||||
imgDesc.image_width = 5;
|
||||
imgDesc.image_height = 5;
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
std::unique_ptr<Image> img(Image::create(context, flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
std::unique_ptr<Image> img(Image::create(context.get(), flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
pKernelInfo->kernelArgInfo[0].accessQualifier = CL_KERNEL_ARG_ACCESS_READ_ONLY;
|
||||
cl_mem memObj = img.get();
|
||||
retVal = pKernel->checkCorrectImageAccessQualifier(0, sizeof(memObj), &memObj);
|
||||
|
||||
EXPECT_EQ(retVal, CL_INVALID_ARG_VALUE);
|
||||
retVal = clSetKernelArg(
|
||||
pKernel,
|
||||
pKernel.get(),
|
||||
0,
|
||||
sizeof(memObj),
|
||||
&memObj);
|
||||
@ -184,7 +121,7 @@ TEST_F(KernelImageArgTest, givenImageWithWriteOnlyAccessAndReadOnlyArgWhenCheckC
|
||||
EXPECT_EQ(retVal, CL_INVALID_ARG_VALUE);
|
||||
|
||||
retVal = clSetKernelArg(
|
||||
pKernel,
|
||||
pKernel.get(),
|
||||
0,
|
||||
sizeof(memObj),
|
||||
&memObj);
|
||||
@ -192,7 +129,7 @@ TEST_F(KernelImageArgTest, givenImageWithWriteOnlyAccessAndReadOnlyArgWhenCheckC
|
||||
EXPECT_EQ(retVal, CL_INVALID_ARG_VALUE);
|
||||
|
||||
retVal = clSetKernelArg(
|
||||
pKernel,
|
||||
pKernel.get(),
|
||||
1000,
|
||||
sizeof(memObj),
|
||||
&memObj);
|
||||
@ -208,7 +145,7 @@ TEST_F(KernelImageArgTest, givenImageWithReadOnlyAccessAndWriteOnlyArgWhenCheckC
|
||||
imgDesc.image_width = 5;
|
||||
imgDesc.image_height = 5;
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
std::unique_ptr<Image> img(Image::create(context, flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
std::unique_ptr<Image> img(Image::create(context.get(), flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
pKernelInfo->kernelArgInfo[0].accessQualifier = CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
|
||||
cl_mem memObj = img.get();
|
||||
retVal = pKernel->checkCorrectImageAccessQualifier(0, sizeof(memObj), &memObj);
|
||||
@ -228,7 +165,7 @@ TEST_F(KernelImageArgTest, givenImageWithReadOnlyAccessAndReadOnlyArgWhenCheckCo
|
||||
imgDesc.image_width = 5;
|
||||
imgDesc.image_height = 5;
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
std::unique_ptr<Image> img(Image::create(context, flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
std::unique_ptr<Image> img(Image::create(context.get(), flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
pKernelInfo->kernelArgInfo[0].accessQualifier = CL_KERNEL_ARG_ACCESS_READ_ONLY;
|
||||
cl_mem memObj = img.get();
|
||||
retVal = pKernel->checkCorrectImageAccessQualifier(0, sizeof(memObj), &memObj);
|
||||
@ -244,7 +181,7 @@ TEST_F(KernelImageArgTest, givenImageWithWriteOnlyAccessAndWriteOnlyArgWhenCheck
|
||||
imgDesc.image_width = 5;
|
||||
imgDesc.image_height = 5;
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
std::unique_ptr<Image> img(Image::create(context, flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
std::unique_ptr<Image> img(Image::create(context.get(), flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
pKernelInfo->kernelArgInfo[0].accessQualifier = CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
|
||||
cl_mem memObj = img.get();
|
||||
retVal = pKernel->checkCorrectImageAccessQualifier(0, sizeof(memObj), &memObj);
|
||||
@ -261,7 +198,7 @@ HWTEST_F(KernelImageArgTest, givenImgWithMcsAllocWhenMakeResidentThenMakeMcsAllo
|
||||
imgDesc.image_height = 5;
|
||||
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
auto img = Image::create(context, 0, surfaceFormat, &imgDesc, nullptr, retVal);
|
||||
auto img = Image::create(context.get(), 0, surfaceFormat, &imgDesc, nullptr, retVal);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
auto mcsAlloc = context->getMemoryManager()->allocateGraphicsMemory(4096);
|
||||
img->setMcsAllocation(mcsAlloc);
|
||||
@ -290,7 +227,7 @@ TEST_F(KernelImageArgTest, givenKernelWithSettedArgWhenUnSetCalledThenArgIsUnset
|
||||
imgDesc.image_width = 5;
|
||||
imgDesc.image_height = 5;
|
||||
auto surfaceFormat = Image::getSurfaceFormatFromTable(0, &imgFormat);
|
||||
std::unique_ptr<Image> img(Image::create(context, flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
std::unique_ptr<Image> img(Image::create(context.get(), flags, surfaceFormat, &imgDesc, nullptr, retVal));
|
||||
cl_mem memObj = img.get();
|
||||
|
||||
retVal = pKernel->setArg(0, sizeof(memObj), &memObj);
|
||||
|
Reference in New Issue
Block a user