Skip to content

Commit 232dc59

Browse files
Make specific SBA heaps programming optional
Change-Id: I852a9e1d9bcc5d6227b1e8a81ab81ad896d6586f Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
1 parent 632134d commit 232dc59

File tree

5 files changed

+92
-44
lines changed

5 files changed

+92
-44
lines changed

core/helpers/state_base_address.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ struct StateBaseAddressHelper {
2222

2323
static void programStateBaseAddress(
2424
LinearStream &commandStream,
25-
const IndirectHeap &dsh,
26-
const IndirectHeap &ioh,
27-
const IndirectHeap &ssh,
25+
const IndirectHeap *dsh,
26+
const IndirectHeap *ioh,
27+
const IndirectHeap *ssh,
2828
uint64_t generalStateBase,
2929
uint32_t statelessMocsIndex,
3030
uint64_t internalHeapBase,
@@ -33,9 +33,9 @@ struct StateBaseAddressHelper {
3333

3434
static void appendStateBaseAddressParameters(
3535
STATE_BASE_ADDRESS *stateBaseAddress,
36-
const IndirectHeap &dsh,
37-
const IndirectHeap &ioh,
38-
const IndirectHeap &ssh,
36+
const IndirectHeap *dsh,
37+
const IndirectHeap *ioh,
38+
const IndirectHeap *ssh,
3939
uint64_t generalStateBase,
4040
uint64_t internalHeapBase,
4141
GmmHelper *gmmHelper,

core/helpers/state_base_address_base.inl

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ namespace NEO {
1616
template <typename GfxFamily>
1717
void StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
1818
LinearStream &commandStream,
19-
const IndirectHeap &dsh,
20-
const IndirectHeap &ioh,
21-
const IndirectHeap &ssh,
19+
const IndirectHeap *dsh,
20+
const IndirectHeap *ioh,
21+
const IndirectHeap *ssh,
2222
uint64_t generalStateBase,
2323
uint32_t statelessMocsIndex,
2424
uint64_t internalHeapBase,
@@ -28,32 +28,36 @@ void StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
2828
auto pCmd = static_cast<STATE_BASE_ADDRESS *>(commandStream.getSpace(sizeof(STATE_BASE_ADDRESS)));
2929
*pCmd = GfxFamily::cmdInitStateBaseAddress;
3030

31-
pCmd->setDynamicStateBaseAddressModifyEnable(true);
32-
pCmd->setGeneralStateBaseAddressModifyEnable(true);
33-
pCmd->setSurfaceStateBaseAddressModifyEnable(true);
34-
pCmd->setIndirectObjectBaseAddressModifyEnable(true);
35-
pCmd->setInstructionBaseAddressModifyEnable(true);
31+
if (dsh) {
32+
pCmd->setDynamicStateBaseAddressModifyEnable(true);
33+
pCmd->setDynamicStateBufferSizeModifyEnable(true);
34+
pCmd->setDynamicStateBaseAddress(dsh->getHeapGpuBase());
35+
pCmd->setDynamicStateBufferSize(dsh->getHeapSizeInPages());
36+
}
3637

37-
pCmd->setDynamicStateBaseAddress(dsh.getHeapGpuBase());
38-
// GSH must be set to 0 for stateless
39-
pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase));
38+
if (ioh) {
39+
pCmd->setIndirectObjectBaseAddressModifyEnable(true);
40+
pCmd->setIndirectObjectBufferSizeModifyEnable(true);
41+
pCmd->setIndirectObjectBaseAddress(ioh->getHeapGpuBase());
42+
pCmd->setIndirectObjectBufferSize(ioh->getHeapSizeInPages());
43+
}
4044

41-
pCmd->setSurfaceStateBaseAddress(ssh.getHeapGpuBase());
42-
pCmd->setInstructionBaseAddress(internalHeapBase);
45+
if (ssh) {
46+
pCmd->setSurfaceStateBaseAddressModifyEnable(true);
47+
pCmd->setSurfaceStateBaseAddress(ssh->getHeapGpuBase());
48+
}
4349

44-
pCmd->setDynamicStateBufferSizeModifyEnable(true);
45-
pCmd->setGeneralStateBufferSizeModifyEnable(true);
46-
pCmd->setIndirectObjectBufferSizeModifyEnable(true);
50+
pCmd->setInstructionBaseAddressModifyEnable(true);
51+
pCmd->setInstructionBaseAddress(internalHeapBase);
4752
pCmd->setInstructionBufferSizeModifyEnable(true);
53+
pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities);
4854

49-
pCmd->setDynamicStateBufferSize(dsh.getHeapSizeInPages());
55+
pCmd->setGeneralStateBaseAddressModifyEnable(true);
56+
pCmd->setGeneralStateBufferSizeModifyEnable(true);
57+
// GSH must be set to 0 for stateless
58+
pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase));
5059
pCmd->setGeneralStateBufferSize(0xfffff);
5160

52-
pCmd->setIndirectObjectBaseAddress(ioh.getHeapGpuBase());
53-
pCmd->setIndirectObjectBufferSize(ioh.getHeapSizeInPages());
54-
55-
pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities);
56-
5761
if (DebugManager.flags.OverrideStatelessMocsIndex.get() != -1) {
5862
statelessMocsIndex = DebugManager.flags.OverrideStatelessMocsIndex.get();
5963
}

