diff --git a/core/command_container/command_encoder_base.inl b/core/command_container/command_encoder_base.inl index 9b227f1df4..d2c7ea949b 100644 --- a/core/command_container/command_encoder_base.inl +++ b/core/command_container/command_encoder_base.inl @@ -229,8 +229,10 @@ void EncodeStateBaseAddress::encode(CommandContainer &container) { container.isHeapDirty(HeapType::INDIRECT_OBJECT) ? container.getIndirectHeap(HeapType::INDIRECT_OBJECT) : nullptr, container.isHeapDirty(HeapType::SURFACE_STATE) ? container.getIndirectHeap(HeapType::SURFACE_STATE) : nullptr, 0, + false, (gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER) >> 1), container.getInstructionHeapBaseAddress(), + false, gmmHelper, false); } diff --git a/core/helpers/state_base_address.h b/core/helpers/state_base_address.h index 8872dd4a01..f967d439f2 100644 --- a/core/helpers/state_base_address.h +++ b/core/helpers/state_base_address.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -26,14 +26,17 @@ struct StateBaseAddressHelper { const IndirectHeap *ioh, const IndirectHeap *ssh, uint64_t generalStateBase, + bool setGeneralStateBaseAddress, uint32_t statelessMocsIndex, uint64_t internalHeapBase, + bool setInstructionStateBaseAddress, GmmHelper *gmmHelper, bool isMultiOsContextCapable); static void appendStateBaseAddressParameters( STATE_BASE_ADDRESS *stateBaseAddress, const IndirectHeap *ssh, + bool setGeneralStateBaseAddress, uint64_t internalHeapBase, GmmHelper *gmmHelper, bool isMultiOsContextCapable); diff --git a/core/helpers/state_base_address_base.inl b/core/helpers/state_base_address_base.inl index 6903e85964..105fd8040d 100644 --- a/core/helpers/state_base_address_base.inl +++ b/core/helpers/state_base_address_base.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Intel Corporation + * Copyright (C) 2019-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -20,8 +20,10 @@ void StateBaseAddressHelper::programStateBaseAddress( const IndirectHeap *ioh, const IndirectHeap *ssh, uint64_t generalStateBase, + bool setGeneralStateBaseAddress, uint32_t statelessMocsIndex, uint64_t internalHeapBase, + bool setInstructionStateBaseAddress, GmmHelper *gmmHelper, bool isMultiOsContextCapable) { @@ -47,16 +49,21 @@ void StateBaseAddressHelper::programStateBaseAddress( pCmd->setSurfaceStateBaseAddress(ssh->getHeapGpuBase()); } - pCmd->setInstructionBaseAddressModifyEnable(true); - pCmd->setInstructionBaseAddress(internalHeapBase); - pCmd->setInstructionBufferSizeModifyEnable(true); - pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities); + if (setInstructionStateBaseAddress) { + pCmd->setInstructionBaseAddressModifyEnable(true); + pCmd->setInstructionBaseAddress(internalHeapBase); + pCmd->setInstructionBufferSizeModifyEnable(true); + pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities); + pCmd->setInstructionMemoryObjectControlState(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER)); + } - pCmd->setGeneralStateBaseAddressModifyEnable(true); - pCmd->setGeneralStateBufferSizeModifyEnable(true); - // GSH must be set to 0 for stateless - pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase)); - pCmd->setGeneralStateBufferSize(0xfffff); + if (setGeneralStateBaseAddress) { + pCmd->setGeneralStateBaseAddressModifyEnable(true); + pCmd->setGeneralStateBufferSizeModifyEnable(true); + // GSH must be set to 0 for stateless + pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase)); + pCmd->setGeneralStateBufferSize(0xfffff); + } if (DebugManager.flags.OverrideStatelessMocsIndex.get() != -1) { statelessMocsIndex = DebugManager.flags.OverrideStatelessMocsIndex.get(); @@ -65,9 +72,8 @@ void StateBaseAddressHelper::programStateBaseAddress( statelessMocsIndex = statelessMocsIndex << 1; pCmd->setStatelessDataPortAccessMemoryObjectControlState(statelessMocsIndex); - pCmd->setInstructionMemoryObjectControlState(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER)); - appendStateBaseAddressParameters(pCmd, ssh, internalHeapBase, gmmHelper, isMultiOsContextCapable); + appendStateBaseAddressParameters(pCmd, ssh, setGeneralStateBaseAddress, internalHeapBase, gmmHelper, isMultiOsContextCapable); } } // namespace NEO diff --git a/core/helpers/state_base_address_bdw_plus.inl b/core/helpers/state_base_address_bdw_plus.inl index fbed2c7a74..6d9f5cf256 100644 --- a/core/helpers/state_base_address_bdw_plus.inl +++ b/core/helpers/state_base_address_bdw_plus.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Intel Corporation + * Copyright (C) 2019-2020 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -13,6 +13,7 @@ template void StateBaseAddressHelper::appendStateBaseAddressParameters( STATE_BASE_ADDRESS *stateBaseAddress, const IndirectHeap *ssh, + bool setGeneralStateBaseAddress, uint64_t internalHeapBase, GmmHelper *gmmHelper, bool isMultiOsContextCapable) { diff --git a/runtime/command_stream/command_stream_receiver_hw_base.inl b/runtime/command_stream/command_stream_receiver_hw_base.inl index 46c771b632..e36b229754 100644 --- a/runtime/command_stream/command_stream_receiver_hw_base.inl +++ b/runtime/command_stream/command_stream_receiver_hw_base.inl @@ -318,8 +318,10 @@ CompletionStamp CommandStreamReceiverHw::flushTask( &ioh, &ssh, newGSHbase, + true, mocsIndex, getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex), + true, device.getGmmHelper(), isMultiOsContextCapable()); 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 05b07a4224..8187563e60 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 @@ -1119,8 +1119,10 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddres &ioh, &ssh, generalStateBaseAddress, + true, 0, generalStateBaseAddress, + true, pDevice->getGmmHelper(), false); @@ -1132,6 +1134,57 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddres EXPECT_EQ(GmmHelper::decanonize(generalStateBaseAddress), cmd->getGeneralStateBaseAddress()); } +HWTEST_F(CommandStreamReceiverFlushTaskTests, givenNonZeroGeneralStateBaseAddressWhenProgrammingIsDisabledThenExpectCommandValueZero) { + uint64_t generalStateBaseAddress = 0x80010000ull; + + StateBaseAddressHelper::programStateBaseAddress(commandStream, + &dsh, + &ioh, + &ssh, + generalStateBaseAddress, + false, + 0, + generalStateBaseAddress, + true, + pDevice->getGmmHelper(), + false); + + HardwareParse hwParser; + hwParser.parseCommands(commandStream); + auto cmd = hwParser.getCommand(); + + EXPECT_EQ(0ull, cmd->getGeneralStateBaseAddress()); + EXPECT_EQ(0u, cmd->getGeneralStateBufferSize()); + EXPECT_FALSE(cmd->getGeneralStateBaseAddressModifyEnable()); + EXPECT_FALSE(cmd->getGeneralStateBufferSizeModifyEnable()); +} + +HWTEST_F(CommandStreamReceiverFlushTaskTests, givenNonZeroInternalHeapBaseAddressWhenProgrammingIsDisabledThenExpectCommandValueZero) { + uint64_t internalHeapBaseAddress = 0x80010000ull; + + StateBaseAddressHelper::programStateBaseAddress(commandStream, + &dsh, + &ioh, + &ssh, + internalHeapBaseAddress, + true, + 0, + internalHeapBaseAddress, + false, + pDevice->getGmmHelper(), + false); + + HardwareParse hwParser; + hwParser.parseCommands(commandStream); + auto cmd = hwParser.getCommand(); + + EXPECT_FALSE(cmd->getInstructionBaseAddressModifyEnable()); + EXPECT_EQ(0ull, cmd->getInstructionBaseAddress()); + EXPECT_FALSE(cmd->getInstructionBufferSizeModifyEnable()); + EXPECT_EQ(0u, cmd->getInstructionBufferSize()); + EXPECT_EQ(0u, cmd->getInstructionMemoryObjectControlState()); +} + HWCMDTEST_F(IGFX_GEN8_CORE, CommandStreamReceiverFlushTaskTests, givenSbaProgrammingWhenHeapsAreNotProvidedThenDontProgram) { DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); @@ -1143,8 +1196,10 @@ HWCMDTEST_F(IGFX_GEN8_CORE, CommandStreamReceiverFlushTaskTests, givenSbaProgram nullptr, nullptr, generalStateBase, + true, 0, internalHeapBase, + true, pDevice->getGmmHelper(), false);