@@ -1384,5 +1384,251 @@ HWTEST2_F(MultiReturnCommandListTest,
13841384 }
13851385}
13861386
1387+ HWTEST2_F (MultiReturnCommandListTest, givenCmdQueueAndImmediateCmdListUseSameCsrWhenAppendingKernelOnBothRegularFirstThenFrontEndStateIsNotChanged, IsAtLeastSkl) {
1388+ using VFE_STATE_TYPE = typename FamilyType::VFE_STATE_TYPE;
1389+ NEO::FrontEndPropertiesSupport fePropertiesSupport = {};
1390+ NEO::HwInfoConfig::get (productFamily)->fillFrontEndPropertiesSupportStructure (fePropertiesSupport, device->getHwInfo ());
1391+
1392+ EXPECT_TRUE (commandList->multiReturnPointCommandList );
1393+ EXPECT_TRUE (commandListImmediate->multiReturnPointCommandList );
1394+
1395+ auto ®ularCmdListStream = *commandList->commandContainer .getCommandStream ();
1396+
1397+ ze_group_count_t groupCount{1 , 1 , 1 };
1398+ CmdListKernelLaunchParams launchParams = {};
1399+ mockKernelImmData->kernelDescriptor ->kernelAttributes .flags .requiresDisabledEUFusion = 1 ;
1400+
1401+ size_t usedBefore = regularCmdListStream.getUsed ();
1402+ ze_result_t result = commandList->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams);
1403+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1404+ size_t usedAfter = regularCmdListStream.getUsed ();
1405+
1406+ auto ®ularCmdListRequiredState = commandList->getRequiredStreamState ();
1407+ auto ®ularCmdListFinalState = commandList->getFinalStreamState ();
1408+
1409+ if (fePropertiesSupport.disableEuFusion ) {
1410+ EXPECT_EQ (1 , regularCmdListRequiredState.frontEndState .disableEUFusion .value );
1411+ EXPECT_EQ (1 , regularCmdListFinalState.frontEndState .disableEUFusion .value );
1412+ } else {
1413+ EXPECT_EQ (-1 , regularCmdListRequiredState.frontEndState .disableEUFusion .value );
1414+ EXPECT_EQ (-1 , regularCmdListFinalState.frontEndState .disableEUFusion .value );
1415+ }
1416+
1417+ GenCmdList cmdList;
1418+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1419+ cmdList,
1420+ ptrOffset (regularCmdListStream.getCpuBase (), usedBefore),
1421+ (usedAfter - usedBefore)));
1422+ auto feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1423+ EXPECT_EQ (0u , feStateCmds.size ());
1424+
1425+ auto &cmdQueueStream = commandQueue->commandStream ;
1426+ auto cmdListHandle = commandList->toHandle ();
1427+
1428+ usedBefore = cmdQueueStream.getUsed ();
1429+ result = commandQueue->executeCommandLists (1 , &cmdListHandle, nullptr , false );
1430+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1431+ usedAfter = cmdQueueStream.getUsed ();
1432+
1433+ auto cmdQueueCsr = commandQueue->getCsr ();
1434+ auto &csrProperties = cmdQueueCsr->getStreamProperties ();
1435+
1436+ if (fePropertiesSupport.disableEuFusion ) {
1437+ EXPECT_EQ (1 , csrProperties.frontEndState .disableEUFusion .value );
1438+ } else {
1439+ EXPECT_EQ (-1 , csrProperties.frontEndState .disableEUFusion .value );
1440+ }
1441+
1442+ cmdList.clear ();
1443+ feStateCmds.clear ();
1444+
1445+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1446+ cmdList,
1447+ ptrOffset (cmdQueueStream.getCpuBase (), usedBefore),
1448+ (usedAfter - usedBefore)));
1449+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1450+ ASSERT_EQ (1u , feStateCmds.size ());
1451+ auto &feState = *genCmdCast<VFE_STATE_TYPE *>(*feStateCmds[0 ]);
1452+ if (fePropertiesSupport.disableEuFusion ) {
1453+ EXPECT_TRUE (NEO::UnitTestHelper<FamilyType>::getDisableFusionStateFromFrontEndCommand (feState));
1454+ } else {
1455+ EXPECT_FALSE (NEO::UnitTestHelper<FamilyType>::getDisableFusionStateFromFrontEndCommand (feState));
1456+ }
1457+
1458+ auto &immediateCmdListStream = *commandListImmediate->commandContainer .getCommandStream ();
1459+ auto &ultCsr = neoDevice->getUltCommandStreamReceiver <FamilyType>();
1460+ auto &csrStream = ultCsr.commandStream ;
1461+
1462+ size_t csrUsedBefore = csrStream.getUsed ();
1463+ usedBefore = immediateCmdListStream.getUsed ();
1464+ result = commandListImmediate->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams);
1465+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1466+ usedAfter = immediateCmdListStream.getUsed ();
1467+ size_t csrUsedAfter = csrStream.getUsed ();
1468+
1469+ auto &immediateCmdListRequiredState = commandListImmediate->getRequiredStreamState ();
1470+ auto &immediateCmdListFinalState = commandListImmediate->getFinalStreamState ();
1471+
1472+ if (fePropertiesSupport.disableEuFusion ) {
1473+ EXPECT_EQ (1 , immediateCmdListRequiredState.frontEndState .disableEUFusion .value );
1474+ EXPECT_EQ (1 , immediateCmdListFinalState.frontEndState .disableEUFusion .value );
1475+ } else {
1476+ EXPECT_EQ (-1 , immediateCmdListRequiredState.frontEndState .disableEUFusion .value );
1477+ EXPECT_EQ (-1 , immediateCmdListFinalState.frontEndState .disableEUFusion .value );
1478+ }
1479+
1480+ cmdList.clear ();
1481+ feStateCmds.clear ();
1482+
1483+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1484+ cmdList,
1485+ ptrOffset (immediateCmdListStream.getCpuBase (), usedBefore),
1486+ (usedAfter - usedBefore)));
1487+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1488+ EXPECT_EQ (0u , feStateCmds.size ());
1489+
1490+ auto immediateCsr = commandListImmediate->csr ;
1491+ EXPECT_EQ (cmdQueueCsr, immediateCsr);
1492+
1493+ if (fePropertiesSupport.disableEuFusion ) {
1494+ EXPECT_EQ (1 , csrProperties.frontEndState .disableEUFusion .value );
1495+ } else {
1496+ EXPECT_EQ (-1 , csrProperties.frontEndState .disableEUFusion .value );
1497+ }
1498+
1499+ cmdList.clear ();
1500+ feStateCmds.clear ();
1501+
1502+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1503+ cmdList,
1504+ ptrOffset (csrStream.getCpuBase (), csrUsedBefore),
1505+ (csrUsedAfter - csrUsedBefore)));
1506+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1507+ EXPECT_EQ (0u , feStateCmds.size ());
1508+ }
1509+
1510+ HWTEST2_F (MultiReturnCommandListTest, givenCmdQueueAndImmediateCmdListUseSameCsrWhenAppendingKernelOnBothImmediateFirstThenFrontEndStateIsNotChanged, IsAtLeastSkl) {
1511+ using VFE_STATE_TYPE = typename FamilyType::VFE_STATE_TYPE;
1512+ NEO::FrontEndPropertiesSupport fePropertiesSupport = {};
1513+ NEO::HwInfoConfig::get (productFamily)->fillFrontEndPropertiesSupportStructure (fePropertiesSupport, device->getHwInfo ());
1514+
1515+ EXPECT_TRUE (commandList->multiReturnPointCommandList );
1516+ EXPECT_TRUE (commandListImmediate->multiReturnPointCommandList );
1517+
1518+ auto cmdQueueCsr = commandQueue->getCsr ();
1519+ auto &csrProperties = cmdQueueCsr->getStreamProperties ();
1520+
1521+ auto immediateCsr = commandListImmediate->csr ;
1522+ EXPECT_EQ (cmdQueueCsr, immediateCsr);
1523+
1524+ ze_group_count_t groupCount{1 , 1 , 1 };
1525+ CmdListKernelLaunchParams launchParams = {};
1526+ mockKernelImmData->kernelDescriptor ->kernelAttributes .flags .requiresDisabledEUFusion = 1 ;
1527+
1528+ auto &immediateCmdListStream = *commandListImmediate->commandContainer .getCommandStream ();
1529+ auto &ultCsr = neoDevice->getUltCommandStreamReceiver <FamilyType>();
1530+ auto &csrStream = ultCsr.commandStream ;
1531+
1532+ size_t csrUsedBefore = csrStream.getUsed ();
1533+ size_t usedBefore = immediateCmdListStream.getUsed ();
1534+ ze_result_t result = commandListImmediate->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams);
1535+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1536+ size_t usedAfter = immediateCmdListStream.getUsed ();
1537+ size_t csrUsedAfter = csrStream.getUsed ();
1538+
1539+ auto &immediateCmdListRequiredState = commandListImmediate->getRequiredStreamState ();
1540+ auto &immediateCmdListFinalState = commandListImmediate->getFinalStreamState ();
1541+
1542+ if (fePropertiesSupport.disableEuFusion ) {
1543+ EXPECT_EQ (1 , immediateCmdListRequiredState.frontEndState .disableEUFusion .value );
1544+ EXPECT_EQ (1 , immediateCmdListFinalState.frontEndState .disableEUFusion .value );
1545+ } else {
1546+ EXPECT_EQ (-1 , immediateCmdListRequiredState.frontEndState .disableEUFusion .value );
1547+ EXPECT_EQ (-1 , immediateCmdListFinalState.frontEndState .disableEUFusion .value );
1548+ }
1549+
1550+ GenCmdList cmdList;
1551+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1552+ cmdList,
1553+ ptrOffset (immediateCmdListStream.getCpuBase (), usedBefore),
1554+ (usedAfter - usedBefore)));
1555+ auto feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1556+ EXPECT_EQ (0u , feStateCmds.size ());
1557+
1558+ if (fePropertiesSupport.disableEuFusion ) {
1559+ EXPECT_EQ (1 , csrProperties.frontEndState .disableEUFusion .value );
1560+ } else {
1561+ EXPECT_EQ (-1 , csrProperties.frontEndState .disableEUFusion .value );
1562+ }
1563+
1564+ cmdList.clear ();
1565+ feStateCmds.clear ();
1566+
1567+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1568+ cmdList,
1569+ ptrOffset (csrStream.getCpuBase (), csrUsedBefore),
1570+ (csrUsedAfter - csrUsedBefore)));
1571+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1572+ ASSERT_EQ (1u , feStateCmds.size ());
1573+ auto &feState = *genCmdCast<VFE_STATE_TYPE *>(*feStateCmds[0 ]);
1574+ if (fePropertiesSupport.disableEuFusion ) {
1575+ EXPECT_TRUE (NEO::UnitTestHelper<FamilyType>::getDisableFusionStateFromFrontEndCommand (feState));
1576+ } else {
1577+ EXPECT_FALSE (NEO::UnitTestHelper<FamilyType>::getDisableFusionStateFromFrontEndCommand (feState));
1578+ }
1579+
1580+ auto ®ularCmdListStream = *commandList->commandContainer .getCommandStream ();
1581+
1582+ usedBefore = regularCmdListStream.getUsed ();
1583+ result = commandList->appendLaunchKernel (kernel->toHandle (), &groupCount, nullptr , 0 , nullptr , launchParams);
1584+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1585+ usedAfter = regularCmdListStream.getUsed ();
1586+
1587+ auto ®ularCmdListRequiredState = commandList->getRequiredStreamState ();
1588+ auto ®ularCmdListFinalState = commandList->getFinalStreamState ();
1589+
1590+ if (fePropertiesSupport.disableEuFusion ) {
1591+ EXPECT_EQ (1 , regularCmdListRequiredState.frontEndState .disableEUFusion .value );
1592+ EXPECT_EQ (1 , regularCmdListFinalState.frontEndState .disableEUFusion .value );
1593+ } else {
1594+ EXPECT_EQ (-1 , regularCmdListRequiredState.frontEndState .disableEUFusion .value );
1595+ EXPECT_EQ (-1 , regularCmdListFinalState.frontEndState .disableEUFusion .value );
1596+ }
1597+
1598+ cmdList.clear ();
1599+ feStateCmds.clear ();
1600+
1601+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1602+ cmdList,
1603+ ptrOffset (regularCmdListStream.getCpuBase (), usedBefore),
1604+ (usedAfter - usedBefore)));
1605+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1606+ EXPECT_EQ (0u , feStateCmds.size ());
1607+
1608+ auto &cmdQueueStream = commandQueue->commandStream ;
1609+ auto cmdListHandle = commandList->toHandle ();
1610+
1611+ usedBefore = cmdQueueStream.getUsed ();
1612+ result = commandQueue->executeCommandLists (1 , &cmdListHandle, nullptr , false );
1613+ EXPECT_EQ (ZE_RESULT_SUCCESS, result);
1614+ usedAfter = cmdQueueStream.getUsed ();
1615+
1616+ if (fePropertiesSupport.disableEuFusion ) {
1617+ EXPECT_EQ (1 , csrProperties.frontEndState .disableEUFusion .value );
1618+ } else {
1619+ EXPECT_EQ (-1 , csrProperties.frontEndState .disableEUFusion .value );
1620+ }
1621+
1622+ cmdList.clear ();
1623+ feStateCmds.clear ();
1624+
1625+ ASSERT_TRUE (FamilyType::PARSE::parseCommandBuffer (
1626+ cmdList,
1627+ ptrOffset (cmdQueueStream.getCpuBase (), usedBefore),
1628+ (usedAfter - usedBefore)));
1629+ feStateCmds = findAll<VFE_STATE_TYPE *>(cmdList.begin (), cmdList.end ());
1630+ EXPECT_EQ (0u , feStateCmds.size ());
1631+ }
1632+
13871633} // namespace ult
13881634} // namespace L0
0 commit comments