Skip to content

Commit e450434

Browse files
fix: dispatch state base address once after heap reload
Related-To: NEO-7963 Signed-off-by: Zbigniew Zdanowicz <[email protected]>
1 parent 9f755b5 commit e450434

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

level_zero/core/source/cmdlist/cmdlist_hw.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2687,6 +2687,7 @@ void CommandListCoreFamily<gfxCoreFamily>::updateStreamPropertiesForRegularComma
26872687
if (logicalStateHelperBlock && this->stateBaseAddressTracking && finalStreamState.stateBaseAddress.isDirty()) {
26882688
commandContainer.setDirtyStateForAllHeaps(false);
26892689
programStateBaseAddress(commandContainer, true);
2690+
finalStreamState.stateBaseAddress.clearIsDirty();
26902691
}
26912692
}
26922693

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_5.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,6 +1421,126 @@ HWTEST2_F(CommandListStateBaseAddressPrivateHeapTest,
14211421
EXPECT_EQ((statlessMocs << 1), sbaCmd->getStatelessDataPortAccessMemoryObjectControlState());
14221422
}
14231423

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+
14241544
HWTEST2_F(CommandListStateBaseAddressPrivateHeapTest,
14251545
givenStateBaseAddressTrackingWhenImmediateCmdListAppendKernelChangesHeapsAndExecuteThenFinalBaseAddressStateIsStoredInCsr,
14261546
IsAtLeastSkl) {

0 commit comments

Comments
 (0)