@@ -736,3 +736,147 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, ImplicitScalingTests,
736736 auto miSemaphoreList = hwParser.getCommandsList <MI_SEMAPHORE_WAIT>();
737737 EXPECT_EQ (3u , miSemaphoreList.size ());
738738}
739+
740+ HWCMDTEST_F (IGFX_XE_HP_CORE, ImplicitScalingTests,
741+ givenBarrierDispatchWhenApiNotRequiresSelfCleanupThenExpectMinimalCommandBuffer) {
742+ using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
743+ using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
744+ using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
745+ using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START;
746+
747+ size_t expectedSize = sizeof (PIPE_CONTROL) +
748+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
749+ sizeof (MI_BATCH_BUFFER_START) +
750+ sizeof (WalkerPartition::BarrierControlSection);
751+
752+ size_t estimatedSize = 0 ;
753+ size_t totalBytesProgrammed = 0 ;
754+
755+ estimatedSize = ImplicitScalingDispatch<FamilyType>::getBarrierSize (false );
756+ EXPECT_EQ (expectedSize, estimatedSize);
757+
758+ ImplicitScalingDispatch<FamilyType>::dispatchBarrierCommands (commandStream, twoTile, false , false , false );
759+ totalBytesProgrammed = commandStream.getUsed ();
760+ EXPECT_EQ (expectedSize, totalBytesProgrammed);
761+
762+ HardwareParse hwParser;
763+ hwParser.parsePipeControl = true ;
764+ hwParser.parseCommands <FamilyType>(commandStream, 0 );
765+ hwParser.findHardwareCommands <FamilyType>();
766+
767+ EXPECT_EQ (1u , hwParser.pipeControlList .size ());
768+
769+ auto pipeControl = reinterpret_cast <PIPE_CONTROL *>(*hwParser.pipeControlList .begin ());
770+ EXPECT_EQ (false , pipeControl->getDcFlushEnable ());
771+
772+ auto miAtomicList = hwParser.getCommandsList <MI_ATOMIC>();
773+ EXPECT_EQ (1u , miAtomicList.size ());
774+
775+ auto miSemaphoreList = hwParser.getCommandsList <MI_SEMAPHORE_WAIT>();
776+ EXPECT_EQ (1u , miSemaphoreList.size ());
777+
778+ auto bbStartList = hwParser.getCommandsList <MI_BATCH_BUFFER_START>();
779+ EXPECT_EQ (1u , bbStartList.size ());
780+ auto bbStart = reinterpret_cast <MI_BATCH_BUFFER_START *>(*bbStartList.begin ());
781+ EXPECT_EQ (MI_BATCH_BUFFER_START::SECOND_LEVEL_BATCH_BUFFER::SECOND_LEVEL_BATCH_BUFFER_FIRST_LEVEL_BATCH, bbStart->getSecondLevelBatchBuffer ());
782+ }
783+
784+ HWCMDTEST_F (IGFX_XE_HP_CORE, ImplicitScalingTests,
785+ givenBarrierDispatchWhenApiRequiresSelfCleanupThenExpectDefaultSelfCleanupSection) {
786+ using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
787+ using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
788+ using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
789+ using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
790+ using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START;
791+
792+ size_t expectedSize = sizeof (MI_STORE_DATA_IMM) +
793+ sizeof (PIPE_CONTROL) +
794+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
795+ sizeof (MI_BATCH_BUFFER_START) +
796+ sizeof (WalkerPartition::BarrierControlSection) +
797+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
798+ sizeof (MI_STORE_DATA_IMM) +
799+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT);
800+
801+ size_t estimatedSize = 0 ;
802+ size_t totalBytesProgrammed = 0 ;
803+
804+ estimatedSize = ImplicitScalingDispatch<FamilyType>::getBarrierSize (true );
805+ EXPECT_EQ (expectedSize, estimatedSize);
806+
807+ ImplicitScalingDispatch<FamilyType>::dispatchBarrierCommands (commandStream, twoTile, true , true , true );
808+ totalBytesProgrammed = commandStream.getUsed ();
809+ EXPECT_EQ (expectedSize, totalBytesProgrammed);
810+
811+ HardwareParse hwParser;
812+ hwParser.parsePipeControl = true ;
813+ hwParser.parseCommands <FamilyType>(commandStream, 0 );
814+ hwParser.findHardwareCommands <FamilyType>();
815+
816+ auto storeDataImmList = hwParser.getCommandsList <MI_STORE_DATA_IMM>();
817+ EXPECT_EQ (2u , storeDataImmList.size ());
818+
819+ EXPECT_EQ (1u , hwParser.pipeControlList .size ());
820+ auto pipeControl = reinterpret_cast <PIPE_CONTROL *>(*hwParser.pipeControlList .begin ());
821+ EXPECT_EQ (MemorySynchronizationCommands<FamilyType>::isDcFlushAllowed (), pipeControl->getDcFlushEnable ());
822+
823+ auto miAtomicList = hwParser.getCommandsList <MI_ATOMIC>();
824+ EXPECT_EQ (3u , miAtomicList.size ());
825+
826+ auto miSemaphoreList = hwParser.getCommandsList <MI_SEMAPHORE_WAIT>();
827+ EXPECT_EQ (3u , miSemaphoreList.size ());
828+
829+ auto bbStartList = hwParser.getCommandsList <MI_BATCH_BUFFER_START>();
830+ EXPECT_EQ (1u , bbStartList.size ());
831+ auto bbStart = reinterpret_cast <MI_BATCH_BUFFER_START *>(*bbStartList.begin ());
832+ EXPECT_EQ (MI_BATCH_BUFFER_START::SECOND_LEVEL_BATCH_BUFFER::SECOND_LEVEL_BATCH_BUFFER_SECOND_LEVEL_BATCH, bbStart->getSecondLevelBatchBuffer ());
833+ }
834+
835+ HWCMDTEST_F (IGFX_XE_HP_CORE, ImplicitScalingTests,
836+ givenBarrierDispatchWhenApiRequiresSelfCleanupForcedUseAtomicThenExpectUseAtomicForSelfCleanupSection) {
837+ using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
838+ using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
839+ using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
840+ using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START;
841+
842+ size_t expectedSize = sizeof (MI_ATOMIC) +
843+ sizeof (PIPE_CONTROL) +
844+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
845+ sizeof (MI_BATCH_BUFFER_START) +
846+ sizeof (WalkerPartition::BarrierControlSection) +
847+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
848+ sizeof (MI_ATOMIC) +
849+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT);
850+
851+ DebugManager.flags .UseAtomicsForSelfCleanupSection .set (1 );
852+
853+ size_t estimatedSize = 0 ;
854+ size_t totalBytesProgrammed = 0 ;
855+
856+ estimatedSize = ImplicitScalingDispatch<FamilyType>::getBarrierSize (true );
857+ EXPECT_EQ (expectedSize, estimatedSize);
858+
859+ ImplicitScalingDispatch<FamilyType>::dispatchBarrierCommands (commandStream, twoTile, true , true , true );
860+ totalBytesProgrammed = commandStream.getUsed ();
861+ EXPECT_EQ (expectedSize, totalBytesProgrammed);
862+
863+ HardwareParse hwParser;
864+ hwParser.parsePipeControl = true ;
865+ hwParser.parseCommands <FamilyType>(commandStream, 0 );
866+ hwParser.findHardwareCommands <FamilyType>();
867+
868+ EXPECT_EQ (1u , hwParser.pipeControlList .size ());
869+ auto pipeControl = reinterpret_cast <PIPE_CONTROL *>(*hwParser.pipeControlList .begin ());
870+ EXPECT_EQ (MemorySynchronizationCommands<FamilyType>::isDcFlushAllowed (), pipeControl->getDcFlushEnable ());
871+
872+ auto miAtomicList = hwParser.getCommandsList <MI_ATOMIC>();
873+ EXPECT_EQ (5u , miAtomicList.size ());
874+
875+ auto miSemaphoreList = hwParser.getCommandsList <MI_SEMAPHORE_WAIT>();
876+ EXPECT_EQ (3u , miSemaphoreList.size ());
877+
878+ auto bbStartList = hwParser.getCommandsList <MI_BATCH_BUFFER_START>();
879+ EXPECT_EQ (1u , bbStartList.size ());
880+ auto bbStart = reinterpret_cast <MI_BATCH_BUFFER_START *>(*bbStartList.begin ());
881+ EXPECT_EQ (MI_BATCH_BUFFER_START::SECOND_LEVEL_BATCH_BUFFER::SECOND_LEVEL_BATCH_BUFFER_SECOND_LEVEL_BATCH, bbStart->getSecondLevelBatchBuffer ());
882+ }
0 commit comments