Make specific SBA heaps programming optional
Change-Id: I852a9e1d9bcc5d6227b1e8a81ab81ad896d6586f Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
parent
632134db30
commit
232dc59cde
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -314,9 +314,9 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
|
|||
|
||||
StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
|
||||
commandStreamCSR,
|
||||
dsh,
|
||||
ioh,
|
||||
ssh,
|
||||
&dsh,
|
||||
&ioh,
|
||||
&ssh,
|
||||
newGSHbase,
|
||||
mocsIndex,
|
||||
getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex),
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue