Patch flat image params on setKernelArg
Change-Id: Iae0f37dfcd2ee14a3874835f2e444549d1769074 Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
parent
195f610fa3
commit
3eab5cfe35
|
@ -1387,6 +1387,12 @@ cl_int Kernel::setArgImageWithMipLevel(uint32_t argIndex,
|
|||
patch<uint32_t, cl_channel_order>(imageFormat.image_channel_order, crossThreadData, kernelArgInfo.offsetChannelOrder);
|
||||
patch<uint32_t, uint32_t>(kernelArgInfo.offsetHeap, crossThreadData, kernelArgInfo.offsetObjectId);
|
||||
patch<uint32_t, cl_uint>(imageDesc.num_mip_levels, crossThreadData, kernelArgInfo.offsetNumMipLevels);
|
||||
|
||||
patch<uint64_t, uint64_t>(pImage->getGraphicsAllocation()->getGpuAddress(), crossThreadData, kernelArgInfo.offsetFlatBaseOffset);
|
||||
patch<uint32_t, size_t>(imageDesc.image_width - 1, crossThreadData, kernelArgInfo.offsetFlatWidth);
|
||||
patch<uint32_t, size_t>(imageDesc.image_height - 1, crossThreadData, kernelArgInfo.offsetFlatHeight);
|
||||
patch<uint32_t, size_t>(imageDesc.image_row_pitch - 1, crossThreadData, kernelArgInfo.offsetFlatPitch);
|
||||
|
||||
addAllocationToCacheFlushVector(argIndex, pImage->getGraphicsAllocation());
|
||||
retVal = CL_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -55,6 +55,10 @@ struct KernelArgInfo {
|
|||
uint32_t offsetObjectId = undefinedOffset;
|
||||
uint32_t offsetBufferOffset = undefinedOffset;
|
||||
uint32_t offsetNumMipLevels = undefinedOffset;
|
||||
uint32_t offsetFlatBaseOffset = undefinedOffset;
|
||||
uint32_t offsetFlatWidth = undefinedOffset;
|
||||
uint32_t offsetFlatHeight = undefinedOffset;
|
||||
uint32_t offsetFlatPitch = undefinedOffset;
|
||||
|
||||
bool needPatch = false;
|
||||
bool isTransformable = false;
|
||||
|
|
|
@ -74,6 +74,10 @@ void populateKernelInfoArg(KernelInfo &dstKernelInfo, KernelArgInfo &dstKernelIn
|
|||
dstKernelInfoArg.offsetArraySize = getOffset(src.metadata.image.arraySize);
|
||||
dstKernelInfoArg.offsetNumSamples = getOffset(src.metadata.image.numSamples);
|
||||
dstKernelInfoArg.offsetNumMipLevels = getOffset(src.metadata.image.numMipLevels);
|
||||
dstKernelInfoArg.offsetFlatBaseOffset = getOffset(src.metadata.image.flatBaseOffset);
|
||||
dstKernelInfoArg.offsetFlatWidth = getOffset(src.metadata.image.flatWidth);
|
||||
dstKernelInfoArg.offsetFlatHeight = getOffset(src.metadata.image.flatHeight);
|
||||
dstKernelInfoArg.offsetFlatPitch = getOffset(src.metadata.image.flatPitch);
|
||||
break;
|
||||
case PatchTokenBinary::ArgObjectType::Sampler:
|
||||
dstKernelInfoArg.offsetSamplerSnapWa = getOffset(src.metadata.sampler.coordinateSnapWaRequired);
|
||||
|
|
|
@ -34,6 +34,10 @@ void KernelImageArgTest::SetUp() {
|
|||
pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector.push_back(kernelArgPatchInfo);
|
||||
|
||||
pKernelInfo->kernelArgInfo[0].offsetImgWidth = 0x4;
|
||||
pKernelInfo->kernelArgInfo[0].offsetFlatBaseOffset = 0x8;
|
||||
pKernelInfo->kernelArgInfo[0].offsetFlatWidth = 0x10;
|
||||
pKernelInfo->kernelArgInfo[0].offsetFlatHeight = 0x18;
|
||||
pKernelInfo->kernelArgInfo[0].offsetFlatPitch = 0x24;
|
||||
pKernelInfo->kernelArgInfo[0].offsetNumSamples = 0x3c;
|
||||
offsetNumMipLevelsImage0 = 0x40;
|
||||
pKernelInfo->kernelArgInfo[0].offsetNumMipLevels = offsetNumMipLevelsImage0;
|
||||
|
|
|
@ -50,6 +50,30 @@ TEST_F(KernelImageArgTest, GIVENkernelWithImageArgsWHENcheckDifferentScenariosTH
|
|||
EXPECT_EQ(objectId, *crossThreadData);
|
||||
}
|
||||
|
||||
TEST_F(KernelImageArgTest, givenKernelWithFlatImageTokensWhenArgIsSetThenPatchAllParams) {
|
||||
size_t imageWidth = image->getImageDesc().image_width;
|
||||
size_t imageHeight = image->getImageDesc().image_height;
|
||||
size_t imageRowPitch = image->getImageDesc().image_row_pitch;
|
||||
uint64_t imageBaseAddress = image->getGraphicsAllocation()->getGpuAddress();
|
||||
|
||||
cl_mem memObj = image.get();
|
||||
|
||||
pKernel->setArg(0, sizeof(memObj), &memObj);
|
||||
auto crossThreadData = reinterpret_cast<uint32_t *>(pKernel->getCrossThreadData());
|
||||
|
||||
auto offsetFlatBaseOffset = ptrOffset(crossThreadData, pKernel->getKernelInfo().kernelArgInfo[0].offsetFlatBaseOffset);
|
||||
EXPECT_EQ(imageBaseAddress, *reinterpret_cast<uint64_t *>(offsetFlatBaseOffset));
|
||||
|
||||
auto offsetFlatWidth = ptrOffset(crossThreadData, pKernel->getKernelInfo().kernelArgInfo[0].offsetFlatWidth);
|
||||
EXPECT_EQ(imageWidth - 1, *offsetFlatWidth);
|
||||
|
||||
auto offsetFlatHeight = ptrOffset(crossThreadData, pKernel->getKernelInfo().kernelArgInfo[0].offsetFlatHeight);
|
||||
EXPECT_EQ(imageHeight - 1, *offsetFlatHeight);
|
||||
|
||||
auto offsetFlatPitch = ptrOffset(crossThreadData, pKernel->getKernelInfo().kernelArgInfo[0].offsetFlatPitch);
|
||||
EXPECT_EQ(imageRowPitch - 1, *offsetFlatPitch);
|
||||
}
|
||||
|
||||
TEST_F(KernelImageArgTest, givenKernelWithValidOffsetNumMipLevelsWhenImageArgIsSetThenCrossthreadDataIsProperlyPatched) {
|
||||
MockImageBase image;
|
||||
image.imageDesc.num_mip_levels = 7U;
|
||||
|
|
|
@ -784,6 +784,52 @@ TEST_F(KernelDataTest, DATA_PARAMETER_IMAGE_NUM_MIP_LEVELS) {
|
|||
EXPECT_EQ(offsetNumMipLevels, pKernelInfo->kernelArgInfo[argumentNumber].offsetNumMipLevels);
|
||||
}
|
||||
|
||||
TEST_F(KernelDataTest, givenFlatImageDataParamTokenWhenDecodingThenSetAllOffsets) {
|
||||
uint32_t argumentNumber = 1;
|
||||
uint32_t alignment = 16;
|
||||
|
||||
auto testToken = [&](iOpenCL::DATA_PARAMETER_TOKEN token, uint32_t offsetToken) {
|
||||
{
|
||||
// reset program
|
||||
if (pKernelData) {
|
||||
alignedFree(pKernelData);
|
||||
}
|
||||
program = std::make_unique<MockProgram>(*pContext->getDevice(0)->getExecutionEnvironment(), pContext, false);
|
||||
}
|
||||
|
||||
SPatchDataParameterBuffer dataParameterToken;
|
||||
dataParameterToken.Token = PATCH_TOKEN_DATA_PARAMETER_BUFFER;
|
||||
dataParameterToken.Size = sizeof(SPatchDataParameterBuffer);
|
||||
dataParameterToken.Type = token;
|
||||
dataParameterToken.ArgumentNumber = argumentNumber;
|
||||
dataParameterToken.Offset = offsetToken;
|
||||
dataParameterToken.DataSize = sizeof(uint32_t);
|
||||
dataParameterToken.SourceOffset = alignment;
|
||||
dataParameterToken.LocationIndex = 0x0;
|
||||
dataParameterToken.LocationIndex2 = 0x0;
|
||||
|
||||
pPatchList = &dataParameterToken;
|
||||
patchListSize = dataParameterToken.Size;
|
||||
|
||||
buildAndDecode();
|
||||
|
||||
EXPECT_EQ(0U, pKernelInfo->patchInfo.dataParameterBuffersKernelArgs.size());
|
||||
ASSERT_EQ(2U, pKernelInfo->kernelArgInfo.size());
|
||||
};
|
||||
|
||||
testToken(iOpenCL::DATA_PARAMETER_TOKEN::DATA_PARAMETER_FLAT_IMAGE_BASEOFFSET, 10u);
|
||||
EXPECT_EQ(10u, pKernelInfo->kernelArgInfo[argumentNumber].offsetFlatBaseOffset);
|
||||
|
||||
testToken(iOpenCL::DATA_PARAMETER_TOKEN::DATA_PARAMETER_FLAT_IMAGE_WIDTH, 14u);
|
||||
EXPECT_EQ(14u, pKernelInfo->kernelArgInfo[argumentNumber].offsetFlatWidth);
|
||||
|
||||
testToken(iOpenCL::DATA_PARAMETER_TOKEN::DATA_PARAMETER_FLAT_IMAGE_HEIGHT, 16u);
|
||||
EXPECT_EQ(16u, pKernelInfo->kernelArgInfo[argumentNumber].offsetFlatHeight);
|
||||
|
||||
testToken(iOpenCL::DATA_PARAMETER_TOKEN::DATA_PARAMETER_FLAT_IMAGE_PITCH, 18u);
|
||||
EXPECT_EQ(18u, pKernelInfo->kernelArgInfo[argumentNumber].offsetFlatPitch);
|
||||
}
|
||||
|
||||
TEST_F(KernelDataTest, DATA_PARAMETER_IMAGE_DATA_TYPE) {
|
||||
uint32_t argumentNumber = 1;
|
||||
uint32_t alignment = 16;
|
||||
|
|
Loading…
Reference in New Issue