mirror of
https://github.com/intel/compute-runtime.git
synced 2025-11-15 10:14:56 +08:00
Unify programming of binding table base address command
Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
011a0dd497
commit
1b9d50660a
@@ -24,17 +24,25 @@ namespace L0 {
|
||||
template <GFXCORE_FAMILY gfxCoreFamily>
|
||||
void CommandQueueHw<gfxCoreFamily>::programStateBaseAddress(uint64_t gsba, bool useLocalMemoryForIndirectHeap, NEO::LinearStream &commandStream, bool cachedMOCSAllowed) {
|
||||
using STATE_BASE_ADDRESS = typename GfxFamily::STATE_BASE_ADDRESS;
|
||||
NEO::Device *neoDevice = device->getNEODevice();
|
||||
auto &hwInfo = neoDevice->getHardwareInfo();
|
||||
uint32_t rootDeviceIndex = neoDevice->getRootDeviceIndex();
|
||||
|
||||
bool multiOsContextCapable = device->isImplicitScalingCapable();
|
||||
|
||||
uint64_t indirectObjectStateBaseAddress = neoDevice->getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex, useLocalMemoryForIndirectHeap);
|
||||
uint64_t instructionStateBaseAddress = neoDevice->getMemoryManager()->getInternalHeapBaseAddress(
|
||||
rootDeviceIndex, neoDevice->getMemoryManager()->isLocalMemoryUsedForIsa(rootDeviceIndex));
|
||||
|
||||
if (NEO::ApiSpecificConfig::getBindlessConfiguration()) {
|
||||
NEO::Device *neoDevice = device->getNEODevice();
|
||||
auto globalHeapsBase = neoDevice->getBindlessHeapsHelper()->getGlobalHeapsBase();
|
||||
auto &hwInfo = neoDevice->getHardwareInfo();
|
||||
|
||||
bool isRcs = this->getCsr()->isRcs();
|
||||
|
||||
NEO::EncodeWA<GfxFamily>::addPipeControlBeforeStateBaseAddress(commandStream, hwInfo, isRcs);
|
||||
auto sbaCmdBuf = static_cast<STATE_BASE_ADDRESS *>(NEO::StateBaseAddressHelper<GfxFamily>::getSpaceForSbaCmd(commandStream));
|
||||
|
||||
STATE_BASE_ADDRESS sbaCmd;
|
||||
bool multiOsContextCapable = device->isImplicitScalingCapable();
|
||||
NEO::StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(&sbaCmd,
|
||||
nullptr,
|
||||
nullptr,
|
||||
@@ -42,8 +50,8 @@ void CommandQueueHw<gfxCoreFamily>::programStateBaseAddress(uint64_t gsba, bool
|
||||
0,
|
||||
true,
|
||||
(device->getMOCS(cachedMOCSAllowed, false) >> 1),
|
||||
neoDevice->getMemoryManager()->getInternalHeapBaseAddress(neoDevice->getRootDeviceIndex(), useLocalMemoryForIndirectHeap),
|
||||
neoDevice->getMemoryManager()->getInternalHeapBaseAddress(neoDevice->getRootDeviceIndex(), neoDevice->getMemoryManager()->isLocalMemoryUsedForIsa(neoDevice->getRootDeviceIndex())),
|
||||
indirectObjectStateBaseAddress,
|
||||
instructionStateBaseAddress,
|
||||
globalHeapsBase,
|
||||
true,
|
||||
true,
|
||||
@@ -69,13 +77,10 @@ void CommandQueueHw<gfxCoreFamily>::programStateBaseAddress(uint64_t gsba, bool
|
||||
}
|
||||
|
||||
auto heap = neoDevice->getBindlessHeapsHelper()->getHeap(NEO::BindlessHeapsHelper::GLOBAL_SSH);
|
||||
auto cmd = GfxFamily::cmdInitStateBindingTablePoolAlloc;
|
||||
cmd.setBindingTablePoolBaseAddress(heap->getHeapGpuBase());
|
||||
cmd.setBindingTablePoolBufferSize(heap->getHeapSizeInPages());
|
||||
cmd.setSurfaceObjectControlStateIndexToMocsTables(neoDevice->getGmmHelper()->getMOCS(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER));
|
||||
|
||||
auto buffer = commandStream.getSpace(sizeof(cmd));
|
||||
*(typename GfxFamily::_3DSTATE_BINDING_TABLE_POOL_ALLOC *)buffer = cmd;
|
||||
NEO::StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(
|
||||
commandStream,
|
||||
*heap,
|
||||
neoDevice->getGmmHelper());
|
||||
}
|
||||
csr->setGSBAStateDirty(false);
|
||||
}
|
||||
|
||||
@@ -505,13 +505,9 @@ void EncodeStateBaseAddress<Family>::encode(CommandContainer &container, STATE_B
|
||||
|
||||
if (container.isHeapDirty(HeapType::SURFACE_STATE)) {
|
||||
auto heap = container.getIndirectHeap(HeapType::SURFACE_STATE);
|
||||
auto cmd = Family::cmdInitStateBindingTablePoolAlloc;
|
||||
cmd.setBindingTablePoolBaseAddress(heap->getHeapGpuBase());
|
||||
cmd.setBindingTablePoolBufferSize(heap->getHeapSizeInPages());
|
||||
cmd.setSurfaceObjectControlStateIndexToMocsTables(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER));
|
||||
|
||||
auto buffer = container.getCommandStream()->getSpace(sizeof(cmd));
|
||||
*(typename Family::_3DSTATE_BINDING_TABLE_POOL_ALLOC *)buffer = cmd;
|
||||
StateBaseAddressHelper<Family>::programBindingTableBaseAddress(*container.getCommandStream(),
|
||||
*heap,
|
||||
gmmHelper);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -403,18 +403,20 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
|
||||
}
|
||||
|
||||
auto stateBaseAddressCmdOffset = commandStreamCSR.getUsed();
|
||||
auto pCmd = static_cast<STATE_BASE_ADDRESS *>(StateBaseAddressHelper<GfxFamily>::getSpaceForSbaCmd(commandStreamCSR));
|
||||
STATE_BASE_ADDRESS cmd;
|
||||
auto stateBaseAddressCmdBuffer = static_cast<STATE_BASE_ADDRESS *>(StateBaseAddressHelper<GfxFamily>::getSpaceForSbaCmd(commandStreamCSR));
|
||||
auto instructionHeapBaseAddress = getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex, getMemoryManager()->isLocalMemoryUsedForIsa(rootDeviceIndex));
|
||||
uint64_t indirectObjectStateBaseAddress = getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex, ioh->getGraphicsAllocation()->isAllocatedInLocalMemoryPool());
|
||||
|
||||
STATE_BASE_ADDRESS stateBaseAddressCmd;
|
||||
StateBaseAddressHelper<GfxFamily>::programStateBaseAddress(
|
||||
&cmd,
|
||||
&stateBaseAddressCmd,
|
||||
dsh,
|
||||
ioh,
|
||||
ssh,
|
||||
newGSHbase,
|
||||
true,
|
||||
mocsIndex,
|
||||
getMemoryManager()->getInternalHeapBaseAddress(rootDeviceIndex, ioh->getGraphicsAllocation()->isAllocatedInLocalMemoryPool()),
|
||||
indirectObjectStateBaseAddress,
|
||||
instructionHeapBaseAddress,
|
||||
0,
|
||||
true,
|
||||
@@ -425,15 +427,15 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
|
||||
dispatchFlags.useGlobalAtomics,
|
||||
dispatchFlags.areMultipleSubDevicesInContext);
|
||||
|
||||
if (pCmd) {
|
||||
*pCmd = cmd;
|
||||
if (stateBaseAddressCmdBuffer) {
|
||||
*stateBaseAddressCmdBuffer = stateBaseAddressCmd;
|
||||
}
|
||||
|
||||
programAdditionalStateBaseAddress(commandStreamCSR, cmd, device);
|
||||
programAdditionalStateBaseAddress(commandStreamCSR, stateBaseAddressCmd, device);
|
||||
|
||||
if (debuggingEnabled && !device.getDebugger()->isLegacy()) {
|
||||
NEO::Debugger::SbaAddresses sbaAddresses = {};
|
||||
NEO::EncodeStateBaseAddress<GfxFamily>::setSbaAddressesForDebugger(sbaAddresses, cmd);
|
||||
NEO::EncodeStateBaseAddress<GfxFamily>::setSbaAddressesForDebugger(sbaAddresses, stateBaseAddressCmd);
|
||||
device.getDebugger()->captureStateBaseAddress(commandStreamCSR, sbaAddresses);
|
||||
}
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ struct StateBaseAddressHelper {
|
||||
|
||||
static void programBindingTableBaseAddress(LinearStream &commandStream, const IndirectHeap &ssh, GmmHelper *gmmHelper);
|
||||
|
||||
static void programBindingTableBaseAddress(LinearStream &commandStream, uint64_t baseAddress, uint32_t sizeInPages, GmmHelper *gmmHelper);
|
||||
|
||||
static uint32_t getMaxBindlessSurfaceStates();
|
||||
};
|
||||
} // namespace NEO
|
||||
|
||||
@@ -106,4 +106,9 @@ void *StateBaseAddressHelper<GfxFamily>::getSpaceForSbaCmd(LinearStream &cmdStre
|
||||
return cmdStream.getSpace(sizeof(STATE_BASE_ADDRESS));
|
||||
}
|
||||
|
||||
template <typename GfxFamily>
|
||||
void StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(LinearStream &commandStream, const IndirectHeap &ssh, GmmHelper *gmmHelper) {
|
||||
StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(commandStream, ssh.getHeapGpuBase(), ssh.getHeapSizeInPages(), gmmHelper);
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
namespace NEO {
|
||||
|
||||
template <typename GfxFamily>
|
||||
void StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(LinearStream &commandStream, const IndirectHeap &ssh, GmmHelper *gmmHelper) {
|
||||
void StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(LinearStream &commandStream, uint64_t baseAddress, uint32_t sizeInPages, GmmHelper *gmmHelper) {
|
||||
}
|
||||
|
||||
template <typename GfxFamily>
|
||||
|
||||
@@ -90,13 +90,13 @@ void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
|
||||
}
|
||||
|
||||
template <typename GfxFamily>
|
||||
void StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(LinearStream &commandStream, const IndirectHeap &ssh, GmmHelper *gmmHelper) {
|
||||
void StateBaseAddressHelper<GfxFamily>::programBindingTableBaseAddress(LinearStream &commandStream, uint64_t baseAddress, uint32_t sizeInPages, GmmHelper *gmmHelper) {
|
||||
using _3DSTATE_BINDING_TABLE_POOL_ALLOC = typename GfxFamily::_3DSTATE_BINDING_TABLE_POOL_ALLOC;
|
||||
|
||||
auto bindingTablePoolAlloc = commandStream.getSpaceForCmd<_3DSTATE_BINDING_TABLE_POOL_ALLOC>();
|
||||
_3DSTATE_BINDING_TABLE_POOL_ALLOC cmd = GfxFamily::cmdInitStateBindingTablePoolAlloc;
|
||||
cmd.setBindingTablePoolBaseAddress(ssh.getHeapGpuBase());
|
||||
cmd.setBindingTablePoolBufferSize(ssh.getHeapSizeInPages());
|
||||
cmd.setBindingTablePoolBaseAddress(baseAddress);
|
||||
cmd.setBindingTablePoolBufferSize(sizeInPages);
|
||||
cmd.setSurfaceObjectControlStateIndexToMocsTables(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER));
|
||||
if (DebugManager.flags.DisableCachingForHeaps.get()) {
|
||||
cmd.setSurfaceObjectControlStateIndexToMocsTables(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_SYSTEM_MEMORY_BUFFER_CACHELINE_MISALIGNED));
|
||||
|
||||
Reference in New Issue
Block a user