diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index d68b3af6da..efc9bafa7f 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -1009,7 +1009,19 @@ void KernelImp::setInlineSamplers() { auto sampler = std::unique_ptr(L0::Sampler::create(productFamily, device, &samplerDesc)); UNRECOVERABLE_IF(sampler.get() == nullptr); - sampler->copySamplerStateToDSH(dynamicStateHeapData.get(), dynamicStateHeapDataSize, inlineSampler.getSamplerBindfulOffset()); + + if (NEO::isValidOffset(inlineSampler.bindless)) { + auto samplerStateIndex = inlineSampler.samplerIndex; + auto &gfxCoreHelper = device->getGfxCoreHelper(); + auto samplerStateSize = gfxCoreHelper.getSamplerStateSize(); + uint32_t offset = inlineSampler.borderColorStateSize; + offset += static_cast(samplerStateSize) * samplerStateIndex; + sampler->copySamplerStateToDSH(dynamicStateHeapData.get(), dynamicStateHeapDataSize, offset); + + } else { + + sampler->copySamplerStateToDSH(dynamicStateHeapData.get(), dynamicStateHeapDataSize, inlineSampler.getSamplerBindfulOffset()); + } } } diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel_2.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel_2.cpp index 0c23c8f54d..ddefca9ebf 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel_2.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel_2.cpp @@ -513,6 +513,61 @@ HWTEST2_F(KernelTest, GivenInlineSamplersWhenSettingInlineSamplerThenDshIsPatche EXPECT_EQ(SamplerState::MAG_MODE_FILTER_NEAREST, samplerState->getMagModeFilter()); } +HWTEST2_F(KernelTest, givenTwoInlineSamplersWithBindlessAddressingWhenSettingInlineSamplerThenDshIsPatchedCorrectly, SupportsSampler) { + using SamplerState = typename FamilyType::SAMPLER_STATE; + constexpr auto borderColorStateSize = 64u; + + WhiteBox<::L0::KernelImmutableData> kernelImmData = {}; + NEO::KernelDescriptor descriptor; + kernelImmData.kernelDescriptor = &descriptor; + + descriptor.inlineSamplers.resize(2); + + auto &inlineSampler = descriptor.inlineSamplers[0]; + inlineSampler.addrMode = NEO::KernelDescriptor::InlineSampler::AddrMode::clampEdge; + inlineSampler.filterMode = NEO::KernelDescriptor::InlineSampler::FilterMode::nearest; + inlineSampler.isNormalized = false; + inlineSampler.bindless = 0x98u; + inlineSampler.samplerIndex = 0u; + + ASSERT_TRUE(NEO::isValidOffset(inlineSampler.bindless)); + + auto &inlineSampler2 = descriptor.inlineSamplers[1]; + inlineSampler2.addrMode = NEO::KernelDescriptor::InlineSampler::AddrMode::clampBorder; + inlineSampler2.filterMode = NEO::KernelDescriptor::InlineSampler::FilterMode::linear; + inlineSampler2.isNormalized = false; + inlineSampler2.bindless = 0x90u; + inlineSampler2.samplerIndex = 1u; + + ASSERT_TRUE(NEO::isValidOffset(inlineSampler.bindless)); + + Mock module(device, nullptr); + Mock kernel; + kernel.module = &module; + kernel.kernelImmData = &kernelImmData; + kernel.dynamicStateHeapData.reset(new uint8_t[borderColorStateSize + 2 * sizeof(SamplerState)]); + kernel.dynamicStateHeapDataSize = borderColorStateSize + 2 * sizeof(SamplerState); + + kernel.setInlineSamplers(); + + const SamplerState *samplerState = reinterpret_cast(kernel.dynamicStateHeapData.get() + borderColorStateSize); + const SamplerState *samplerState2 = reinterpret_cast(kernel.dynamicStateHeapData.get() + sizeof(SamplerState) + borderColorStateSize); + + EXPECT_TRUE(samplerState->getNonNormalizedCoordinateEnable()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP, samplerState->getTcxAddressControlMode()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP, samplerState->getTcyAddressControlMode()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP, samplerState->getTczAddressControlMode()); + EXPECT_EQ(SamplerState::MIN_MODE_FILTER_NEAREST, samplerState->getMinModeFilter()); + EXPECT_EQ(SamplerState::MAG_MODE_FILTER_NEAREST, samplerState->getMagModeFilter()); + + EXPECT_TRUE(samplerState2->getNonNormalizedCoordinateEnable()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP_BORDER, samplerState2->getTcxAddressControlMode()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP_BORDER, samplerState2->getTcyAddressControlMode()); + EXPECT_EQ(SamplerState::TEXTURE_COORDINATE_MODE_CLAMP_BORDER, samplerState2->getTczAddressControlMode()); + EXPECT_EQ(SamplerState::MIN_MODE_FILTER_LINEAR, samplerState2->getMinModeFilter()); + EXPECT_EQ(SamplerState::MAG_MODE_FILTER_LINEAR, samplerState2->getMagModeFilter()); +} + using KernelImmutableDataBindlessTest = Test; HWTEST2_F(KernelImmutableDataBindlessTest, givenGlobalConstBufferAndBindlessExplicitAndImplicitArgsAndNoBindlessHeapsHelperWhenInitializeKernelImmutableDataThenSurfaceStateIsSetAndImplicitArgBindlessOffsetIsPatched, IsAtLeastXeHpgCore) {