diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 6cda4a8880..f3bbb204f5 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -2622,12 +2622,13 @@ void CommandListCoreFamily::programStateBaseAddress(NEO::CommandC STATE_BASE_ADDRESS sba; NEO::EncodeStateBaseAddressArgs encodeStateBaseAddressArgs = { - &commandContainer, - sba, - statelessMocsIndex, - false, - this->partitionCount > 1, - isRcs}; + &commandContainer, // container + sba, // sbaCmd + nullptr, // sbaProperties + statelessMocsIndex, // statelessMocsIndex + false, // useGlobalAtomics + this->partitionCount > 1, // multiOsContextCapable + isRcs}; // isRcs NEO::EncodeStateBaseAddress::encode(encodeStateBaseAddressArgs); bool sbaTrackingEnabled = NEO::Debugger::isDebugEnabled(this->internalUsage) && device->getL0Debugger(); diff --git a/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl b/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl index d275474b95..17cb817cc3 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl +++ b/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl @@ -48,12 +48,13 @@ void CommandQueueHw::programStateBaseAddress(uint64_t gsba, bool auto isDebuggerActive = neoDevice->isDebuggerActive() || neoDevice->getDebugger() != nullptr; NEO::StateBaseAddressHelperArgs stateBaseAddressHelperArgs = { - gsba, // generalStateBase + gsba, // generalStateBaseAddress indirectObjectHeapBaseAddress, // indirectObjectHeapBaseAddress instructionHeapBaseAddress, // instructionHeapBaseAddress globalHeapsBase, // globalHeapsBaseAddress 0, // surfaceStateBaseAddress &sbaCmd, // stateBaseAddressCmd + nullptr, // sbaProperties nullptr, // dsh nullptr, // ioh nullptr, // ssh diff --git a/level_zero/core/source/cmdqueue/cmdqueue_xe_hp_core_and_later.inl b/level_zero/core/source/cmdqueue/cmdqueue_xe_hp_core_and_later.inl index ea35d2ca66..1e7ab44b31 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue_xe_hp_core_and_later.inl +++ b/level_zero/core/source/cmdqueue/cmdqueue_xe_hp_core_and_later.inl @@ -43,12 +43,13 @@ void CommandQueueHw::programStateBaseAddress(uint64_t gsba, bool STATE_BASE_ADDRESS sbaCmd; NEO::StateBaseAddressHelperArgs stateBaseAddressHelperArgs = { - 0, // generalStateBase + 0, // generalStateBaseAddress indirectObjectStateBaseAddress, // indirectObjectHeapBaseAddress instructionStateBaseAddress, // instructionHeapBaseAddress globalHeapsBase, // globalHeapsBaseAddress 0, // surfaceStateBaseAddress &sbaCmd, // stateBaseAddressCmd + nullptr, // sbaProperties nullptr, // dsh nullptr, // ioh nullptr, // ssh diff --git a/shared/source/command_container/command_encoder.h b/shared/source/command_container/command_encoder.h index 0c974e6db3..5ea0e85919 100644 --- a/shared/source/command_container/command_encoder.h +++ b/shared/source/command_container/command_encoder.h @@ -37,6 +37,7 @@ struct MiFlushArgs; struct PipeControlArgs; struct PipelineSelectArgs; struct RootDeviceEnvironment; +struct StateBaseAddressProperties; struct StateComputeModeProperties; struct EncodeDispatchKernelArgs { @@ -310,6 +311,7 @@ struct EncodeStateBaseAddressArgs { CommandContainer *container = nullptr; STATE_BASE_ADDRESS &sbaCmd; + StateBaseAddressProperties *sbaProperties = nullptr; uint32_t statelessMocsIndex = 0; diff --git a/shared/source/command_container/command_encoder_bdw_and_later.inl b/shared/source/command_container/command_encoder_bdw_and_later.inl index b25396c8fb..2c07585564 100644 --- a/shared/source/command_container/command_encoder_bdw_and_later.inl +++ b/shared/source/command_container/command_encoder_bdw_and_later.inl @@ -208,12 +208,13 @@ void EncodeDispatchKernel::encode(CommandContainer &container, EncodeDis args.requiresUncachedMocs ? (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED) >> 1) : (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER) >> 1); EncodeStateBaseAddressArgs encodeStateBaseAddressArgs = { - &container, - sba, - statelessMocsIndex, - false, - false, - args.isRcs}; + &container, // container + sba, // sbaCmd + nullptr, // sbaProperties + statelessMocsIndex, // statelessMocsIndex + false, // useGlobalAtomics + false, // multiOsContextCapable + args.isRcs}; // isRcs EncodeStateBaseAddress::encode(encodeStateBaseAddressArgs); container.setDirtyStateForAllHeaps(false); args.requiresUncachedMocs = false; @@ -432,12 +433,13 @@ void EncodeStateBaseAddress::encode(EncodeStateBaseAddressArgs & auto isDebuggerActive = device.isDebuggerActive() || device.getDebugger() != nullptr; StateBaseAddressHelperArgs stateBaseAddressHelperArgs = { - 0, // generalStateBase + 0, // generalStateBaseAddress args.container->getIndirectObjectHeapBaseAddress(), // indirectObjectHeapBaseAddress args.container->getInstructionHeapBaseAddress(), // instructionHeapBaseAddress 0, // globalHeapsBaseAddress 0, // surfaceStateBaseAddress &args.sbaCmd, // stateBaseAddressCmd + args.sbaProperties, // sbaProperties dsh, // dsh ioh, // ioh ssh, // ssh 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 360842a56c..08e065ffa3 100644 --- a/shared/source/command_container/command_encoder_xehp_and_later.inl +++ b/shared/source/command_container/command_encoder_xehp_and_later.inl @@ -232,12 +232,13 @@ void EncodeDispatchKernel::encode(CommandContainer &container, EncodeDis args.requiresUncachedMocs ? (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED) >> 1) : (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER) >> 1); EncodeStateBaseAddressArgs encodeStateBaseAddressArgs = { - &container, - sbaCmd, - statelessMocsIndex, - args.useGlobalAtomics, - args.partitionCount > 1, - args.isRcs}; + &container, // container + sbaCmd, // sbaCmd + nullptr, // sbaProperties + statelessMocsIndex, // statelessMocsIndex + args.useGlobalAtomics, // useGlobalAtomics + args.partitionCount > 1, // multiOsContextCapable + args.isRcs}; // isRcs EncodeStateBaseAddress::encode(encodeStateBaseAddressArgs); container.setDirtyStateForAllHeaps(false); } @@ -529,12 +530,13 @@ void EncodeStateBaseAddress::encode(EncodeStateBaseAddressArgs & auto isDebuggerActive = device.isDebuggerActive() || device.getDebugger() != nullptr; StateBaseAddressHelperArgs stateBaseAddressHelperArgs = { - 0, // generalStateBase + 0, // generalStateBaseAddress args.container->getIndirectObjectHeapBaseAddress(), // indirectObjectHeapBaseAddress args.container->getInstructionHeapBaseAddress(), // instructionHeapBaseAddress 0, // globalHeapsBaseAddress 0, // surfaceStateBaseAddress &args.sbaCmd, // stateBaseAddressCmd + args.sbaProperties, // sbaProperties dsh, // dsh ioh, // ioh ssh, // ssh @@ -555,7 +557,14 @@ void EncodeStateBaseAddress::encode(EncodeStateBaseAddressArgs & StateBaseAddressHelper::programStateBaseAddressIntoCommandStream(stateBaseAddressHelperArgs, *args.container->getCommandStream()); - if (args.container->isHeapDirty(HeapType::SURFACE_STATE) && ssh != nullptr) { + if (args.sbaProperties) { + if (args.sbaProperties->bindingTablePoolBaseAddress.value != StreamProperty64::initValue) { + StateBaseAddressHelper::programBindingTableBaseAddress(*args.container->getCommandStream(), + static_cast(args.sbaProperties->bindingTablePoolBaseAddress.value), + static_cast(args.sbaProperties->bindingTablePoolSize.value), + gmmHelper); + } + } else if (args.container->isHeapDirty(HeapType::SURFACE_STATE) && ssh != nullptr) { auto heap = args.container->getIndirectHeap(HeapType::SURFACE_STATE); StateBaseAddressHelper::programBindingTableBaseAddress(*args.container->getCommandStream(), *heap, diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 296325938e..2067b116bd 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -490,13 +490,13 @@ CompletionStamp CommandStreamReceiverHw::flushTask( EncodeWA::addPipeControlBeforeStateBaseAddress(commandStreamCSR, rootDeviceEnvironment, isRcs(), this->dcFlushSupport); EncodeWA::encodeAdditionalPipelineSelect(commandStreamCSR, dispatchFlags.pipelineSelectArgs, true, rootDeviceEnvironment, isRcs()); - uint64_t newGSHbase = 0; + uint64_t newGshBase = 0; GSBAFor32BitProgrammed = false; if (is64bit && scratchSpaceController->getScratchSpaceAllocation() && !force32BitAllocations) { - newGSHbase = scratchSpaceController->calculateNewGSH(); + newGshBase = scratchSpaceController->calculateNewGSH(); } else if (is64bit && force32BitAllocations && dispatchFlags.gsba32BitRequired) { bool useLocalMemory = scratchSpaceController->getScratchSpaceAllocation() ? scratchSpaceController->getScratchSpaceAllocation()->isAllocatedInLocalMemoryPool() : false; - newGSHbase = getMemoryManager()->getExternalHeapBaseAddress(rootDeviceIndex, useLocalMemory); + newGshBase = getMemoryManager()->getExternalHeapBaseAddress(rootDeviceIndex, useLocalMemory); GSBAFor32BitProgrammed = true; } @@ -507,12 +507,13 @@ CompletionStamp CommandStreamReceiverHw::flushTask( STATE_BASE_ADDRESS stateBaseAddressCmd; StateBaseAddressHelperArgs args = { - newGSHbase, // generalStateBase + newGshBase, // generalStateBaseAddress indirectObjectStateBaseAddress, // indirectObjectHeapBaseAddress instructionHeapBaseAddress, // instructionHeapBaseAddress 0, // globalHeapsBaseAddress 0, // surfaceStateBaseAddress &stateBaseAddressCmd, // stateBaseAddressCmd + nullptr, // sbaProperties dsh, // dsh ioh, // ioh ssh, // ssh @@ -554,7 +555,7 @@ CompletionStamp CommandStreamReceiverHw::flushTask( EncodeWA::encodeAdditionalPipelineSelect(commandStreamCSR, dispatchFlags.pipelineSelectArgs, false, rootDeviceEnvironment, isRcs()); if (DebugManager.flags.AddPatchInfoCommentsForAUBDump.get()) { - collectStateBaseAddresPatchInfo(commandStream.getGraphicsAllocation()->getGpuAddress(), stateBaseAddressCmdOffset, dsh, ioh, ssh, newGSHbase, + collectStateBaseAddresPatchInfo(commandStream.getGraphicsAllocation()->getGpuAddress(), stateBaseAddressCmdOffset, dsh, ioh, ssh, newGshBase, device.getDeviceInfo().imageSupport); } } diff --git a/shared/source/gen8/state_base_address_gen8.cpp b/shared/source/gen8/state_base_address_gen8.cpp index 533aba2da6..0679f75900 100644 --- a/shared/source/gen8/state_base_address_gen8.cpp +++ b/shared/source/gen8/state_base_address_gen8.cpp @@ -19,6 +19,22 @@ void StateBaseAddressHelper::programStateBaseAddress( *args.stateBaseAddressCmd = Family::cmdInitStateBaseAddress; + if (args.sbaProperties) { + if (args.sbaProperties->dynamicStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setDynamicStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setDynamicStateBufferSizeModifyEnable(true); + args.stateBaseAddressCmd->setDynamicStateBaseAddress(static_cast(args.sbaProperties->dynamicStateBaseAddress.value)); + args.stateBaseAddressCmd->setDynamicStateBufferSize(static_cast(args.sbaProperties->dynamicStateSize.value)); + } + if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setSurfaceStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setSurfaceStateBaseAddress(static_cast(args.sbaProperties->surfaceStateBaseAddress.value)); + } + if (args.sbaProperties->statelessMocs.value != StreamProperty::initValue) { + args.statelessMocsIndex = static_cast(args.sbaProperties->statelessMocs.value); + } + } + if (args.dsh) { args.stateBaseAddressCmd->setDynamicStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setDynamicStateBufferSizeModifyEnable(true); @@ -45,7 +61,7 @@ void StateBaseAddressHelper::programStateBaseAddress( args.stateBaseAddressCmd->setGeneralStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setGeneralStateBufferSizeModifyEnable(true); // GSH must be set to 0 for stateless - args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.generalStateBase)); + args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.generalStateBaseAddress)); args.stateBaseAddressCmd->setGeneralStateBufferSize(0xfffff); } diff --git a/shared/source/generated/xe_hpc_core/hw_cmds_generated_xe_hpc_core.inl b/shared/source/generated/xe_hpc_core/hw_cmds_generated_xe_hpc_core.inl index 4c0701543d..14996a5fcd 100644 --- a/shared/source/generated/xe_hpc_core/hw_cmds_generated_xe_hpc_core.inl +++ b/shared/source/generated/xe_hpc_core/hw_cmds_generated_xe_hpc_core.inl @@ -3089,7 +3089,7 @@ typedef struct tagSTATE_BASE_ADDRESS { } inline uint32_t getStatelessDataPortAccessMemoryObjectControlState() const { // patched uint32_t mocs = TheStructure.Common.StatelessDataPortAccessMemoryObjectControlStateReserved_112; - mocs |= TheStructure.Common.StatelessDataPortAccessMemoryObjectControlStateIndexToMocsTables << 1; + mocs |= (TheStructure.Common.StatelessDataPortAccessMemoryObjectControlStateIndexToMocsTables << 1); return (mocs); } inline void setL1CachePolicyL1CacheControl(const L1_CACHE_POLICY value) { diff --git a/shared/source/helpers/state_base_address.h b/shared/source/helpers/state_base_address.h index ece654f65e..626d75a0c2 100644 --- a/shared/source/helpers/state_base_address.h +++ b/shared/source/helpers/state_base_address.h @@ -12,17 +12,20 @@ namespace NEO { enum class MemoryCompressionState; + class GmmHelper; class IndirectHeap; class LinearStream; + struct DispatchFlags; struct HardwareInfo; +struct StateBaseAddressProperties; template struct StateBaseAddressHelperArgs { using STATE_BASE_ADDRESS = typename GfxFamily::STATE_BASE_ADDRESS; - uint64_t generalStateBase = 0; + uint64_t generalStateBaseAddress = 0; uint64_t indirectObjectHeapBaseAddress = 0; uint64_t instructionHeapBaseAddress = 0; uint64_t globalHeapsBaseAddress = 0; @@ -30,6 +33,8 @@ struct StateBaseAddressHelperArgs { STATE_BASE_ADDRESS *stateBaseAddressCmd = nullptr; + StateBaseAddressProperties *sbaProperties = nullptr; + const IndirectHeap *dsh = nullptr; const IndirectHeap *ioh = nullptr; const IndirectHeap *ssh = nullptr; diff --git a/shared/source/helpers/state_base_address_base.inl b/shared/source/helpers/state_base_address_base.inl index 86047487e1..b2da084aab 100644 --- a/shared/source/helpers/state_base_address_base.inl +++ b/shared/source/helpers/state_base_address_base.inl @@ -6,6 +6,7 @@ */ #include "shared/source/command_stream/memory_compression_state.h" +#include "shared/source/command_stream/stream_properties.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/cache_settings_helper.h" #include "shared/source/gmm_helper/gmm_helper.h" @@ -39,6 +40,22 @@ void StateBaseAddressHelper::programStateBaseAddress( const auto surfaceStateCount = getMaxBindlessSurfaceStates(); args.stateBaseAddressCmd->setBindlessSurfaceStateSize(surfaceStateCount); + if (args.sbaProperties) { + if (args.sbaProperties->dynamicStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setDynamicStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setDynamicStateBufferSizeModifyEnable(true); + args.stateBaseAddressCmd->setDynamicStateBaseAddress(static_cast(args.sbaProperties->dynamicStateBaseAddress.value)); + args.stateBaseAddressCmd->setDynamicStateBufferSize(static_cast(args.sbaProperties->dynamicStateSize.value)); + } + if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setSurfaceStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setSurfaceStateBaseAddress(static_cast(args.sbaProperties->surfaceStateBaseAddress.value)); + } + if (args.sbaProperties->statelessMocs.value != StreamProperty::initValue) { + args.statelessMocsIndex = static_cast(args.sbaProperties->statelessMocs.value); + } + } + if (args.useGlobalHeapsBaseAddress) { args.stateBaseAddressCmd->setDynamicStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setDynamicStateBufferSizeModifyEnable(true); @@ -80,7 +97,7 @@ void StateBaseAddressHelper::programStateBaseAddress( args.stateBaseAddressCmd->setGeneralStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setGeneralStateBufferSizeModifyEnable(true); // GSH must be set to 0 for stateless - args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.generalStateBase)); + args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.generalStateBaseAddress)); args.stateBaseAddressCmd->setGeneralStateBufferSize(0xfffff); } diff --git a/shared/source/helpers/state_base_address_bdw_and_later.inl b/shared/source/helpers/state_base_address_bdw_and_later.inl index 5f244cb346..e81d6d738c 100644 --- a/shared/source/helpers/state_base_address_bdw_and_later.inl +++ b/shared/source/helpers/state_base_address_bdw_and_later.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 Intel Corporation + * Copyright (C) 2019-2023 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -15,7 +15,15 @@ void StateBaseAddressHelper::programBindingTableBaseAddress(LinearStr template void StateBaseAddressHelper::appendIohParameters(StateBaseAddressHelperArgs &args) { - if (args.useGlobalHeapsBaseAddress) { + if (args.sbaProperties) { + if (args.sbaProperties->indirectObjectBaseAddress.value != StreamProperty64::initValue) { + auto baseAddress = static_cast(args.sbaProperties->indirectObjectBaseAddress.value); + args.stateBaseAddressCmd->setIndirectObjectBaseAddress(args.gmmHelper->decanonize(baseAddress)); + args.stateBaseAddressCmd->setIndirectObjectBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setIndirectObjectBufferSizeModifyEnable(true); + args.stateBaseAddressCmd->setIndirectObjectBufferSize(static_cast(args.sbaProperties->indirectObjectSize.value)); + } + } else if (args.useGlobalHeapsBaseAddress) { args.stateBaseAddressCmd->setIndirectObjectBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setIndirectObjectBufferSizeModifyEnable(true); args.stateBaseAddressCmd->setIndirectObjectBaseAddress(args.indirectObjectHeapBaseAddress); diff --git a/shared/source/helpers/state_base_address_icllp_and_later.inl b/shared/source/helpers/state_base_address_icllp_and_later.inl index 7b480ddd6d..750aa53232 100644 --- a/shared/source/helpers/state_base_address_icllp_and_later.inl +++ b/shared/source/helpers/state_base_address_icllp_and_later.inl @@ -5,6 +5,7 @@ * */ +#include "shared/source/command_stream/stream_properties.h" #include "shared/source/helpers/state_base_address.h" namespace NEO { @@ -13,6 +14,14 @@ template void StateBaseAddressHelper::appendStateBaseAddressParameters( StateBaseAddressHelperArgs &args) { + if (args.sbaProperties) { + if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(static_cast(args.sbaProperties->surfaceStateBaseAddress.value)); + args.stateBaseAddressCmd->setBindlessSurfaceStateSize(static_cast(args.sbaProperties->surfaceStateSize.value)); + } + } + if (!args.useGlobalHeapsBaseAddress && args.ssh) { args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase()); diff --git a/shared/source/helpers/state_base_address_skl.inl b/shared/source/helpers/state_base_address_skl.inl index c94796ddf0..8ef5fad2d9 100644 --- a/shared/source/helpers/state_base_address_skl.inl +++ b/shared/source/helpers/state_base_address_skl.inl @@ -13,6 +13,14 @@ template void StateBaseAddressHelper::appendStateBaseAddressParameters( StateBaseAddressHelperArgs &args) { + if (args.sbaProperties) { + if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(static_cast(args.sbaProperties->surfaceStateBaseAddress.value)); + args.stateBaseAddressCmd->setBindlessSurfaceStateSize(static_cast(args.sbaProperties->surfaceStateSize.value)); + } + } + if (!args.useGlobalHeapsBaseAddress && args.ssh) { args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase()); 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 498dda133a..2557c40d1e 100644 --- a/shared/source/helpers/state_base_address_xehp_and_later.inl +++ b/shared/source/helpers/state_base_address_xehp_and_later.inl @@ -30,6 +30,23 @@ void StateBaseAddressHelper::appendStateBaseAddressParameters( using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; using STATE_BASE_ADDRESS = typename GfxFamily::STATE_BASE_ADDRESS; + if (args.sbaProperties) { + if (args.sbaProperties->indirectObjectBaseAddress.value != StreamProperty64::initValue) { + auto baseAddress = static_cast(args.sbaProperties->indirectObjectBaseAddress.value); + args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(baseAddress)); + args.stateBaseAddressCmd->setGeneralStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setGeneralStateBufferSizeModifyEnable(true); + args.stateBaseAddressCmd->setGeneralStateBufferSize(static_cast(args.sbaProperties->indirectObjectSize.value)); + } + if (args.sbaProperties->surfaceStateBaseAddress.value != StreamProperty64::initValue) { + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); + args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(static_cast(args.sbaProperties->surfaceStateBaseAddress.value)); + args.stateBaseAddressCmd->setBindlessSurfaceStateSize(static_cast(args.sbaProperties->surfaceStateSize.value)); + } + if (args.sbaProperties->globalAtomics.value != StreamProperty::initValue) { + args.useGlobalAtomics = !!args.sbaProperties->globalAtomics.value; + } + } if (args.setGeneralStateBaseAddress && is64bit) { args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.indirectObjectHeapBaseAddress)); } diff --git a/shared/test/common/test_macros/header/common_matchers.h b/shared/test/common/test_macros/header/common_matchers.h index a03f684c40..647bed859f 100644 --- a/shared/test/common/test_macros/header/common_matchers.h +++ b/shared/test/common/test_macros/header/common_matchers.h @@ -18,6 +18,8 @@ using IsXeHpcCore = IsGfxCore; using IsNotXeHpcCore = IsNotGfxCore; using IsNotXeHpgCore = IsNotGfxCore; +using IsAtLeastGen9 = IsAtLeastGfxCore; + using IsAtMostGen11 = IsAtMostGfxCore; using IsAtMostGen12lp = IsAtMostGfxCore; diff --git a/shared/test/unit_test/encoders/command_encoder_tests_xehp_and_later.cpp b/shared/test/unit_test/encoders/command_encoder_tests_xehp_and_later.cpp index 26addfc620..b51739e8d0 100644 --- a/shared/test/unit_test/encoders/command_encoder_tests_xehp_and_later.cpp +++ b/shared/test/unit_test/encoders/command_encoder_tests_xehp_and_later.cpp @@ -218,28 +218,10 @@ using XeHpAndLaterSbaTest = SbaTest; HWTEST2_F(XeHpAndLaterSbaTest, givenMemoryCompressionEnabledWhenAppendingSbaThenEnableStatelessCompressionForAllStatelessAccesses, CompressionParamsSupportedMatcher) { for (auto memoryCompressionState : {MemoryCompressionState::NotApplicable, MemoryCompressionState::Disabled, MemoryCompressionState::Enabled}) { auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - memoryCompressionState, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + args.memoryCompressionState = memoryCompressionState; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); if (memoryCompressionState == MemoryCompressionState::Enabled) { EXPECT_EQ(FamilyType::STATE_BASE_ADDRESS::ENABLE_MEMORY_COMPRESSION_FOR_ALL_STATELESS_ACCESSES_ENABLED, sbaCmd.getEnableMemoryCompressionForAllStatelessAccesses()); @@ -253,28 +235,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, XeHpAndLaterSbaTest, givenNonZeroInternalHeapBaseAd constexpr uint64_t ihba = 0x80010000ull; auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - ihba, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.indirectObjectHeapBaseAddress = ihba; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(0ull, sbaCmd.getGeneralStateBaseAddress()); } diff --git a/shared/test/unit_test/encoders/test_encode_states.cpp b/shared/test/unit_test/encoders/test_encode_states.cpp index 8889dfbc11..9d4d323547 100644 --- a/shared/test/unit_test/encoders/test_encode_states.cpp +++ b/shared/test/unit_test/encoders/test_encode_states.cpp @@ -6,6 +6,7 @@ */ #include "shared/source/command_container/encode_surface_state.h" +#include "shared/source/command_stream/stream_properties.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/bindless_heaps_helper.h" #include "shared/source/helpers/gfx_core_helper.h" @@ -490,3 +491,47 @@ HWTEST2_F(CommandEncodeStatesTest, givenHeapSharingEnabledWhenRetrievingNotIniti itorCmd = find<_3DSTATE_BINDING_TABLE_POOL_ALLOC *>(commands.begin(), commands.end()); EXPECT_EQ(commands.end(), itorCmd); } + +HWTEST2_F(CommandEncodeStatesTest, givenSbaPropertiesWhenBindingBaseAddressSetThenExpectPropertiesDataDispatched, IsAtLeastXeHpCore) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + using _3DSTATE_BINDING_TABLE_POOL_ALLOC = typename FamilyType::_3DSTATE_BINDING_TABLE_POOL_ALLOC; + + constexpr uint64_t bindingTablePoolBaseAddress = 0x32000; + constexpr uint32_t bindingTablePoolSize = 0x20; + constexpr uint64_t surfaceStateBaseAddress = 0x1200; + constexpr uint32_t surfaceStateSize = 0x10; + + cmdContainer->setHeapDirty(NEO::HeapType::SURFACE_STATE); + auto gmmHelper = cmdContainer->getDevice()->getRootDeviceEnvironment().getGmmHelper(); + uint32_t statelessMocsIndex = (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER) >> 1); + + StateBaseAddressProperties sbaProperties; + + STATE_BASE_ADDRESS sba; + EncodeStateBaseAddressArgs args = createDefaultEncodeStateBaseAddressArgs(cmdContainer.get(), sba, statelessMocsIndex); + args.sbaProperties = &sbaProperties; + + EncodeStateBaseAddress::encode(args); + + GenCmdList commands; + CmdParse::parseCommandBuffer(commands, + cmdContainer->getCommandStream()->getCpuBase(), + cmdContainer->getCommandStream()->getUsed()); + auto itorBindTablePoolCmd = find<_3DSTATE_BINDING_TABLE_POOL_ALLOC *>(commands.begin(), commands.end()); + EXPECT_EQ(commands.end(), itorBindTablePoolCmd); + + sbaProperties.setPropertiesSurfaceState(bindingTablePoolBaseAddress, bindingTablePoolSize, surfaceStateBaseAddress, surfaceStateSize, pDevice->getRootDeviceEnvironment()); + + EncodeStateBaseAddress::encode(args); + + commands.clear(); + CmdParse::parseCommandBuffer(commands, + cmdContainer->getCommandStream()->getCpuBase(), + cmdContainer->getCommandStream()->getUsed()); + itorBindTablePoolCmd = find<_3DSTATE_BINDING_TABLE_POOL_ALLOC *>(commands.begin(), commands.end()); + ASSERT_NE(commands.end(), itorBindTablePoolCmd); + + auto bindTablePoolCmd = reinterpret_cast<_3DSTATE_BINDING_TABLE_POOL_ALLOC *>(*itorBindTablePoolCmd); + EXPECT_EQ(bindingTablePoolBaseAddress, bindTablePoolCmd->getBindingTablePoolBaseAddress()); + EXPECT_EQ(bindingTablePoolSize, bindTablePoolCmd->getBindingTablePoolBufferSize()); +} diff --git a/shared/test/unit_test/fixtures/command_container_fixture.h b/shared/test/unit_test/fixtures/command_container_fixture.h index 79432c82e8..554c0684ee 100644 --- a/shared/test/unit_test/fixtures/command_container_fixture.h +++ b/shared/test/unit_test/fixtures/command_container_fixture.h @@ -41,12 +41,13 @@ class CommandEncodeStatesFixture : public DeviceFixture { typename FamilyType::STATE_BASE_ADDRESS &sbaCmd, uint32_t statelessMocs) { EncodeStateBaseAddressArgs args = { - container, - sbaCmd, - statelessMocs, - false, - false, - false}; + container, // container + sbaCmd, // sbaCmd + nullptr, // sbaProperties + statelessMocs, // statelessMocsIndex + false, // useGlobalAtomics + false, // multiOsContextCapable + false}; // isRcs return args; } diff --git a/shared/test/unit_test/gen8/state_base_address_tests_gen8.cpp b/shared/test/unit_test/gen8/state_base_address_tests_gen8.cpp index 9162835196..62fbabc17a 100644 --- a/shared/test/unit_test/gen8/state_base_address_tests_gen8.cpp +++ b/shared/test/unit_test/gen8/state_base_address_tests_gen8.cpp @@ -19,28 +19,7 @@ BDWTEST_F(SbaTest, givenUsedBindlessBuffersWhenAppendStateBaseAddressParametersI STATE_BASE_ADDRESS stateBaseAddress = {}; STATE_BASE_ADDRESS stateBaseAddressReference = {}; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &stateBaseAddress, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - nullptr, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddress, nullptr, &ssh, nullptr, nullptr); StateBaseAddressHelper::appendStateBaseAddressParameters(args); @@ -56,28 +35,9 @@ BDWTEST_F(SbaTest, STATE_BASE_ADDRESS stateBaseAddressCmd = {}; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - surfaceStateBaseAddress, // surfaceStateBaseAddress - &stateBaseAddressCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - nullptr, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - true // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddressCmd, nullptr, &ssh, nullptr, nullptr); + args.surfaceStateBaseAddress = surfaceStateBaseAddress; + args.overrideSurfaceStateBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); 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 7f9f53e02b..ae8508391b 100644 --- a/shared/test/unit_test/helpers/state_base_address_tests.cpp +++ b/shared/test/unit_test/helpers/state_base_address_tests.cpp @@ -10,6 +10,7 @@ #include "shared/source/command_container/encode_surface_state.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/memory_manager/allocation_properties.h" +#include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/test_macros/hw_test.h" @@ -27,29 +28,7 @@ HWTEST2_F(SbaTest, WhenAppendStateBaseAddressParametersIsCalledThenSBACmdHasBind stateBaseAddress.setBindlessSurfaceStateBaseAddress(0); stateBaseAddress.setBindlessSurfaceStateBaseAddressModifyEnable(false); - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &stateBaseAddress, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - nullptr, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddress, nullptr, &ssh, nullptr, nullptr); StateBaseAddressHelper::appendStateBaseAddressParameters(args); @@ -71,29 +50,7 @@ HWTEST2_F(SbaTest, WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBin STATE_BASE_ADDRESS *cmd = reinterpret_cast(commandStream.getSpace(0)); *cmd = stateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); StateBaseAddressHelper::programStateBaseAddress(args); @@ -115,29 +72,9 @@ HWTEST2_F(SbaTest, STATE_BASE_ADDRESS cmd; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - surfaceStateBaseAddress, // surfaceStateBaseAddress - &cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - true, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&cmd, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); + args.surfaceStateBaseAddress = surfaceStateBaseAddress; + args.overrideSurfaceStateBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); @@ -158,30 +95,9 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenProgramStateBas NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); STATE_BASE_ADDRESS *cmd = reinterpret_cast(cmdStream.getSpace(0)); - - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - true, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper()); + args.globalHeapsBaseAddress = globalBindlessHeapsBaseAddress; + args.useGlobalHeapsBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); @@ -215,30 +131,11 @@ HWTEST2_F(SbaForBindlessTests, NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); STATE_BASE_ADDRESS *cmd = reinterpret_cast(cmdStream.getSpace(0)); - - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress - surfaceStateBaseAddress, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - true, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - true, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper()); + args.globalHeapsBaseAddress = globalBindlessHeapsBaseAddress; + args.surfaceStateBaseAddress = surfaceStateBaseAddress; + args.useGlobalHeapsBaseAddress = true; + args.overrideSurfaceStateBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); @@ -273,30 +170,10 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenPassingIndirect NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); STATE_BASE_ADDRESS *cmd = reinterpret_cast(cmdStream.getSpace(0)); - - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - indirectObjectBaseAddress, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - true, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper()); + args.globalHeapsBaseAddress = globalBindlessHeapsBaseAddress; + args.indirectObjectHeapBaseAddress = indirectObjectBaseAddress; + args.useGlobalHeapsBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); @@ -313,29 +190,8 @@ HWTEST2_F(SbaTest, givenSbaWhenOverrideBindlessSurfaceBaseIsFalseThenBindlessSur stateBaseAddress.setBindlessSurfaceStateBaseAddress(0); stateBaseAddress.setBindlessSurfaceStateBaseAddressModifyEnable(false); - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &stateBaseAddress, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - true, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddress, pDevice->getRootDeviceEnvironment().getGmmHelper()); + args.useGlobalHeapsBaseAddress = true; StateBaseAddressHelper::appendStateBaseAddressParameters(args); @@ -353,30 +209,9 @@ HWTEST2_F(SbaTest, givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurf NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); STATE_BASE_ADDRESS *cmd = reinterpret_cast(cmdStream.getSpace(0)); - - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - true, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); + args.globalHeapsBaseAddress = globalBindlessHeapsBaseAddress; + args.useGlobalHeapsBaseAddress = true; StateBaseAddressHelper::programStateBaseAddress(args); @@ -393,30 +228,8 @@ HWTEST2_F(SbaTest, givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSu NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); STATE_BASE_ADDRESS *cmd = reinterpret_cast(cmdStream.getSpace(0)); - - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - cmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(cmd, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); + args.globalHeapsBaseAddress = globalBindlessHeapsBaseAddress; StateBaseAddressHelper::programStateBaseAddress(args); @@ -429,29 +242,7 @@ HWTEST2_F(SbaTest, givenStateBaseAddressAndDebugFlagSetWhenAppendExtraCacheSetti auto expectedStateBaseAddress = FamilyType::cmdInitStateBaseAddress; DebugManagerStateRestore restore; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &stateBaseAddress, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddress, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); StateBaseAddressHelper::appendExtraCacheSettings(args); EXPECT_EQ(0, memcmp(&stateBaseAddress, &expectedStateBaseAddress, sizeof(STATE_BASE_ADDRESS))); @@ -469,29 +260,8 @@ HWTEST2_F(SbaTest, givenStateBaseAddressAndDebugFlagSetWhenAppendExtraCacheSetti using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; auto stateBaseAddress = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &stateBaseAddress, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&stateBaseAddress, pDevice->getGmmHelper(), &ssh, nullptr, nullptr); + { DebugManagerStateRestore restore; StateBaseAddressHelper::appendExtraCacheSettings(args); @@ -549,29 +319,8 @@ HWTEST2_F(SbaTest, givenDebugFlagSetWhenAppendingSbaThenProgramCorrectL1CachePol {3, FamilyType::STATE_BASE_ADDRESS::L1_CACHE_POLICY_WT}, {4, FamilyType::STATE_BASE_ADDRESS::L1_CACHE_POLICY_WS}}; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; for (const auto &input : testInputs) { DebugManagerStateRestore restore; @@ -631,29 +380,12 @@ HWCMDTEST_F(IGFX_GEN8_CORE, SbaTest, whenGeneralStateBaseAddressIsProgrammedThen auto gmmHelper = pDevice->getGmmHelper(); typename FamilyType::STATE_BASE_ADDRESS sbaCmd; - StateBaseAddressHelperArgs args = { - generalStateBaseAddress, // generalStateBase - 0, // indirectObjectHeapBaseAddress - generalStateBaseAddress, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - &dsh, // dsh - &ioh, // ioh - &ssh, // ssh - gmmHelper, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - true, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper, &ssh, &dsh, &ioh); + args.generalStateBaseAddress = generalStateBaseAddress; + args.instructionHeapBaseAddress = generalStateBaseAddress; + args.setInstructionStateBaseAddress = true; + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::programStateBaseAddress(args); EXPECT_NE(generalStateBaseAddress, sbaCmd.getGeneralStateBaseAddress()); @@ -664,29 +396,11 @@ HWTEST_F(SbaTest, givenNonZeroGeneralStateBaseAddressWhenProgrammingIsDisabledTh constexpr uint64_t generalStateBaseAddress = 0x80010000ull; typename FamilyType::STATE_BASE_ADDRESS sbaCmd; - StateBaseAddressHelperArgs args = { - generalStateBaseAddress, // generalStateBase - 0, // indirectObjectHeapBaseAddress - generalStateBaseAddress, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - &dsh, // dsh - &ioh, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - true, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getGmmHelper(), &ssh, &dsh, &ioh); + args.generalStateBaseAddress = generalStateBaseAddress; + args.instructionHeapBaseAddress = generalStateBaseAddress; + args.setInstructionStateBaseAddress = true; + StateBaseAddressHelper::programStateBaseAddress(args); EXPECT_EQ(0ull, sbaCmd.getGeneralStateBaseAddress()); @@ -699,29 +413,11 @@ HWTEST_F(SbaTest, givenNonZeroInternalHeapBaseAddressWhenProgrammingIsDisabledTh constexpr uint64_t internalHeapBaseAddress = 0x80010000ull; typename FamilyType::STATE_BASE_ADDRESS sbaCmd; - StateBaseAddressHelperArgs args = { - internalHeapBaseAddress, // generalStateBase - internalHeapBaseAddress, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - &dsh, // dsh - &ioh, // ioh - &ssh, // ssh - pDevice->getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getGmmHelper(), &ssh, &dsh, &ioh); + args.generalStateBaseAddress = internalHeapBaseAddress; + args.indirectObjectHeapBaseAddress = internalHeapBaseAddress; + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::programStateBaseAddress(args); EXPECT_FALSE(sbaCmd.getInstructionBaseAddressModifyEnable()); @@ -739,30 +435,13 @@ HWCMDTEST_F(IGFX_GEN8_CORE, SbaTest, givenSbaProgrammingWhenHeapsAreNotProvidedT constexpr uint64_t generalStateBase = 0x30000; typename FamilyType::STATE_BASE_ADDRESS sbaCmd; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getGmmHelper()); + args.generalStateBaseAddress = generalStateBase; + args.indirectObjectHeapBaseAddress = internalHeapBase; + args.instructionHeapBaseAddress = instructionHeapBase; + args.setGeneralStateBaseAddress = true; + args.setInstructionStateBaseAddress = true; - StateBaseAddressHelperArgs args = { - generalStateBase, // generalStateBase - internalHeapBase, // indirectObjectHeapBaseAddress - instructionHeapBase, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - gmmHelper, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - true, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; StateBaseAddressHelper::programStateBaseAddress(args); EXPECT_FALSE(sbaCmd.getDynamicStateBaseAddressModifyEnable()); @@ -801,29 +480,13 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, SbaTest, constexpr uint64_t generalStateBase = 0x30000; STATE_BASE_ADDRESS sbaCmd; - StateBaseAddressHelperArgs args = { - generalStateBase, // generalStateBase - internalHeapBase, // indirectObjectHeapBaseAddress - instructionHeapBase, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - gmmHelper, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - true, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper); + args.generalStateBaseAddress = generalStateBase; + args.indirectObjectHeapBaseAddress = internalHeapBase; + args.instructionHeapBaseAddress = instructionHeapBase; + args.setGeneralStateBaseAddress = true; + args.setInstructionStateBaseAddress = true; + StateBaseAddressHelper::programStateBaseAddress(args); EXPECT_FALSE(sbaCmd.getDynamicStateBaseAddressModifyEnable()); @@ -856,28 +519,168 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, SbaTest, } HWTEST2_F(SbaTest, GivenPlatformNotSupportingIndirectHeapBaseWhenProgramIndirectHeapThenNothingHappens, IsAtLeastXeHpCore) { - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - nullptr, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - nullptr, // ssh - nullptr, // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - false, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(nullptr, nullptr); StateBaseAddressHelper::appendIohParameters(args); } + +HWTEST_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingDynamicStateSurfaceStateMocsPropertiesThenCommandDispatchedCorrectly) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + + DebugManagerStateRestore restore; + DebugManager.flags.ForceL1Caching.set(0); + + constexpr uint64_t surfaceHeapBase = 0x10000; + constexpr uint64_t dynamicHeapBase = 0x20000; + constexpr uint32_t surfaceHeapSize = 0x10; + constexpr uint32_t dynamicHeapSize = 0x20; + constexpr uint32_t mocsIndex = 0x8; + + auto gmmHelper = pDevice->getGmmHelper(); + StateBaseAddressProperties sbaProperties; + + STATE_BASE_ADDRESS sbaCmd; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper, &sbaProperties); + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_FALSE(sbaCmd.getDynamicStateBaseAddressModifyEnable()); + EXPECT_FALSE(sbaCmd.getDynamicStateBufferSizeModifyEnable()); + EXPECT_EQ(0u, sbaCmd.getDynamicStateBaseAddress()); + EXPECT_EQ(0u, sbaCmd.getDynamicStateBufferSize()); + + EXPECT_FALSE(sbaCmd.getSurfaceStateBaseAddressModifyEnable()); + EXPECT_EQ(0u, sbaCmd.getSurfaceStateBaseAddress()); + + EXPECT_EQ(0u, sbaCmd.getStatelessDataPortAccessMemoryObjectControlState()); + + sbaProperties.setPropertiesSurfaceState(surfaceHeapBase, surfaceHeapSize, surfaceHeapBase, surfaceHeapSize, pDevice->getRootDeviceEnvironment()); + sbaProperties.setPropertiesDynamicState(dynamicHeapBase, dynamicHeapSize); + sbaProperties.setPropertyStatelessMocs(mocsIndex); + + sbaCmd = FamilyType::cmdInitStateBaseAddress; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_TRUE(sbaCmd.getDynamicStateBaseAddressModifyEnable()); + EXPECT_TRUE(sbaCmd.getDynamicStateBufferSizeModifyEnable()); + EXPECT_EQ(dynamicHeapBase, sbaCmd.getDynamicStateBaseAddress()); + EXPECT_EQ(dynamicHeapSize, sbaCmd.getDynamicStateBufferSize()); + + EXPECT_TRUE(sbaCmd.getSurfaceStateBaseAddressModifyEnable()); + EXPECT_EQ(surfaceHeapBase, sbaCmd.getSurfaceStateBaseAddress()); + + EXPECT_EQ((mocsIndex << 1), sbaCmd.getStatelessDataPortAccessMemoryObjectControlState()); +} + +using IndirectBaseAddressPlatforms = IsAtMostGen12lp; + +HWTEST2_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingIndirectStatePropertyThenCommandDispatchedCorrectlyIndirectBaseAddress, IndirectBaseAddressPlatforms) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + + constexpr uint64_t indirectHeapBase = 0x10000; + constexpr uint32_t indirectHeapSize = 0x10; + + auto gmmHelper = pDevice->getGmmHelper(); + StateBaseAddressProperties sbaProperties; + + STATE_BASE_ADDRESS sbaCmd; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper, &sbaProperties); + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_FALSE(sbaCmd.getIndirectObjectBaseAddressModifyEnable()); + EXPECT_FALSE(sbaCmd.getIndirectObjectBufferSizeModifyEnable()); + EXPECT_EQ(0u, sbaCmd.getIndirectObjectBaseAddress()); + EXPECT_EQ(0u, sbaCmd.getIndirectObjectBufferSize()); + + sbaProperties.setPropertiesIndirectState(indirectHeapBase, indirectHeapSize); + + sbaCmd = FamilyType::cmdInitStateBaseAddress; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_TRUE(sbaCmd.getIndirectObjectBaseAddressModifyEnable()); + EXPECT_TRUE(sbaCmd.getIndirectObjectBufferSizeModifyEnable()); + EXPECT_EQ(indirectHeapBase, sbaCmd.getIndirectObjectBaseAddress()); + EXPECT_EQ(indirectHeapSize, sbaCmd.getIndirectObjectBufferSize()); +} + +using GlobalBaseAddressPlatforms = IsAtLeastXeHpCore; + +HWTEST2_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingIndirectStateAndGlobalAtomicsPropertyThenCommandDispatchedCorrectlyGlobalBaseAddressAndGlobalAtomics, GlobalBaseAddressPlatforms) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + + constexpr uint64_t indirectHeapBase = 0x10000; + constexpr uint32_t indirectHeapSize = 0x10; + + auto gmmHelper = pDevice->getGmmHelper(); + StateBaseAddressProperties sbaProperties; + + STATE_BASE_ADDRESS sbaCmd; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper, &sbaProperties); + args.isMultiOsContextCapable = true; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_FALSE(sbaCmd.getGeneralStateBaseAddressModifyEnable()); + EXPECT_FALSE(sbaCmd.getGeneralStateBufferSizeModifyEnable()); + EXPECT_EQ(0u, sbaCmd.getGeneralStateBaseAddress()); + EXPECT_EQ(0u, sbaCmd.getGeneralStateBufferSize()); + + EXPECT_TRUE(sbaCmd.getDisableSupportForMultiGpuAtomicsForStatelessAccesses()); + + sbaProperties.setPropertiesIndirectState(indirectHeapBase, indirectHeapSize); + sbaProperties.globalAtomics.set(1); + + sbaCmd = FamilyType::cmdInitStateBaseAddress; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_TRUE(sbaCmd.getGeneralStateBaseAddressModifyEnable()); + EXPECT_TRUE(sbaCmd.getGeneralStateBufferSizeModifyEnable()); + EXPECT_EQ(indirectHeapBase, sbaCmd.getGeneralStateBaseAddress()); + EXPECT_EQ(indirectHeapSize, sbaCmd.getGeneralStateBufferSize()); + + EXPECT_FALSE(sbaCmd.getDisableSupportForMultiGpuAtomicsForStatelessAccesses()); + + sbaProperties.globalAtomics.set(0); + + sbaCmd = FamilyType::cmdInitStateBaseAddress; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_TRUE(sbaCmd.getDisableSupportForMultiGpuAtomicsForStatelessAccesses()); +} + +using BindlessSurfaceAddressPlatforms = IsAtLeastGen9; + +HWTEST2_F(SbaTest, givenStateBaseAddressPropertiesWhenSettingBindlessSurfaceStatePropertyThenCommandDispatchedCorrectlyBindlessBaseAddress, BindlessSurfaceAddressPlatforms) { + using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS; + + constexpr uint64_t surfaceHeapBase = 0x10000; + constexpr uint32_t surfaceHeapSize = 0x10; + + uint32_t defaultBindlessSurfaceStateSize = StateBaseAddressHelper::getMaxBindlessSurfaceStates(); + + auto gmmHelper = pDevice->getGmmHelper(); + StateBaseAddressProperties sbaProperties; + + STATE_BASE_ADDRESS sbaCmd; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, gmmHelper, &sbaProperties); + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_EQ(defaultBindlessSurfaceStateSize, sbaCmd.getBindlessSurfaceStateSize()); + EXPECT_EQ(0u, sbaCmd.getBindlessSurfaceStateBaseAddress()); + EXPECT_FALSE(sbaCmd.getBindlessSurfaceStateBaseAddressModifyEnable()); + + sbaProperties.setPropertiesSurfaceState(surfaceHeapBase, surfaceHeapSize, surfaceHeapBase, surfaceHeapSize, pDevice->getRootDeviceEnvironment()); + + sbaCmd = FamilyType::cmdInitStateBaseAddress; + + StateBaseAddressHelper::programStateBaseAddress(args); + + EXPECT_EQ(surfaceHeapSize, sbaCmd.getBindlessSurfaceStateSize()); + EXPECT_EQ(surfaceHeapBase, sbaCmd.getBindlessSurfaceStateBaseAddress()); + EXPECT_TRUE(sbaCmd.getBindlessSurfaceStateBaseAddressModifyEnable()); +} diff --git a/shared/test/unit_test/helpers/state_base_address_tests.h b/shared/test/unit_test/helpers/state_base_address_tests.h index 64f23daa8b..835bc47244 100644 --- a/shared/test/unit_test/helpers/state_base_address_tests.h +++ b/shared/test/unit_test/helpers/state_base_address_tests.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Intel Corporation + * Copyright (C) 2021-2023 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -8,16 +8,59 @@ #pragma once #include "shared/source/command_stream/linear_stream.h" +#include "shared/source/command_stream/memory_compression_state.h" #include "shared/source/helpers/state_base_address.h" #include "shared/source/indirect_heap/indirect_heap.h" #include "shared/test/common/fixtures/device_fixture.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/mocks/mock_graphics_allocation.h" +#include "shared/test/common/test_macros/test.h" -#include "gtest/gtest.h" +template +StateBaseAddressHelperArgs createSbaHelperArgs(typename FamilyType::STATE_BASE_ADDRESS *sbaCommand, GmmHelper *gmmHelper, IndirectHeap *ssh, IndirectHeap *dsh, IndirectHeap *ioh, StateBaseAddressProperties *sbaProperties) { + StateBaseAddressHelperArgs sbaArgs = { + 0, // generalStateBaseAddress + 0, // indirectObjectHeapBaseAddress + 0, // instructionHeapBaseAddress + 0, // globalHeapsBaseAddress + 0, // surfaceStateBaseAddress + sbaCommand, // stateBaseAddressCmd + sbaProperties, // sbaProperties + dsh, // dsh + ioh, // ioh + ssh, // ssh + gmmHelper, // gmmHelper + nullptr, // hwInfo + 0, // statelessMocsIndex + MemoryCompressionState::NotApplicable, // memoryCompressionState + false, // setInstructionStateBaseAddress + false, // setGeneralStateBaseAddress + false, // useGlobalHeapsBaseAddress + false, // isMultiOsContextCapable + false, // useGlobalAtomics + false, // areMultipleSubDevicesInContext + false // overrideSurfaceStateBaseAddress + }; + return sbaArgs; +} -struct SbaTest : public NEO::DeviceFixture, public ::testing::Test { - void SetUp() override { +template +StateBaseAddressHelperArgs createSbaHelperArgs(typename FamilyType::STATE_BASE_ADDRESS *sbaCommand, GmmHelper *gmmHelper) { + return createSbaHelperArgs(sbaCommand, gmmHelper, nullptr, nullptr, nullptr, nullptr); +} + +template +StateBaseAddressHelperArgs createSbaHelperArgs(typename FamilyType::STATE_BASE_ADDRESS *sbaCommand, GmmHelper *gmmHelper, IndirectHeap *ssh, IndirectHeap *dsh, IndirectHeap *ioh) { + return createSbaHelperArgs(sbaCommand, gmmHelper, ssh, dsh, ioh, nullptr); +} + +template +StateBaseAddressHelperArgs createSbaHelperArgs(typename FamilyType::STATE_BASE_ADDRESS *sbaCommand, GmmHelper *gmmHelper, StateBaseAddressProperties *sbaProperties) { + return createSbaHelperArgs(sbaCommand, gmmHelper, nullptr, nullptr, nullptr, sbaProperties); +} + +struct SbaFixture : public NEO::DeviceFixture { + void setUp() { NEO::DeviceFixture::setUp(); size_t sizeStream = 512; size_t alignmentStream = 0x1000; @@ -44,7 +87,7 @@ struct SbaTest : public NEO::DeviceFixture, public ::testing::Test { commandStream.replaceBuffer(linearStreamBuffer, alignmentStream); } - void TearDown() override { + void tearDown() { alignedFree(linearStreamBuffer); delete ssh.getGraphicsAllocation(); @@ -70,3 +113,5 @@ struct SbaTest : public NEO::DeviceFixture, public ::testing::Test { void *iohBuffer = nullptr; void *linearStreamBuffer = nullptr; }; + +using SbaTest = Test; diff --git a/shared/test/unit_test/xe_hpc_core/test_encode_xe_hpc_core.cpp b/shared/test/unit_test/xe_hpc_core/test_encode_xe_hpc_core.cpp index 1d62a0290b..417c914b1d 100644 --- a/shared/test/unit_test/xe_hpc_core/test_encode_xe_hpc_core.cpp +++ b/shared/test/unit_test/xe_hpc_core/test_encode_xe_hpc_core.cpp @@ -680,28 +680,9 @@ using XeHpcSbaTest = SbaTest; XE_HPC_CORETEST_F(XeHpcSbaTest, givenSpecificProductFamilyWhenAppendingSbaThenProgramWtL1CachePolicy) { auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(FamilyType::STATE_BASE_ADDRESS::L1_CACHE_POLICY_WBP, sbaCmd.getL1CachePolicyL1CacheControl()); @@ -711,28 +692,9 @@ XE_HPC_CORETEST_F(XeHpcSbaTest, givenL1CachingOverrideWhenStateBaseAddressIsProg DebugManagerStateRestore restorer; DebugManager.flags.ForceStatelessL1CachingPolicy.set(0u); auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(0u, sbaCmd.getL1CachePolicyL1CacheControl()); diff --git a/shared/test/unit_test/xe_hpg_core/dg2/test_encode_dg2.cpp b/shared/test/unit_test/xe_hpg_core/dg2/test_encode_dg2.cpp index af2569d567..fafb0a5a39 100644 --- a/shared/test/unit_test/xe_hpg_core/dg2/test_encode_dg2.cpp +++ b/shared/test/unit_test/xe_hpg_core/dg2/test_encode_dg2.cpp @@ -84,29 +84,9 @@ using Dg2SbaTest = SbaTest; DG2TEST_F(Dg2SbaTest, givenSpecificProductFamilyWhenAppendingSbaThenProgramCorrectL1CachePolicy) { auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false, // overrideSurfaceStateBaseAddress - false // isDebuggerActive - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(FamilyType::STATE_BASE_ADDRESS::L1_CACHE_POLICY_WB, sbaCmd.getL1CachePolicyL1CacheControl()); @@ -119,28 +99,9 @@ DG2TEST_F(Dg2SbaTest, givenL1CachingOverrideWhenStateBaseAddressIsProgrammedThen DebugManagerStateRestore restorer; DebugManager.flags.ForceStatelessL1CachingPolicy.set(0u); auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(0u, sbaCmd.getL1CachePolicyL1CacheControl()); diff --git a/shared/test/unit_test/xe_hpg_core/hw_cmds_xe_hpg_core_tests.cpp b/shared/test/unit_test/xe_hpg_core/hw_cmds_xe_hpg_core_tests.cpp index 5326528252..5cf037dc2d 100644 --- a/shared/test/unit_test/xe_hpg_core/hw_cmds_xe_hpg_core_tests.cpp +++ b/shared/test/unit_test/xe_hpg_core/hw_cmds_xe_hpg_core_tests.cpp @@ -100,28 +100,9 @@ using XeHpgSbaTest = SbaTest; XE_HPG_CORETEST_F(XeHpgSbaTest, givenSpecificProductFamilyWhenAppendingSbaThenProgramWBPL1CachePolicy) { auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(FamilyType::STATE_BASE_ADDRESS::L1_CACHE_POLICY_WBP, sbaCmd.getL1CachePolicyL1CacheControl()); @@ -131,28 +112,9 @@ XE_HPG_CORETEST_F(XeHpgSbaTest, givenL1CachingOverrideWhenStateBaseAddressIsProg DebugManagerStateRestore restorer; DebugManager.flags.ForceStatelessL1CachingPolicy.set(0u); auto sbaCmd = FamilyType::cmdInitStateBaseAddress; - StateBaseAddressHelperArgs args = { - 0, // generalStateBase - 0, // indirectObjectHeapBaseAddress - 0, // instructionHeapBaseAddress - 0, // globalHeapsBaseAddress - 0, // surfaceStateBaseAddress - &sbaCmd, // stateBaseAddressCmd - nullptr, // dsh - nullptr, // ioh - &ssh, // ssh - pDevice->getRootDeviceEnvironment().getGmmHelper(), // gmmHelper - nullptr, // hwInfo - 0, // statelessMocsIndex - MemoryCompressionState::NotApplicable, // memoryCompressionState - false, // setInstructionStateBaseAddress - true, // setGeneralStateBaseAddress - false, // useGlobalHeapsBaseAddress - false, // isMultiOsContextCapable - false, // useGlobalAtomics - false, // areMultipleSubDevicesInContext - false // overrideSurfaceStateBaseAddress - }; + StateBaseAddressHelperArgs args = createSbaHelperArgs(&sbaCmd, pDevice->getRootDeviceEnvironment().getGmmHelper(), &ssh, nullptr, nullptr); + args.setGeneralStateBaseAddress = true; + StateBaseAddressHelper::appendStateBaseAddressParameters(args); EXPECT_EQ(0u, sbaCmd.getL1CachePolicyL1CacheControl());