Add parameter to set surface state base address value

This change introduces capability to set surface state base address
when surface state heap or global base address are not available

Related-To: NEO-7187

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2022-08-17 22:33:49 +00:00
committed by Compute-Runtime-Automation
parent 99c5de855c
commit 0011368775
16 changed files with 259 additions and 51 deletions

View File

@@ -23,6 +23,7 @@ BDWTEST_F(SBATest, givenUsedBindlessBuffersWhenAppendStateBaseAddressParametersI
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
&stateBaseAddress, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -35,7 +36,8 @@ BDWTEST_F(SBATest, givenUsedBindlessBuffersWhenAppendStateBaseAddressParametersI
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::appendStateBaseAddressParameters(args, true);
@@ -43,3 +45,39 @@ BDWTEST_F(SBATest, givenUsedBindlessBuffersWhenAppendStateBaseAddressParametersI
EXPECT_EQ(0u, ssh.getUsed());
EXPECT_EQ(0, memcmp(&stateBaseAddressReference, &stateBaseAddress, sizeof(STATE_BASE_ADDRESS)));
}
BDWTEST_F(SBATest,
givenUsedBindlessBuffersAndOverridenSurfaceStateBaseAddressWhenAppendStateBaseAddressParametersIsCalledThenSbaCmdHasCorrectSurfaceStateBaseAddress) {
using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
constexpr uint64_t surfaceStateBaseAddress = 0xBADA550000;
STATE_BASE_ADDRESS stateBaseAddressCmd = {};
StateBaseAddressHelperArgs<FamilyType> args = {
0, // generalStateBase
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
surfaceStateBaseAddress, // surfaceStateBaseAddress
&stateBaseAddressCmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
&ssh, // ssh
nullptr, // gmmHelper
0, // statelessMocsIndex
MemoryCompressionState::NotApplicable, // memoryCompressionState
false, // setInstructionStateBaseAddress
false, // setGeneralStateBaseAddress
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false, // areMultipleSubDevicesInContext
true // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
EXPECT_TRUE(stateBaseAddressCmd.getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(surfaceStateBaseAddress, stateBaseAddressCmd.getSurfaceStateBaseAddress());
}

View File

@@ -27,6 +27,7 @@ HWTEST2_F(SBATest, WhenAppendStateBaseAddressParametersIsCalledThenSBACmdHasBind
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
&stateBaseAddress, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -39,7 +40,8 @@ HWTEST2_F(SBATest, WhenAppendStateBaseAddressParametersIsCalledThenSBACmdHasBind
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::appendStateBaseAddressParameters(args, true);
@@ -67,6 +69,7 @@ HWTEST2_F(SBATest, WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBin
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -79,7 +82,8 @@ HWTEST2_F(SBATest, WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBin
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
@@ -87,6 +91,47 @@ HWTEST2_F(SBATest, WhenProgramStateBaseAddressParametersIsCalledThenSBACmdHasBin
EXPECT_EQ(ssh.getMaxAvailableSpace() / 64 - 1, cmd->getBindlessSurfaceStateSize());
EXPECT_EQ(ssh.getHeapGpuBase(), cmd->getBindlessSurfaceStateBaseAddress());
EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
EXPECT_TRUE(cmd->getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(ssh.getHeapGpuBase(), cmd->getSurfaceStateBaseAddress());
}
HWTEST2_F(SBATest,
givenProgramSurfaceStateBaseAddressUsingHeapBaseWhenOverrideSurfaceStateBaseAddressUsedThenSbaDispatchedWithOverrideValue, IsAtLeastSkl) {
using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
constexpr uint64_t surfaceStateBaseAddress = 0xBADA550000;
STATE_BASE_ADDRESS cmd;
StateBaseAddressHelperArgs<FamilyType> args = {
0, // generalStateBase
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
surfaceStateBaseAddress, // surfaceStateBaseAddress
&cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
&ssh, // ssh
pDevice->getGmmHelper(), // gmmHelper
0, // statelessMocsIndex
MemoryCompressionState::NotApplicable, // memoryCompressionState
false, // setInstructionStateBaseAddress
false, // setGeneralStateBaseAddress
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false, // areMultipleSubDevicesInContext
true // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
EXPECT_TRUE(cmd.getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(surfaceStateBaseAddress, cmd.getSurfaceStateBaseAddress());
}
using SbaForBindlessTests = Test<DeviceFixture>;
@@ -96,7 +141,7 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenProgramStateBas
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
constexpr uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
StackVec<char, 4096> buffer(4096);
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
@@ -108,6 +153,7 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenProgramStateBas
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -120,16 +166,82 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenProgramStateBas
true, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(cmd->getBindlessSurfaceStateBaseAddress(), globalBindlessHeapsBaseAddress);
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getBindlessSurfaceStateBaseAddress());
auto surfaceStateCount = StateBaseAddressHelper<FamilyType>::getMaxBindlessSurfaceStates();
EXPECT_EQ(surfaceStateCount, cmd->getBindlessSurfaceStateSize());
EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getBindlessSurfaceStateBaseAddress());
EXPECT_TRUE(cmd->getDynamicStateBaseAddressModifyEnable());
EXPECT_TRUE(cmd->getDynamicStateBufferSizeModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getDynamicStateBaseAddress());
EXPECT_TRUE(cmd->getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getSurfaceStateBaseAddress());
}
HWTEST2_F(SbaForBindlessTests,
givenGlobalBindlessBaseAddressOverridenSurfaceStateBaseAddressWhenProgramStateBaseAddressThenSbaProgrammedCorrectly, IsAtLeastSkl) {
using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
constexpr uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
constexpr uint64_t surfaceStateBaseAddress = 0xBADA550000;
StackVec<char, 4096> buffer(4096);
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
STATE_BASE_ADDRESS *cmd = reinterpret_cast<STATE_BASE_ADDRESS *>(cmdStream.getSpace(0));
StateBaseAddressHelperArgs<FamilyType> args = {
0, // generalStateBase
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress
surfaceStateBaseAddress, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
nullptr, // ssh
pDevice->getGmmHelper(), // gmmHelper
0, // statelessMocsIndex
MemoryCompressionState::NotApplicable, // memoryCompressionState
false, // setInstructionStateBaseAddress
false, // setGeneralStateBaseAddress
true, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false, // areMultipleSubDevicesInContext
true // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getBindlessSurfaceStateBaseAddress());
auto surfaceStateCount = StateBaseAddressHelper<FamilyType>::getMaxBindlessSurfaceStates();
EXPECT_EQ(surfaceStateCount, cmd->getBindlessSurfaceStateSize());
EXPECT_TRUE(cmd->getBindlessSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getBindlessSurfaceStateBaseAddress());
EXPECT_TRUE(cmd->getDynamicStateBaseAddressModifyEnable());
EXPECT_TRUE(cmd->getDynamicStateBufferSizeModifyEnable());
EXPECT_EQ(globalBindlessHeapsBaseAddress, cmd->getDynamicStateBaseAddress());
EXPECT_TRUE(cmd->getSurfaceStateBaseAddressModifyEnable());
EXPECT_EQ(surfaceStateBaseAddress, cmd->getSurfaceStateBaseAddress());
}
using IohSupported = IsWithinGfxCore<GFXCORE_FAMILY::IGFX_GEN9_CORE, GFXCORE_FAMILY::IGFX_GEN12LP_CORE>;
@@ -139,8 +251,8 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenPassingIndirect
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
uint64_t indirectObjectBaseAddress = 0x12340000;
constexpr uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
constexpr uint64_t indirectObjectBaseAddress = 0x12340000;
StackVec<char, 4096> buffer(4096);
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
@@ -152,6 +264,7 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenPassingIndirect
indirectObjectBaseAddress, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -164,7 +277,8 @@ HWTEST2_F(SbaForBindlessTests, givenGlobalBindlessBaseAddressWhenPassingIndirect
true, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
@@ -187,6 +301,7 @@ HWTEST2_F(SBATest, givenSbaWhenOverrideBindlessSurfaceBaseIsFalseThenBindlessSur
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
&stateBaseAddress, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -199,7 +314,8 @@ HWTEST2_F(SBATest, givenSbaWhenOverrideBindlessSurfaceBaseIsFalseThenBindlessSur
true, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::appendStateBaseAddressParameters(args, false);
@@ -212,7 +328,7 @@ HWTEST2_F(SBATest, givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurf
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
constexpr uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
StackVec<char, 4096> buffer(4096);
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
@@ -224,6 +340,7 @@ HWTEST2_F(SBATest, givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurf
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -236,7 +353,8 @@ HWTEST2_F(SBATest, givenGlobalBindlessBaseAddressWhenSshIsPassedThenBindlessSurf
true, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
@@ -248,7 +366,7 @@ HWTEST2_F(SBATest, givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSu
EXPECT_NE(IGFX_BROADWELL, ::productFamily);
uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
constexpr uint64_t globalBindlessHeapsBaseAddress = 0x12340000;
StackVec<char, 4096> buffer(4096);
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
@@ -260,6 +378,7 @@ HWTEST2_F(SBATest, givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSu
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
globalBindlessHeapsBaseAddress, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
cmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -272,7 +391,8 @@ HWTEST2_F(SBATest, givenSurfaceStateHeapWhenNotUsingGlobalHeapBaseThenBindlessSu
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
StateBaseAddressHelper<FamilyType>::programStateBaseAddress(args);
@@ -345,6 +465,7 @@ HWTEST2_F(SBATest, givenDebugFlagSetWhenAppendingSbaThenProgramCorrectL1CachePol
0, // indirectObjectHeapBaseAddress
0, // instructionHeapBaseAddress
0, // globalHeapsBaseAddress
0, // surfaceStateBaseAddress
&sbaCmd, // stateBaseAddressCmd
nullptr, // dsh
nullptr, // ioh
@@ -357,7 +478,8 @@ HWTEST2_F(SBATest, givenDebugFlagSetWhenAppendingSbaThenProgramCorrectL1CachePol
false, // useGlobalHeapsBaseAddress
false, // isMultiOsContextCapable
false, // useGlobalAtomics
false // areMultipleSubDevicesInContext
false, // areMultipleSubDevicesInContext
false // overrideSurfaceStateBaseAddress
};
for (const auto &input : testInputs) {
@@ -411,4 +533,4 @@ HWTEST2_F(SBATest, givenDebugFlagSetWhenAppendingRssThenProgramCorrectL1CachePol
EXPECT_EQ(input.cachePolicy, rssCmd.getL1CachePolicyL1CacheControl());
}
memoryManager->freeGraphicsMemory(allocation);
}
}