77
88#include " shared/source/command_container/command_encoder.h"
99#include " shared/test/common/cmd_parse/gen_cmd_parse.h"
10+ #include " shared/test/common/helpers/unit_test_helper.h"
1011
1112#include " test.h"
1213
@@ -79,5 +80,142 @@ HWTEST_F(CommandListAppendBarrier, GivenEventVsNoEventWhenAppendingBarrierThenCo
7980
8081 ASSERT_LE (sizeWithoutEvent, sizeWithEvent);
8182}
83+
84+ using MultiTileCommandListAppendBarrier = Test<MultiTileCommandListFixture>;
85+
86+ HWTEST2_F (MultiTileCommandListAppendBarrier, WhenAppendingBarrierThenPipeControlIsGenerated, IsWithinXeGfxFamily) {
87+ using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
88+ using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START;
89+ using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
90+ using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
91+ using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
92+
93+ size_t beforeControlSectionOffset = sizeof (MI_STORE_DATA_IMM) +
94+ sizeof (PIPE_CONTROL) +
95+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
96+ sizeof (MI_BATCH_BUFFER_START);
97+
98+ size_t startOffset = beforeControlSectionOffset +
99+ (2 * sizeof (uint32_t ));
100+
101+ size_t expectedUseBuffer = startOffset +
102+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT) +
103+ sizeof (MI_STORE_DATA_IMM) +
104+ sizeof (MI_ATOMIC) + sizeof (MI_SEMAPHORE_WAIT);
105+
106+ auto usedSpaceBefore = commandList->commandContainer .getCommandStream ()->getUsed ();
107+ auto gpuBaseAddress = commandList->commandContainer .getCommandStream ()->getGraphicsAllocation ()->getGpuAddress () +
108+ usedSpaceBefore;
109+
110+ auto gpuCrossTileSyncAddress = gpuBaseAddress +
111+ beforeControlSectionOffset;
112+
113+ auto gpuFinalSyncAddress = gpuCrossTileSyncAddress +
114+ sizeof (uint32_t );
115+
116+ auto gpuStartAddress = gpuBaseAddress +
117+ startOffset;
118+
119+ auto result = commandList->appendBarrier (nullptr , 0 , nullptr );
120+ ASSERT_EQ (ZE_RESULT_SUCCESS, result);
121+
122+ auto usedSpaceAfter = commandList->commandContainer .getCommandStream ()->getUsed ();
123+ ASSERT_GT (usedSpaceAfter, usedSpaceBefore);
124+ size_t usedBuffer = usedSpaceAfter - usedSpaceBefore;
125+ EXPECT_EQ (expectedUseBuffer, usedBuffer);
126+
127+ void *cmdBuffer = ptrOffset (commandList->commandContainer .getCommandStream ()->getCpuBase (), usedSpaceBefore);
128+ size_t parsedOffset = 0 ;
129+
130+ {
131+ auto storeDataImm = genCmdCast<MI_STORE_DATA_IMM *>(ptrOffset (cmdBuffer, parsedOffset));
132+ ASSERT_NE (nullptr , storeDataImm);
133+ EXPECT_EQ (gpuFinalSyncAddress, storeDataImm->getAddress ());
134+ EXPECT_EQ (0u , storeDataImm->getDataDword0 ());
135+ parsedOffset += sizeof (MI_STORE_DATA_IMM);
136+ }
137+ {
138+ auto pipeControl = genCmdCast<PIPE_CONTROL *>(ptrOffset (cmdBuffer, parsedOffset));
139+ ASSERT_NE (nullptr , pipeControl);
140+ EXPECT_TRUE (pipeControl->getCommandStreamerStallEnable ());
141+ EXPECT_FALSE (pipeControl->getDcFlushEnable ());
142+ parsedOffset += sizeof (PIPE_CONTROL);
143+ }
144+ {
145+ auto miAtomic = genCmdCast<MI_ATOMIC *>(ptrOffset (cmdBuffer, parsedOffset));
146+ ASSERT_NE (nullptr , miAtomic);
147+ auto miAtomicProgrammedAddress = NEO::UnitTestHelper<FamilyType>::getAtomicMemoryAddress (*miAtomic);
148+ EXPECT_EQ (gpuCrossTileSyncAddress, miAtomicProgrammedAddress);
149+ EXPECT_FALSE (miAtomic->getReturnDataControl ());
150+ EXPECT_EQ (MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, miAtomic->getAtomicOpcode ());
151+ parsedOffset += sizeof (MI_ATOMIC);
152+ }
153+ {
154+ auto miSemaphore = genCmdCast<MI_SEMAPHORE_WAIT *>(ptrOffset (cmdBuffer, parsedOffset));
155+ ASSERT_NE (nullptr , miSemaphore);
156+ EXPECT_EQ (gpuCrossTileSyncAddress, miSemaphore->getSemaphoreGraphicsAddress ());
157+ EXPECT_EQ (MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD, miSemaphore->getCompareOperation ());
158+ EXPECT_EQ (2u , miSemaphore->getSemaphoreDataDword ());
159+ parsedOffset += sizeof (MI_SEMAPHORE_WAIT);
160+ }
161+ {
162+ auto bbStart = genCmdCast<MI_BATCH_BUFFER_START *>(ptrOffset (cmdBuffer, parsedOffset));
163+ ASSERT_NE (nullptr , bbStart);
164+ EXPECT_EQ (gpuStartAddress, bbStart->getBatchBufferStartAddress ());
165+ EXPECT_EQ (MI_BATCH_BUFFER_START::SECOND_LEVEL_BATCH_BUFFER::SECOND_LEVEL_BATCH_BUFFER_SECOND_LEVEL_BATCH, bbStart->getSecondLevelBatchBuffer ());
166+ parsedOffset += sizeof (MI_BATCH_BUFFER_START);
167+ }
168+ {
169+ auto crossField = reinterpret_cast <uint32_t *>(ptrOffset (cmdBuffer, parsedOffset));
170+ EXPECT_EQ (0u , *crossField);
171+ parsedOffset += sizeof (uint32_t );
172+ auto finalField = reinterpret_cast <uint32_t *>(ptrOffset (cmdBuffer, parsedOffset));
173+ EXPECT_EQ (0u , *finalField);
174+ parsedOffset += sizeof (uint32_t );
175+ }
176+ {
177+ auto miAtomic = genCmdCast<MI_ATOMIC *>(ptrOffset (cmdBuffer, parsedOffset));
178+ ASSERT_NE (nullptr , miAtomic);
179+ auto miAtomicProgrammedAddress = NEO::UnitTestHelper<FamilyType>::getAtomicMemoryAddress (*miAtomic);
180+ EXPECT_EQ (gpuFinalSyncAddress, miAtomicProgrammedAddress);
181+ EXPECT_FALSE (miAtomic->getReturnDataControl ());
182+ EXPECT_EQ (MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, miAtomic->getAtomicOpcode ());
183+ parsedOffset += sizeof (MI_ATOMIC);
184+ }
185+ {
186+ auto miSemaphore = genCmdCast<MI_SEMAPHORE_WAIT *>(ptrOffset (cmdBuffer, parsedOffset));
187+ ASSERT_NE (nullptr , miSemaphore);
188+ EXPECT_EQ (gpuFinalSyncAddress, miSemaphore->getSemaphoreGraphicsAddress ());
189+ EXPECT_EQ (MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD, miSemaphore->getCompareOperation ());
190+ EXPECT_EQ (2u , miSemaphore->getSemaphoreDataDword ());
191+ parsedOffset += sizeof (MI_SEMAPHORE_WAIT);
192+ }
193+ {
194+ auto storeDataImm = genCmdCast<MI_STORE_DATA_IMM *>(ptrOffset (cmdBuffer, parsedOffset));
195+ ASSERT_NE (nullptr , storeDataImm);
196+ EXPECT_EQ (gpuCrossTileSyncAddress, storeDataImm->getAddress ());
197+ EXPECT_EQ (0u , storeDataImm->getDataDword0 ());
198+ parsedOffset += sizeof (MI_STORE_DATA_IMM);
199+ }
200+ {
201+ auto miAtomic = genCmdCast<MI_ATOMIC *>(ptrOffset (cmdBuffer, parsedOffset));
202+ ASSERT_NE (nullptr , miAtomic);
203+ auto miAtomicProgrammedAddress = NEO::UnitTestHelper<FamilyType>::getAtomicMemoryAddress (*miAtomic);
204+ EXPECT_EQ (gpuFinalSyncAddress, miAtomicProgrammedAddress);
205+ EXPECT_FALSE (miAtomic->getReturnDataControl ());
206+ EXPECT_EQ (MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, miAtomic->getAtomicOpcode ());
207+ parsedOffset += sizeof (MI_ATOMIC);
208+ }
209+ {
210+ auto miSemaphore = genCmdCast<MI_SEMAPHORE_WAIT *>(ptrOffset (cmdBuffer, parsedOffset));
211+ ASSERT_NE (nullptr , miSemaphore);
212+ EXPECT_EQ (gpuFinalSyncAddress, miSemaphore->getSemaphoreGraphicsAddress ());
213+ EXPECT_EQ (MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD, miSemaphore->getCompareOperation ());
214+ EXPECT_EQ (4u , miSemaphore->getSemaphoreDataDword ());
215+ parsedOffset += sizeof (MI_SEMAPHORE_WAIT);
216+ }
217+ EXPECT_EQ (expectedUseBuffer, parsedOffset);
218+ }
219+
82220} // namespace ult
83- } // namespace L0
221+ } // namespace L0
0 commit comments