From 3eab5cfe355e41e2845031cc3ab563f0a1d45d39 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Tue, 10 Dec 2019 10:06:00 +0100 Subject: [PATCH] Patch flat image params on setKernelArg Change-Id: Iae0f37dfcd2ee14a3874835f2e444549d1769074 Signed-off-by: Dunajski, Bartosz --- runtime/kernel/kernel.cpp | 6 +++ runtime/program/kernel_arg_info.h | 4 ++ .../program/kernel_info_from_patchtokens.cpp | 4 ++ unit_tests/fixtures/kernel_arg_fixture.cpp | 4 ++ unit_tests/kernel/kernel_image_arg_tests.cpp | 24 ++++++++++ unit_tests/program/kernel_data.cpp | 46 +++++++++++++++++++ 6 files changed, 88 insertions(+) diff --git a/runtime/kernel/kernel.cpp b/runtime/kernel/kernel.cpp index df01b6c2a2..327d1fbd61 100644 --- a/runtime/kernel/kernel.cpp +++ b/runtime/kernel/kernel.cpp @@ -1387,6 +1387,12 @@ cl_int Kernel::setArgImageWithMipLevel(uint32_t argIndex, patch(imageFormat.image_channel_order, crossThreadData, kernelArgInfo.offsetChannelOrder); patch(kernelArgInfo.offsetHeap, crossThreadData, kernelArgInfo.offsetObjectId); patch(imageDesc.num_mip_levels, crossThreadData, kernelArgInfo.offsetNumMipLevels); + + patch(pImage->getGraphicsAllocation()->getGpuAddress(), crossThreadData, kernelArgInfo.offsetFlatBaseOffset); + patch(imageDesc.image_width - 1, crossThreadData, kernelArgInfo.offsetFlatWidth); + patch(imageDesc.image_height - 1, crossThreadData, kernelArgInfo.offsetFlatHeight); + patch(imageDesc.image_row_pitch - 1, crossThreadData, kernelArgInfo.offsetFlatPitch); + addAllocationToCacheFlushVector(argIndex, pImage->getGraphicsAllocation()); retVal = CL_SUCCESS; } diff --git a/runtime/program/kernel_arg_info.h b/runtime/program/kernel_arg_info.h index e42b3d917a..87d5cff267 100644 --- a/runtime/program/kernel_arg_info.h +++ b/runtime/program/kernel_arg_info.h @@ -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; diff --git a/runtime/program/kernel_info_from_patchtokens.cpp b/runtime/program/kernel_info_from_patchtokens.cpp index a892190270..03975ce716 100644 --- a/runtime/program/kernel_info_from_patchtokens.cpp +++ b/runtime/program/kernel_info_from_patchtokens.cpp @@ -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); diff --git a/unit_tests/fixtures/kernel_arg_fixture.cpp b/unit_tests/fixtures/kernel_arg_fixture.cpp index 9d29e94deb..81b8a10d44 100644 --- a/unit_tests/fixtures/kernel_arg_fixture.cpp +++ b/unit_tests/fixtures/kernel_arg_fixture.cpp @@ -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; diff --git a/unit_tests/kernel/kernel_image_arg_tests.cpp b/unit_tests/kernel/kernel_image_arg_tests.cpp index bee16b6648..c80be5b3ff 100644 --- a/unit_tests/kernel/kernel_image_arg_tests.cpp +++ b/unit_tests/kernel/kernel_image_arg_tests.cpp @@ -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(pKernel->getCrossThreadData()); + + auto offsetFlatBaseOffset = ptrOffset(crossThreadData, pKernel->getKernelInfo().kernelArgInfo[0].offsetFlatBaseOffset); + EXPECT_EQ(imageBaseAddress, *reinterpret_cast(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; diff --git a/unit_tests/program/kernel_data.cpp b/unit_tests/program/kernel_data.cpp index 5d0521f135..c6628d5780 100644 --- a/unit_tests/program/kernel_data.cpp +++ b/unit_tests/program/kernel_data.cpp @@ -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(*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;