@@ -1421,6 +1421,126 @@ HWTEST2_F(CommandListStateBaseAddressPrivateHeapTest,
1421
1421
EXPECT_EQ ((statlessMocs << 1 ), sbaCmd->getStatelessDataPortAccessMemoryObjectControlState ());
1422
1422
}
1423
1423
1424
+ HWTEST2_F (CommandListStateBaseAddressPrivateHeapTest,
1425
+ givenStateBaseAddressTrackingWhenRegularCmdListAppendKernelChangesHeapsAndNextKernelIsAppendedThenFinalBaseAddressStateIsDispatchedInCommandListOnce,
1426
+ IsAtLeastSkl) {
1427
+ using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
1428
+
1429
+ EXPECT_TRUE (commandList->stateBaseAddressTracking );
1430
+
1431
+ auto &container = commandList->getCmdContainer ();
1432
+ auto &cmdListStream = *container.getCommandStream ();
1433
+
1434
+ ze_group_count_t groupCount{1 , 1 , 1 };
1435
+ CmdListKernelLaunchParams launchParams = {};
1436
+ auto result = commandList->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams, false );
1437
+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1438
+
1439
+ GenCmdList cmdList;
1440
+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1441
+ cmdList,
1442
+ cmdListStream.getCpuBase (),
1443
+ cmdListStream.getUsed ()));
1444
+ auto sbaCmds = findAll<STATE_BASE_ADDRESS *>(cmdList.begin (), cmdList.end ());
1445
+ ASSERT_EQ (0u , sbaCmds.size ());
1446
+
1447
+ auto sshHeap = container.getIndirectHeap (NEO::HeapType::SURFACE_STATE);
1448
+ uint64_t ssBaseAddress = sshHeap->getHeapGpuBase ();
1449
+ uint64_t ssSize = sshHeap->getHeapSizeInPages ();
1450
+
1451
+ uint64_t dsBaseAddress = -1 ;
1452
+ uint32_t dsBaseSize = 0 ;
1453
+ uint32_t dsFirstBaseSize = 0 ;
1454
+
1455
+ size_t dsSize = static_cast <size_t >(-1 );
1456
+
1457
+ auto dshHeap = container.getIndirectHeap (NEO::HeapType::DYNAMIC_STATE);
1458
+ if (dshHeap) {
1459
+ dsBaseAddress = dshHeap->getHeapGpuBase ();
1460
+ dsSize = dsFirstBaseSize = dshHeap->getHeapSizeInPages ();
1461
+ }
1462
+ auto statlessMocs = getMocs (true );
1463
+
1464
+ auto &requiredState = commandList->requiredStreamState .stateBaseAddress ;
1465
+ auto &finalState = commandList->finalStreamState .stateBaseAddress ;
1466
+
1467
+ EXPECT_EQ (static_cast <int64_t >(ssBaseAddress), requiredState.surfaceStateBaseAddress .value );
1468
+ EXPECT_EQ (ssSize, requiredState.surfaceStateSize .value );
1469
+ EXPECT_EQ (static_cast <int64_t >(dsBaseAddress), requiredState.dynamicStateBaseAddress .value );
1470
+ EXPECT_EQ (dsSize, requiredState.dynamicStateSize .value );
1471
+
1472
+ EXPECT_EQ (finalState.surfaceStateBaseAddress .value , requiredState.surfaceStateBaseAddress .value );
1473
+ EXPECT_EQ (finalState.surfaceStateSize .value , requiredState.surfaceStateSize .value );
1474
+
1475
+ EXPECT_EQ (finalState.dynamicStateBaseAddress .value , requiredState.dynamicStateBaseAddress .value );
1476
+ EXPECT_EQ (finalState.dynamicStateSize .value , requiredState.dynamicStateSize .value );
1477
+
1478
+ sshHeap->getSpace (sshHeap->getAvailableSpace ());
1479
+ container.getHeapWithRequiredSizeAndAlignment (NEO::HeapType::SURFACE_STATE, sshHeap->getMaxAvailableSpace (), 0 );
1480
+
1481
+ if (dshHeap) {
1482
+ dshHeap->getSpace (dshHeap->getAvailableSpace ());
1483
+ container.getHeapWithRequiredSizeAndAlignment (NEO::HeapType::DYNAMIC_STATE, dshHeap->getMaxAvailableSpace (), 0 );
1484
+ }
1485
+
1486
+ result = commandList->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams, false );
1487
+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1488
+
1489
+ ssBaseAddress = sshHeap->getGpuBase ();
1490
+ if (dshHeap) {
1491
+ dsBaseAddress = dshHeap->getGpuBase ();
1492
+ dsBaseSize = dshHeap->getHeapSizeInPages ();
1493
+ }
1494
+
1495
+ EXPECT_NE (static_cast <int64_t >(ssBaseAddress), requiredState.surfaceStateBaseAddress .value );
1496
+ if (dshHeap) {
1497
+ EXPECT_NE (static_cast <int64_t >(dsBaseAddress), requiredState.dynamicStateBaseAddress .value );
1498
+ } else {
1499
+ EXPECT_EQ (static_cast <int64_t >(dsBaseAddress), requiredState.dynamicStateBaseAddress .value );
1500
+ }
1501
+
1502
+ EXPECT_EQ (static_cast <int64_t >(ssBaseAddress), finalState.surfaceStateBaseAddress .value );
1503
+ EXPECT_EQ (static_cast <int64_t >(dsBaseAddress), finalState.dynamicStateBaseAddress .value );
1504
+
1505
+ cmdList.clear ();
1506
+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1507
+ cmdList,
1508
+ cmdListStream.getCpuBase (),
1509
+ cmdListStream.getUsed ()));
1510
+ sbaCmds = findAll<STATE_BASE_ADDRESS *>(cmdList.begin (), cmdList.end ());
1511
+ ASSERT_EQ (expectedSbaCmds, sbaCmds.size ());
1512
+
1513
+ auto sbaCmd = reinterpret_cast <STATE_BASE_ADDRESS *>(*sbaCmds[0 ]);
1514
+
1515
+ if (this ->dshRequired ) {
1516
+ EXPECT_TRUE (sbaCmd->getDynamicStateBaseAddressModifyEnable ());
1517
+ EXPECT_TRUE (sbaCmd->getDynamicStateBufferSizeModifyEnable ());
1518
+ EXPECT_EQ (dsBaseAddress, sbaCmd->getDynamicStateBaseAddress ());
1519
+ EXPECT_EQ (dsBaseSize, sbaCmd->getDynamicStateBufferSize ());
1520
+ } else {
1521
+ EXPECT_FALSE (sbaCmd->getDynamicStateBaseAddressModifyEnable ());
1522
+ EXPECT_FALSE (sbaCmd->getDynamicStateBufferSizeModifyEnable ());
1523
+ EXPECT_EQ (0u , sbaCmd->getDynamicStateBaseAddress ());
1524
+ EXPECT_EQ (0u , sbaCmd->getDynamicStateBufferSize ());
1525
+ }
1526
+
1527
+ EXPECT_TRUE (sbaCmd->getSurfaceStateBaseAddressModifyEnable ());
1528
+ EXPECT_EQ (ssBaseAddress, sbaCmd->getSurfaceStateBaseAddress ());
1529
+ EXPECT_EQ ((statlessMocs << 1 ), sbaCmd->getStatelessDataPortAccessMemoryObjectControlState ());
1530
+
1531
+ size_t sizeBefore = cmdListStream.getUsed ();
1532
+ result = commandList->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams, false );
1533
+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1534
+
1535
+ cmdList.clear ();
1536
+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1537
+ cmdList,
1538
+ ptrOffset (cmdListStream.getCpuBase (), sizeBefore),
1539
+ cmdListStream.getUsed () - sizeBefore));
1540
+ sbaCmds = findAll<STATE_BASE_ADDRESS *>(cmdList.begin (), cmdList.end ());
1541
+ ASSERT_EQ (0u , sbaCmds.size ());
1542
+ }
1543
+
1424
1544
HWTEST2_F (CommandListStateBaseAddressPrivateHeapTest,
1425
1545
givenStateBaseAddressTrackingWhenImmediateCmdListAppendKernelChangesHeapsAndExecuteThenFinalBaseAddressStateIsStoredInCsr,
1426
1546
IsAtLeastSkl) {
0 commit comments