From 232dc59cde7b5f7033fc3fb0c412b812e7ea55f8 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Fri, 6 Dec 2019 09:50:33 +0100 Subject: [PATCH] Make specific SBA heaps programming optional Change-Id: I852a9e1d9bcc5d6227b1e8a81ab81ad896d6586f Signed-off-by: Dunajski, Bartosz --- core/helpers/state_base_address.h | 12 ++-- core/helpers/state_base_address_base.inl | 52 ++++++++------- core/helpers/state_base_address_bdw_plus.inl | 6 +- .../command_stream_receiver_hw_base.inl | 6 +- ...and_stream_receiver_flush_task_2_tests.cpp | 64 ++++++++++++++++--- 5 files changed, 94 insertions(+), 46 deletions(-) diff --git a/core/helpers/state_base_address.h b/core/helpers/state_base_address.h index f81a22aa3d..483f6a38ff 100644 --- a/core/helpers/state_base_address.h +++ b/core/helpers/state_base_address.h @@ -22,9 +22,9 @@ struct StateBaseAddressHelper { static void programStateBaseAddress( LinearStream &commandStream, - const IndirectHeap &dsh, - const IndirectHeap &ioh, - const IndirectHeap &ssh, + const IndirectHeap *dsh, + const IndirectHeap *ioh, + const IndirectHeap *ssh, uint64_t generalStateBase, uint32_t statelessMocsIndex, uint64_t internalHeapBase, @@ -33,9 +33,9 @@ struct StateBaseAddressHelper { static void appendStateBaseAddressParameters( STATE_BASE_ADDRESS *stateBaseAddress, - const IndirectHeap &dsh, - const IndirectHeap &ioh, - const IndirectHeap &ssh, + const IndirectHeap *dsh, + const IndirectHeap *ioh, + const IndirectHeap *ssh, uint64_t generalStateBase, uint64_t internalHeapBase, GmmHelper *gmmHelper, diff --git a/core/helpers/state_base_address_base.inl b/core/helpers/state_base_address_base.inl index 2e1555c11b..ff6d16f809 100644 --- a/core/helpers/state_base_address_base.inl +++ b/core/helpers/state_base_address_base.inl @@ -16,9 +16,9 @@ namespace NEO { template void StateBaseAddressHelper::programStateBaseAddress( LinearStream &commandStream, - const IndirectHeap &dsh, - const IndirectHeap &ioh, - const IndirectHeap &ssh, + const IndirectHeap *dsh, + const IndirectHeap *ioh, + const IndirectHeap *ssh, uint64_t generalStateBase, uint32_t statelessMocsIndex, uint64_t internalHeapBase, @@ -28,32 +28,36 @@ void StateBaseAddressHelper::programStateBaseAddress( auto pCmd = static_cast(commandStream.getSpace(sizeof(STATE_BASE_ADDRESS))); *pCmd = GfxFamily::cmdInitStateBaseAddress; - pCmd->setDynamicStateBaseAddressModifyEnable(true); - pCmd->setGeneralStateBaseAddressModifyEnable(true); - pCmd->setSurfaceStateBaseAddressModifyEnable(true); - pCmd->setIndirectObjectBaseAddressModifyEnable(true); - pCmd->setInstructionBaseAddressModifyEnable(true); + if (dsh) { + pCmd->setDynamicStateBaseAddressModifyEnable(true); + pCmd->setDynamicStateBufferSizeModifyEnable(true); + pCmd->setDynamicStateBaseAddress(dsh->getHeapGpuBase()); + pCmd->setDynamicStateBufferSize(dsh->getHeapSizeInPages()); + } - pCmd->setDynamicStateBaseAddress(dsh.getHeapGpuBase()); + if (ioh) { + pCmd->setIndirectObjectBaseAddressModifyEnable(true); + pCmd->setIndirectObjectBufferSizeModifyEnable(true); + pCmd->setIndirectObjectBaseAddress(ioh->getHeapGpuBase()); + pCmd->setIndirectObjectBufferSize(ioh->getHeapSizeInPages()); + } + + if (ssh) { + pCmd->setSurfaceStateBaseAddressModifyEnable(true); + pCmd->setSurfaceStateBaseAddress(ssh->getHeapGpuBase()); + } + + pCmd->setInstructionBaseAddressModifyEnable(true); + pCmd->setInstructionBaseAddress(internalHeapBase); + pCmd->setInstructionBufferSizeModifyEnable(true); + pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities); + + pCmd->setGeneralStateBaseAddressModifyEnable(true); + pCmd->setGeneralStateBufferSizeModifyEnable(true); // GSH must be set to 0 for stateless pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase)); - - pCmd->setSurfaceStateBaseAddress(ssh.getHeapGpuBase()); - pCmd->setInstructionBaseAddress(internalHeapBase); - - pCmd->setDynamicStateBufferSizeModifyEnable(true); - pCmd->setGeneralStateBufferSizeModifyEnable(true); - pCmd->setIndirectObjectBufferSizeModifyEnable(true); - pCmd->setInstructionBufferSizeModifyEnable(true); - - pCmd->setDynamicStateBufferSize(dsh.getHeapSizeInPages()); pCmd->setGeneralStateBufferSize(0xfffff); - pCmd->setIndirectObjectBaseAddress(ioh.getHeapGpuBase()); - pCmd->setIndirectObjectBufferSize(ioh.getHeapSizeInPages()); - - pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities); - if (DebugManager.flags.OverrideStatelessMocsIndex.get() != -1) { statelessMocsIndex = DebugManager.flags.OverrideStatelessMocsIndex.get(); } diff --git a/core/helpers/state_base_address_bdw_plus.inl b/core/helpers/state_base_address_bdw_plus.inl index 6974500859..6c38868e79 100644 --- a/core/helpers/state_base_address_bdw_plus.inl +++ b/core/helpers/state_base_address_bdw_plus.inl @@ -12,9 +12,9 @@ namespace NEO { template void StateBaseAddressHelper::appendStateBaseAddressParameters( STATE_BASE_ADDRESS *stateBaseAddress, - const IndirectHeap &dsh, - const IndirectHeap &ioh, - const IndirectHeap &ssh, + const IndirectHeap *dsh, + const IndirectHeap *ioh, + const IndirectHeap *ssh, uint64_t generalStateBase, uint64_t internalHeapBase, GmmHelper *gmmHelper, diff --git a/runtime/command_stream/command_stream_receiver_hw_base.inl b/runtime/command_stream/command_stream_receiver_hw_base.inl index 352fda8c9a..05da48b531 100644 --- a/runtime/command_stream/command_stream_receiver_hw_base.inl +++ b/runtime/command_stream/command_stream_receiver_hw_base.inl @@ -314,9 +314,9 @@ CompletionStamp CommandStreamReceiverHw::flushTask( StateBaseAddressHelper::programStateBaseAddress( commandStreamCSR, - dsh, - ioh, - ssh, + &dsh, + &ioh, + &ssh, newGSHbase, mocsIndex, getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex), diff --git a/unit_tests/command_stream/command_stream_receiver_flush_task_2_tests.cpp b/unit_tests/command_stream/command_stream_receiver_flush_task_2_tests.cpp index fa76190b30..ba2b219088 100644 --- a/unit_tests/command_stream/command_stream_receiver_flush_task_2_tests.cpp +++ b/unit_tests/command_stream/command_stream_receiver_flush_task_2_tests.cpp @@ -1114,18 +1114,18 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrInNonDirtyStateAndBatching HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddressIsProgrammedThenDecanonizedAddressIsWritten) { uint64_t generalStateBaseAddress = 0xffff800400010000ull; - StateBaseAddressHelper helper; + DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); - helper.programStateBaseAddress(commandStream, - dsh, - ioh, - ssh, - generalStateBaseAddress, - 0, - generalStateBaseAddress, - pDevice->getGmmHelper(), - dispatchFlags); + StateBaseAddressHelper::programStateBaseAddress(commandStream, + &dsh, + &ioh, + &ssh, + generalStateBaseAddress, + 0, + generalStateBaseAddress, + pDevice->getGmmHelper(), + dispatchFlags); HardwareParse hwParser; hwParser.parseCommands(commandStream); @@ -1134,3 +1134,47 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddres EXPECT_NE(generalStateBaseAddress, cmd->getGeneralStateBaseAddress()); EXPECT_EQ(GmmHelper::decanonize(generalStateBaseAddress), cmd->getGeneralStateBaseAddress()); } + +HWCMDTEST_F(IGFX_GEN8_CORE, CommandStreamReceiverFlushTaskTests, givenSbaProgrammingWhenHeapsAreNotProvidedThenDontProgram) { + DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); + + uint64_t internalHeapBase = 0x10000; + uint64_t generalStateBase = 0x30000; + + StateBaseAddressHelper::programStateBaseAddress(commandStream, + nullptr, + nullptr, + nullptr, + generalStateBase, + 0, + internalHeapBase, + pDevice->getGmmHelper(), + dispatchFlags); + + HardwareParse hwParser; + hwParser.parseCommands(commandStream); + auto cmd = hwParser.getCommand(); + + EXPECT_FALSE(cmd->getDynamicStateBaseAddressModifyEnable()); + EXPECT_FALSE(cmd->getDynamicStateBufferSizeModifyEnable()); + EXPECT_EQ(0u, cmd->getDynamicStateBaseAddress()); + EXPECT_EQ(0u, cmd->getDynamicStateBufferSize()); + + EXPECT_FALSE(cmd->getIndirectObjectBaseAddressModifyEnable()); + EXPECT_FALSE(cmd->getIndirectObjectBufferSizeModifyEnable()); + EXPECT_EQ(0u, cmd->getIndirectObjectBaseAddress()); + EXPECT_EQ(0u, cmd->getIndirectObjectBufferSize()); + + EXPECT_FALSE(cmd->getSurfaceStateBaseAddressModifyEnable()); + EXPECT_EQ(0u, cmd->getSurfaceStateBaseAddress()); + + EXPECT_TRUE(cmd->getInstructionBaseAddressModifyEnable()); + EXPECT_EQ(internalHeapBase, cmd->getInstructionBaseAddress()); + EXPECT_TRUE(cmd->getInstructionBufferSizeModifyEnable()); + EXPECT_EQ(MemoryConstants::sizeOf4GBinPageEntities, cmd->getInstructionBufferSize()); + + EXPECT_TRUE(cmd->getGeneralStateBaseAddressModifyEnable()); + EXPECT_TRUE(cmd->getGeneralStateBufferSizeModifyEnable()); + EXPECT_EQ(GmmHelper::decanonize(generalStateBase), cmd->getGeneralStateBaseAddress()); + EXPECT_EQ(0xfffffu, cmd->getGeneralStateBufferSize()); +}