Ignore media block 2d patch token when media block support is disabled

Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
Related-To: NEO-5820
This commit is contained in:
Kamil Kopryk 2021-05-14 13:12:10 +00:00 committed by Compute-Runtime-Automation
parent 734e22857e
commit 14bc9fb0bf
2 changed files with 51 additions and 3 deletions

View File

@ -588,23 +588,26 @@ ze_result_t KernelImp::setArgBuffer(uint32_t argIndex, size_t argSize, const voi
}
ze_result_t KernelImp::setArgImage(uint32_t argIndex, size_t argSize, const void *argVal) {
const auto &arg = kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescImage>();
auto isMediaBlockImage = kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex].getExtendedTypeInfo().isMediaBlockImage;
if (argVal == nullptr) {
residencyContainer[argIndex] = nullptr;
return ZE_RESULT_SUCCESS;
}
const auto &hwInfo = module->getDevice()->getNEODevice()->getHardwareInfo();
auto isMediaBlockImage = (hwInfo.capabilityTable.supportsMediaBlock &&
kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex].getExtendedTypeInfo().isMediaBlockImage);
const auto &arg = kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex].as<NEO::ArgDescImage>();
const auto image = Image::fromHandle(*static_cast<const ze_image_handle_t *>(argVal));
if (kernelImmData->getDescriptor().kernelAttributes.imageAddressingMode == NEO::KernelDescriptor::Bindless) {
image->copySurfaceStateToSSH(patchBindlessSurfaceState(image->getAllocation(), arg.bindless), 0u, isMediaBlockImage);
} else {
image->copySurfaceStateToSSH(surfaceStateHeapData.get(), arg.bindful, isMediaBlockImage);
}
residencyContainer[argIndex] = image->getAllocation();
auto imageInfo = image->getImageInfo();
auto clChannelType = getClChannelDataType(image->getImageDesc().format);
auto clChannelOrder = getClChannelOrder(image->getImageDesc().format);
NEO::patchNonPointer<size_t>(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgWidth, imageInfo.imgDesc.imageWidth);

View File

@ -1602,6 +1602,51 @@ HWTEST2_F(SetKernelArg, givenImageAndBindfulKernelWhenSetArgImageThenCopySurface
EXPECT_EQ(imageHW->passedSurfaceStateOffset, imageArg.bindful);
}
template <GFXCORE_FAMILY gfxCoreFamily>
struct MyMockImageMediaBlock : public WhiteBox<::L0::ImageCoreFamily<gfxCoreFamily>> {
void copySurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset, bool isMediaBlockArg) override {
isMediaBlockPassedValue = isMediaBlockArg;
}
bool isMediaBlockPassedValue = false;
};
HWTEST2_F(SetKernelArg, givenSupportsMediaBlockAndIsMediaBlockImageWhenSetArgImageIsCalledThenIsMediaBlockArgIsPassedCorrectly, ImageSupport) {
auto hwInfo = device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo();
createKernel();
auto argIndex = 3u;
auto &arg = const_cast<NEO::ArgDescriptor &>(kernel->kernelImmData->getDescriptor().payloadMappings.explicitArgs[argIndex]);
auto imageHW = std::make_unique<MyMockImageMediaBlock<gfxCoreFamily>>();
ze_image_desc_t desc = {};
auto ret = imageHW->initialize(device, &desc);
ASSERT_EQ(ZE_RESULT_SUCCESS, ret);
auto handle = imageHW->toHandle();
{
hwInfo->capabilityTable.supportsMediaBlock = true;
arg.getExtendedTypeInfo().isMediaBlockImage = true;
kernel->setArgImage(argIndex, sizeof(imageHW.get()), &handle);
EXPECT_TRUE(imageHW->isMediaBlockPassedValue);
}
{
hwInfo->capabilityTable.supportsMediaBlock = false;
arg.getExtendedTypeInfo().isMediaBlockImage = true;
kernel->setArgImage(argIndex, sizeof(imageHW.get()), &handle);
EXPECT_FALSE(imageHW->isMediaBlockPassedValue);
}
{
hwInfo->capabilityTable.supportsMediaBlock = true;
arg.getExtendedTypeInfo().isMediaBlockImage = false;
kernel->setArgImage(argIndex, sizeof(imageHW.get()), &handle);
EXPECT_FALSE(imageHW->isMediaBlockPassedValue);
}
{
hwInfo->capabilityTable.supportsMediaBlock = false;
arg.getExtendedTypeInfo().isMediaBlockImage = false;
kernel->setArgImage(argIndex, sizeof(imageHW.get()), &handle);
EXPECT_FALSE(imageHW->isMediaBlockPassedValue);
}
}
using ImportHostPointerSetKernelArg = Test<ImportHostPointerModuleFixture>;
HWTEST_F(ImportHostPointerSetKernelArg, givenHostPointerImportedWhenSettingKernelArgThenUseHostPointerAllocation) {
createKernel();