core/helpers/state_base_address_bdw_plus.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ namespace NEO {
1212
template <typename GfxFamily>
1313
void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
1414
STATE_BASE_ADDRESS *stateBaseAddress,
15-
const IndirectHeap &dsh,
16-
const IndirectHeap &ioh,
17-
const IndirectHeap &ssh,
15+
const IndirectHeap *dsh,
16+
const IndirectHeap *ioh,
17+
const IndirectHeap *ssh,
1818
uint64_t generalStateBase,
1919
uint64_t internalHeapBase,
2020
GmmHelper *gmmHelper,

runtime/command_stream/command_stream_receiver_hw_base.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
314314

315315
StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
316316
commandStreamCSR,
317-
dsh,
318-
ioh,
319-
ssh,
317+
&dsh,
318+
&ioh,
319+
&ssh,
320320
newGSHbase,
321321
mocsIndex,
322322
getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex),

unit_tests/command_stream/command_stream_receiver_flush_task_2_tests.cpp

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,18 +1114,18 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrInNonDirtyStateAndBatching
11141114

11151115
HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddressIsProgrammedThenDecanonizedAddressIsWritten) {
11161116
uint64_t generalStateBaseAddress = 0xffff800400010000ull;
1117-
StateBaseAddressHelper<FamilyType> helper;
1117+
11181118
DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags();
11191119

1120-
helper.programStateBaseAddress(commandStream,
1121-
dsh,
1122-
ioh,
1123-
ssh,
1124-
generalStateBaseAddress,
1125-
0,
1126-
generalStateBaseAddress,
1127-
pDevice->getGmmHelper(),
1128-
dispatchFlags);
1120+
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(commandStream,
1121+
&dsh,
1122+
&ioh,
1123+
&ssh,
1124+
generalStateBaseAddress,
1125+
0,
1126+
generalStateBaseAddress,
1127+
pDevice->getGmmHelper(),
1128+
dispatchFlags);
11291129

11301130
HardwareParse hwParser;
11311131
hwParser.parseCommands<FamilyType>(commandStream);
@@ -1134,3 +1134,47 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddres
11341134
EXPECT_NE(generalStateBaseAddress, cmd->getGeneralStateBaseAddress());
11351135
EXPECT_EQ(GmmHelper::decanonize(generalStateBaseAddress), cmd->getGeneralStateBaseAddress());
11361136
}
1137+
1138+
HWCMDTEST_F(IGFX_GEN8_CORE, CommandStreamReceiverFlushTaskTests, givenSbaProgrammingWhenHeapsAreNotProvidedThenDontProgram) {
1139+
DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags();
1140+
1141+
uint64_t internalHeapBase = 0x10000;
1142+
uint64_t generalStateBase = 0x30000;
1143+
1144+
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(commandStream,
1145+
nullptr,
1146+
nullptr,
1147+
nullptr,
1148+
generalStateBase,
1149+
0,
1150+
internalHeapBase,
1151+
pDevice->getGmmHelper(),
1152+
dispatchFlags);
1153+
1154+
HardwareParse hwParser;
1155+
hwParser.parseCommands<FamilyType>(commandStream);
1156+
auto cmd = hwParser.getCommand<typename FamilyType::STATE_BASE_ADDRESS>();
1157+
1158+
EXPECT_FALSE(cmd->getDynamicStateBaseAddressModifyEnable());
1159+
EXPECT_FALSE(cmd->getDynamicStateBufferSizeModifyEnable());
1160+
EXPECT_EQ(0u, cmd->getDynamicStateBaseAddress());
1161+
EXPECT_EQ(0u, cmd->getDynamicStateBufferSize());
1162+
1163+
EXPECT_FALSE(cmd->getIndirectObjectBaseAddressModifyEnable());
1164+
EXPECT_FALSE(cmd->getIndirectObjectBufferSizeModifyEnable());
1165+
EXPECT_EQ(0u, cmd->getIndirectObjectBaseAddress());
1166+
EXPECT_EQ(0u, cmd->getIndirectObjectBufferSize());
1167+
1168+
EXPECT_FALSE(cmd->getSurfaceStateBaseAddressModifyEnable());
1169+
EXPECT_EQ(0u, cmd->getSurfaceStateBaseAddress());
1170+
1171+
EXPECT_TRUE(cmd->getInstructionBaseAddressModifyEnable());
1172+
EXPECT_EQ(internalHeapBase, cmd->getInstructionBaseAddress());
1173+
EXPECT_TRUE(cmd->getInstructionBufferSizeModifyEnable());
1174+
EXPECT_EQ(MemoryConstants::sizeOf4GBinPageEntities, cmd->getInstructionBufferSize());
1175+
1176+
EXPECT_TRUE(cmd->getGeneralStateBaseAddressModifyEnable());
1177+
EXPECT_TRUE(cmd->getGeneralStateBufferSizeModifyEnable());
1178+
EXPECT_EQ(GmmHelper::decanonize(generalStateBase), cmd->getGeneralStateBaseAddress());
1179+
EXPECT_EQ(0xfffffu, cmd->getGeneralStateBufferSize());
1180+
}

0 commit comments

Comments
 (0)