Make specific SBA heaps programming optional

Change-Id: I852a9e1d9bcc5d6227b1e8a81ab81ad896d6586f
Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz 2019-12-06 09:50:33 +01:00 committed by sys_ocldev
parent 632134db30
commit 232dc59cde
5 changed files with 94 additions and 46 deletions

View File

@ -22,9 +22,9 @@ struct StateBaseAddressHelper {
static void programStateBaseAddress(
LinearStream &commandStream,
const IndirectHeap &dsh,
const IndirectHeap &ioh,
const IndirectHeap &ssh,
const IndirectHeap *dsh,
const IndirectHeap *ioh,
const IndirectHeap *ssh,
uint64_t generalStateBase,
uint32_t statelessMocsIndex,
uint64_t internalHeapBase,
@ -33,9 +33,9 @@ struct StateBaseAddressHelper {
static void appendStateBaseAddressParameters(
STATE_BASE_ADDRESS *stateBaseAddress,
const IndirectHeap &dsh,
const IndirectHeap &ioh,
const IndirectHeap &ssh,
const IndirectHeap *dsh,
const IndirectHeap *ioh,
const IndirectHeap *ssh,
uint64_t generalStateBase,
uint64_t internalHeapBase,
GmmHelper *gmmHelper,

View File

@ -16,9 +16,9 @@ namespace NEO {
template <typename GfxFamily>
void StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
LinearStream &commandStream,
const IndirectHeap &dsh,
const IndirectHeap &ioh,
const IndirectHeap &ssh,
const IndirectHeap *dsh,
const IndirectHeap *ioh,
const IndirectHeap *ssh,
uint64_t generalStateBase,
uint32_t statelessMocsIndex,
uint64_t internalHeapBase,
@ -28,32 +28,36 @@ void StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
auto pCmd = static_cast<STATE_BASE_ADDRESS *>(commandStream.getSpace(sizeof(STATE_BASE_ADDRESS)));
*pCmd = GfxFamily::cmdInitStateBaseAddress;
pCmd->setDynamicStateBaseAddressModifyEnable(true);
pCmd->setGeneralStateBaseAddressModifyEnable(true);
pCmd->setSurfaceStateBaseAddressModifyEnable(true);
pCmd->setIndirectObjectBaseAddressModifyEnable(true);
pCmd->setInstructionBaseAddressModifyEnable(true);
if (dsh) {
pCmd->setDynamicStateBaseAddressModifyEnable(true);
pCmd->setDynamicStateBufferSizeModifyEnable(true);
pCmd->setDynamicStateBaseAddress(dsh->getHeapGpuBase());
pCmd->setDynamicStateBufferSize(dsh->getHeapSizeInPages());
}
pCmd->setDynamicStateBaseAddress(dsh.getHeapGpuBase());
if (ioh) {
pCmd->setIndirectObjectBaseAddressModifyEnable(true);
pCmd->setIndirectObjectBufferSizeModifyEnable(true);
pCmd->setIndirectObjectBaseAddress(ioh->getHeapGpuBase());
pCmd->setIndirectObjectBufferSize(ioh->getHeapSizeInPages());
}
if (ssh) {
pCmd->setSurfaceStateBaseAddressModifyEnable(true);
pCmd->setSurfaceStateBaseAddress(ssh->getHeapGpuBase());
}
pCmd->setInstructionBaseAddressModifyEnable(true);
pCmd->setInstructionBaseAddress(internalHeapBase);
pCmd->setInstructionBufferSizeModifyEnable(true);
pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities);
pCmd->setGeneralStateBaseAddressModifyEnable(true);
pCmd->setGeneralStateBufferSizeModifyEnable(true);
// GSH must be set to 0 for stateless
pCmd->setGeneralStateBaseAddress(GmmHelper::decanonize(generalStateBase));
pCmd->setSurfaceStateBaseAddress(ssh.getHeapGpuBase());
pCmd->setInstructionBaseAddress(internalHeapBase);
pCmd->setDynamicStateBufferSizeModifyEnable(true);
pCmd->setGeneralStateBufferSizeModifyEnable(true);
pCmd->setIndirectObjectBufferSizeModifyEnable(true);
pCmd->setInstructionBufferSizeModifyEnable(true);
pCmd->setDynamicStateBufferSize(dsh.getHeapSizeInPages());
pCmd->setGeneralStateBufferSize(0xfffff);
pCmd->setIndirectObjectBaseAddress(ioh.getHeapGpuBase());
pCmd->setIndirectObjectBufferSize(ioh.getHeapSizeInPages());
pCmd->setInstructionBufferSize(MemoryConstants::sizeOf4GBinPageEntities);
if (DebugManager.flags.OverrideStatelessMocsIndex.get() != -1) {
statelessMocsIndex = DebugManager.flags.OverrideStatelessMocsIndex.get();
}

View File

@ -12,9 +12,9 @@ namespace NEO {
template <typename GfxFamily>
void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
STATE_BASE_ADDRESS *stateBaseAddress,
const IndirectHeap &dsh,
const IndirectHeap &ioh,
const IndirectHeap &ssh,
const IndirectHeap *dsh,
const IndirectHeap *ioh,
const IndirectHeap *ssh,
uint64_t generalStateBase,
uint64_t internalHeapBase,
GmmHelper *gmmHelper,

View File

@ -314,9 +314,9 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
commandStreamCSR,
dsh,
ioh,
ssh,
&dsh,
&ioh,
&ssh,
newGSHbase,
mocsIndex,
getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex),

View File

@ -1114,18 +1114,18 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrInNonDirtyStateAndBatching
HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddressIsProgrammedThenDecanonizedAddressIsWritten) {
uint64_t generalStateBaseAddress = 0xffff800400010000ull;
StateBaseAddressHelper<FamilyType> helper;
DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags();
helper.programStateBaseAddress(commandStream,
dsh,
ioh,
ssh,
generalStateBaseAddress,
0,
generalStateBaseAddress,
pDevice->getGmmHelper(),
dispatchFlags);
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(commandStream,
&dsh,
&ioh,
&ssh,
generalStateBaseAddress,
0,
generalStateBaseAddress,
pDevice->getGmmHelper(),
dispatchFlags);
HardwareParse hwParser;
hwParser.parseCommands<FamilyType>(commandStream);
@ -1134,3 +1134,47 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCsrWhenGeneralStateBaseAddres
EXPECT_NE(generalStateBaseAddress, cmd->getGeneralStateBaseAddress());
EXPECT_EQ(GmmHelper::decanonize(generalStateBaseAddress), cmd->getGeneralStateBaseAddress());
}
HWCMDTEST_F(IGFX_GEN8_CORE, CommandStreamReceiverFlushTaskTests, givenSbaProgrammingWhenHeapsAreNotProvidedThenDontProgram) {
DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags();
uint64_t internalHeapBase = 0x10000;
uint64_t generalStateBase = 0x30000;
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(commandStream,
nullptr,
nullptr,
nullptr,
generalStateBase,
0,
internalHeapBase,
pDevice->getGmmHelper(),
dispatchFlags);
HardwareParse hwParser;
hwParser.parseCommands<FamilyType>(commandStream);
auto cmd = hwParser.getCommand<typename FamilyType::STATE_BASE_ADDRESS>();
EXPECT_FALSE(cmd->getDynamicStateBaseAddressModifyEnable());
EXPECT_FALSE(cmd->getDynamicStateBufferSizeModifyEnable());
EXPECT_EQ(0u, cmd->getDynamicStateBaseAddress());
EXPECT_EQ(0u, cmd->getDynamicStateBufferSize());
EXPECT_FALSE(cmd->getIndirectObjectBaseAddressModifyEnable());
EXPECT_FALSE(cmd->getIndirectObjectBufferSizeModifyEnable());
EXPECT_EQ(0u, cmd->getIndirectObjectBaseAddress());
EXPECT_EQ(0u, cmd->getIndirectObjectBufferSize());
EXPECT_FALSE(cmd->getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(0u, cmd->getSurfaceStateBaseAddress());
EXPECT_TRUE(cmd->getInstructionBaseAddressModifyEnable());
EXPECT_EQ(internalHeapBase, cmd->getInstructionBaseAddress());
EXPECT_TRUE(cmd->getInstructionBufferSizeModifyEnable());
EXPECT_EQ(MemoryConstants::sizeOf4GBinPageEntities, cmd->getInstructionBufferSize());
EXPECT_TRUE(cmd->getGeneralStateBaseAddressModifyEnable());
EXPECT_TRUE(cmd->getGeneralStateBufferSizeModifyEnable());
EXPECT_EQ(GmmHelper::decanonize(generalStateBase), cmd->getGeneralStateBaseAddress());
EXPECT_EQ(0xfffffu, cmd->getGeneralStateBufferSize());
}