diff --git a/shared/source/command_container/command_encoder_xehp_and_later.inl b/shared/source/command_container/command_encoder_xehp_and_later.inl index ea5eb94d73..1bc0ef1616 100644 --- a/shared/source/command_container/command_encoder_xehp_and_later.inl +++ b/shared/source/command_container/command_encoder_xehp_and_later.inl @@ -529,6 +529,7 @@ void EncodeStateBaseAddress::encode(EncodeStateBaseAddressArgs & auto ioh = args.container->isHeapDirty(HeapType::INDIRECT_OBJECT) ? args.container->getIndirectHeap(HeapType::INDIRECT_OBJECT) : nullptr; auto ssh = args.container->isHeapDirty(HeapType::SURFACE_STATE) ? args.container->getIndirectHeap(HeapType::SURFACE_STATE) : nullptr; auto isDebuggerActive = device.isDebuggerActive() || device.getDebugger() != nullptr; + bool setGeneralStateBaseAddress = args.sbaProperties ? false : true; StateBaseAddressHelperArgs stateBaseAddressHelperArgs = { 0, // generalStateBaseAddress @@ -547,7 +548,7 @@ void EncodeStateBaseAddress::encode(EncodeStateBaseAddressArgs & args.l1CachePolicyDebuggerActive, // l1CachePolicyDebuggerActive NEO::MemoryCompressionState::NotApplicable, // memoryCompressionState true, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress + setGeneralStateBaseAddress, // setGeneralStateBaseAddress false, // useGlobalHeapsBaseAddress args.multiOsContextCapable, // isMultiOsContextCapable args.useGlobalAtomics, // useGlobalAtomics diff --git a/shared/source/helpers/state_base_address_xehp_and_later.inl b/shared/source/helpers/state_base_address_xehp_and_later.inl index 6dbe12bbdf..5d61bf9cb1 100644 --- a/shared/source/helpers/state_base_address_xehp_and_later.inl +++ b/shared/source/helpers/state_base_address_xehp_and_later.inl @@ -36,7 +36,7 @@ void StateBaseAddressHelper::appendStateBaseAddressParameters( args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(baseAddress)); args.stateBaseAddressCmd->setGeneralStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setGeneralStateBufferSizeModifyEnable(true); - args.stateBaseAddressCmd->setGeneralStateBufferSize(static_cast(args.sbaProperties->indirectObjectSize.value)); + args.stateBaseAddressCmd->setGeneralStateBufferSize(0xfffff); } if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); diff --git a/shared/test/unit_test/encoders/test_encode_states.cpp b/shared/test/unit_test/encoders/test_encode_states.cpp index d01a48b2ab..a8821e3f94 100644 --- a/shared/test/unit_test/encoders/test_encode_states.cpp +++ b/shared/test/unit_test/encoders/test_encode_states.cpp @@ -535,3 +535,29 @@ HWTEST2_F(CommandEncodeStatesTest, givenSbaPropertiesWhenBindingBaseAddressSetTh EXPECT_EQ(bindingTablePoolBaseAddress, bindTablePoolCmd->getBindingTablePoolBaseAddress()); EXPECT_EQ(bindingTablePoolSize, bindTablePoolCmd->getBindingTablePoolBufferSize()); } + +HWTEST2_F(CommandEncodeStatesTest, givenSbaPropertiesWhenGeneralBaseAddressSetThenExpectAddressFromPropertiesUsedNotFromContainer, IsAtLeastXeHpCore) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + + auto indirectHeapBaseAddress = cmdContainer->getIndirectObjectHeapBaseAddress(); + auto indirectHeapBaseAddressProperties = indirectHeapBaseAddress + 0x10000; + + StateBaseAddressProperties sbaProperties; + sbaProperties.setPropertiesIndirectState(indirectHeapBaseAddressProperties, MemoryConstants::kiloByte); + + STATE_BASE_ADDRESS sba; + EncodeStateBaseAddressArgs args = createDefaultEncodeStateBaseAddressArgs(cmdContainer.get(), sba, 4); + args.sbaProperties = &sbaProperties; + + EncodeStateBaseAddress::encode(args); + + GenCmdList commands; + CmdParse::parseCommandBuffer(commands, + cmdContainer->getCommandStream()->getCpuBase(), + cmdContainer->getCommandStream()->getUsed()); + auto itorSbaCmd = find(commands.begin(), commands.end()); + ASSERT_NE(commands.end(), itorSbaCmd); + + auto sbaCmd = reinterpret_cast(*itorSbaCmd); + EXPECT_EQ(indirectHeapBaseAddressProperties, sbaCmd->getGeneralStateBaseAddress()); +} diff --git a/shared/test/unit_test/helpers/state_base_address_tests.cpp b/shared/test/unit_test/helpers/state_base_address_tests.cpp index e6565746da..242b7e0e21 100644 --- a/shared/test/unit_test/helpers/state_base_address_tests.cpp +++ b/shared/test/unit_test/helpers/state_base_address_tests.cpp @@ -638,6 +638,7 @@ HWTEST2_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingIndirectStateAndGlo constexpr uint64_t indirectHeapBase = 0x10000; constexpr uint32_t indirectHeapSize = 0x10; + constexpr uint32_t constGlobalHeapSize = 0xfffff; auto gmmHelper = pDevice->getGmmHelper(); StateBaseAddressProperties sbaProperties; @@ -665,7 +666,7 @@ HWTEST2_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingIndirectStateAndGlo EXPECT_TRUE(sbaCmd.getGeneralStateBaseAddressModifyEnable()); EXPECT_TRUE(sbaCmd.getGeneralStateBufferSizeModifyEnable()); EXPECT_EQ(indirectHeapBase, sbaCmd.getGeneralStateBaseAddress()); - EXPECT_EQ(indirectHeapSize, sbaCmd.getGeneralStateBufferSize()); + EXPECT_EQ(constGlobalHeapSize, sbaCmd.getGeneralStateBufferSize()); EXPECT_FALSE(sbaCmd.getDisableSupportForMultiGpuAtomicsForStatelessAccesses());