diff --git a/core/command_container/cmdcontainer.cpp b/core/command_container/cmdcontainer.cpp index 266e4d5600..4e176fb1c5 100644 --- a/core/command_container/cmdcontainer.cpp +++ b/core/command_container/cmdcontainer.cpp @@ -38,8 +38,6 @@ CommandContainer::~CommandContainer() { getHeapHelper()->storeHeapAllocation(deallocation); } } - residencyContainer.clear(); - deallocationContainer.clear(); } bool CommandContainer::initialize(Device *device) { @@ -84,7 +82,7 @@ bool CommandContainer::initialize(Device *device) { instructionHeapBaseAddress = device->getMemoryManager()->getInternalHeapBaseAddress(0); iddBlock = nullptr; - nextIddInBlock = numIddsPerBlock; + nextIddInBlock = this->getNumIddPerBlock(); return true; } diff --git a/core/command_container/cmdcontainer.h b/core/command_container/cmdcontainer.h index b6be2f803e..7f183ef8d0 100644 --- a/core/command_container/cmdcontainer.h +++ b/core/command_container/cmdcontainer.h @@ -43,6 +43,10 @@ class CommandContainer : public NonCopyableOrMovableClass { } } + CommandContainer(uint32_t maxNumAggregatedIdds) : CommandContainer() { + numIddsPerBlock = maxNumAggregatedIdds; + } + CmdBufferContainer &getCmdBufferAllocations() { return cmdBufferAllocations; } ResidencyContainer &getResidencyContainer() { return residencyContainer; } @@ -70,7 +74,6 @@ class CommandContainer : public NonCopyableOrMovableClass { virtual ~CommandContainer(); uint32_t slmSize = std::numeric_limits::max(); - static const uint32_t numIddsPerBlock = 64; uint32_t nextIddInBlock = 0; uint32_t lastSentNumGrfRequired = 0; @@ -87,6 +90,7 @@ class CommandContainer : public NonCopyableOrMovableClass { void setDirtyStateForAllHeaps(bool dirty) { dirtyHeaps = dirty ? std::numeric_limits::max() : 0; } void setIddBlock(void *iddBlock) { this->iddBlock = iddBlock; } void *getIddBlock() { return iddBlock; } + uint32_t getNumIddPerBlock() { return numIddsPerBlock; } protected: void *iddBlock = nullptr; @@ -97,6 +101,7 @@ class CommandContainer : public NonCopyableOrMovableClass { GraphicsAllocation *allocationIndirectHeaps[HeapType::NUM_TYPES] = {}; uint64_t instructionHeapBaseAddress = 0u; uint32_t dirtyHeaps = std::numeric_limits::max(); + uint32_t numIddsPerBlock = 64; std::unique_ptr commandStream; std::unique_ptr indirectHeaps[HeapType::NUM_TYPES]; diff --git a/core/command_container/command_encoder.inl b/core/command_container/command_encoder.inl index 2c457c493d..e86683b5ea 100644 --- a/core/command_container/command_encoder.inl +++ b/core/command_container/command_encoder.inl @@ -255,10 +255,10 @@ void EncodeStates::adjustStateComputeMode(CommandContainer &container) { template void *EncodeDispatchKernel::getInterfaceDescriptor(CommandContainer &container, uint32_t &iddOffset) { - if (container.nextIddInBlock == container.numIddsPerBlock) { + if (container.nextIddInBlock == container.getNumIddPerBlock()) { container.getIndirectHeap(HeapType::DYNAMIC_STATE)->align(HardwareCommandsHelper::alignInterfaceDescriptorData); container.setIddBlock(container.getHeapSpaceAllowGrow(HeapType::DYNAMIC_STATE, - sizeof(INTERFACE_DESCRIPTOR_DATA) * container.numIddsPerBlock)); + sizeof(INTERFACE_DESCRIPTOR_DATA) * container.getNumIddPerBlock())); container.nextIddInBlock = 0; EncodeMediaInterfaceDescriptorLoad::encode(container); diff --git a/core/command_container/command_encoder_base.inl b/core/command_container/command_encoder_base.inl index 6384b3dd28..93091b8c87 100644 --- a/core/command_container/command_encoder_base.inl +++ b/core/command_container/command_encoder_base.inl @@ -150,7 +150,7 @@ void EncodeDispatchKernel::encode(CommandContainer &container, EncodeL3State::encode(container, slmSizeNew != 0u); container.slmSize = slmSizeNew; - if (container.nextIddInBlock != container.numIddsPerBlock) { + if (container.nextIddInBlock != container.getNumIddPerBlock()) { EncodeMediaInterfaceDescriptorLoad::encode(container); } } @@ -213,7 +213,7 @@ void EncodeMediaInterfaceDescriptorLoad::encode(CommandContainer &contai MEDIA_INTERFACE_DESCRIPTOR_LOAD cmd = Family::cmdInitMediaInterfaceDescriptorLoad; cmd.setInterfaceDescriptorDataStartAddress(static_cast(ptrDiff(container.getIddBlock(), heap->getCpuBase()))); - cmd.setInterfaceDescriptorTotalLength(sizeof(INTERFACE_DESCRIPTOR_DATA) * container.numIddsPerBlock); + cmd.setInterfaceDescriptorTotalLength(sizeof(INTERFACE_DESCRIPTOR_DATA) * container.getNumIddPerBlock()); auto buffer = container.getCommandStream()->getSpace(sizeof(cmd)); *(decltype(cmd) *)buffer = cmd; diff --git a/core/unit_tests/encoders/test_encode_dispatch_kernel.cpp b/core/unit_tests/encoders/test_encode_dispatch_kernel.cpp index a768a06db7..fd62ef9fa2 100644 --- a/core/unit_tests/encoders/test_encode_dispatch_kernel.cpp +++ b/core/unit_tests/encoders/test_encode_dispatch_kernel.cpp @@ -15,6 +15,20 @@ using namespace NEO; using CommandEncodeStatesTest = Test; +TEST_F(CommandEncodeStatesTest, givenDefaultCommandConatinerGetNumIddsInBlock) { + auto numIdds = cmdContainer->getNumIddPerBlock(); + EXPECT_EQ(64u, numIdds); +} + +TEST_F(CommandEncodeStatesTest, givenCommandConatinerCreatedWithMaxNumAggregateIddThenVerifyGetNumIddsInBlockIsCorrect) { + auto cmdContainer = new CommandContainer(1); + auto numIdds = cmdContainer->getNumIddPerBlock(); + + EXPECT_EQ(1u, numIdds); + + delete cmdContainer; +} + HWTEST_F(CommandEncodeStatesTest, givenenDispatchInterfaceWhenDispatchKernelThenWalkerCommandProgrammed) { uint32_t dims[] = {2, 1, 1}; std::unique_ptr dispatchInterface(new MockDispatchKernelEncoder()); @@ -295,7 +309,7 @@ HWCMDTEST_F(IGFX_GEN8_CORE, CommandEncodeStatesTest, giveNextIddInBlockZeorWhenD std::unique_ptr dispatchInterface(new MockDispatchKernelEncoder()); cmdContainer->getIndirectHeap(HeapType::DYNAMIC_STATE)->align(HardwareCommandsHelper::alignInterfaceDescriptorData); - cmdContainer->setIddBlock(cmdContainer->getHeapSpaceAllowGrow(HeapType::DYNAMIC_STATE, sizeof(INTERFACE_DESCRIPTOR_DATA) * cmdContainer->numIddsPerBlock)); + cmdContainer->setIddBlock(cmdContainer->getHeapSpaceAllowGrow(HeapType::DYNAMIC_STATE, sizeof(INTERFACE_DESCRIPTOR_DATA) * cmdContainer->getNumIddPerBlock())); cmdContainer->nextIddInBlock = 0; EncodeDispatchKernel::encode(*cmdContainer.get(), dims, false, false, dispatchInterface.get(), 0, pDevice, NEO::PreemptionMode::Disabled);