feature: global bindless surface state base support

- program global bindless ssba when external allocator used (
UseExternalAllocatorForSshAndDsh)

Related-To: NEO-7063

Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2023-06-26 17:49:16 +00:00
committed by Compute-Runtime-Automation
parent 11c96559a9
commit 4aba0f0340
21 changed files with 572 additions and 108 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2022 Intel Corporation
* Copyright (C) 2020-2023 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -49,6 +49,9 @@ class BindlessHeapsHelper {
uint32_t getAlphaBorderColorOffset();
IndirectHeap *getHeap(BindlesHeapType heapType);
void placeSSAllocationInReuseVectorOnFreeMemory(GraphicsAllocation *gfxAllocation);
bool isGlobalDshSupported() {
return globalBindlessDsh;
}
protected:
void growHeap(BindlesHeapType heapType);
@@ -62,5 +65,6 @@ class BindlessHeapsHelper {
std::unordered_map<GraphicsAllocation *, std::unique_ptr<SurfaceStateInHeapInfo>> surfaceStateInHeapAllocationMap;
std::mutex mtx;
DeviceBitfield deviceBitfield;
bool globalBindlessDsh = false;
};
} // namespace NEO

View File

@@ -30,6 +30,7 @@ struct StateBaseAddressHelperArgs {
uint64_t instructionHeapBaseAddress = 0;
uint64_t globalHeapsBaseAddress = 0;
uint64_t surfaceStateBaseAddress = 0;
uint64_t bindlessSurfaceStateBaseAddress = 0;
STATE_BASE_ADDRESS *stateBaseAddressCmd = nullptr;

View File

@@ -14,11 +14,16 @@ template <typename GfxFamily>
void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
StateBaseAddressHelperArgs<GfxFamily> &args) {
if (!args.useGlobalHeapsBaseAddress && args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
uint32_t size = uint32_t(args.ssh->getMaxAvailableSpace() / 64) - 1;
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(size);
if (!args.useGlobalHeapsBaseAddress) {
if (args.bindlessSurfaceStateBaseAddress != 0) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.bindlessSurfaceStateBaseAddress);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
} else if (args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
uint32_t size = uint32_t(args.ssh->getMaxAvailableSpace() / 64) - 1;
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(size);
}
}
args.stateBaseAddressCmd->setBindlessSamplerStateBaseAddressModifyEnable(true);

View File

@@ -13,11 +13,16 @@ template <typename GfxFamily>
void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
StateBaseAddressHelperArgs<GfxFamily> &args) {
if (!args.useGlobalHeapsBaseAddress && args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
uint32_t size = uint32_t(args.ssh->getMaxAvailableSpace() / 64) - 1;
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(size);
if (!args.useGlobalHeapsBaseAddress) {
if (args.bindlessSurfaceStateBaseAddress != 0) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.bindlessSurfaceStateBaseAddress);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
} else if (args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
uint32_t size = uint32_t(args.ssh->getMaxAvailableSpace() / 64) - 1;
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(size);
}
}
StateBaseAddressHelper<GfxFamily>::appendIohParameters(args);

View File

@@ -47,11 +47,16 @@ void StateBaseAddressHelper<GfxFamily>::appendStateBaseAddressParameters(
args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.indirectObjectHeapBaseAddress));
}
if (!args.useGlobalHeapsBaseAddress && args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
const auto surfaceStateCount = args.ssh->getMaxAvailableSpace() / sizeof(RENDER_SURFACE_STATE);
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(static_cast<uint32_t>(surfaceStateCount - 1));
if (!args.useGlobalHeapsBaseAddress) {
if (args.bindlessSurfaceStateBaseAddress != 0) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.bindlessSurfaceStateBaseAddress);
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
} else if (args.ssh) {
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.ssh->getHeapGpuBase());
args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true);
const auto surfaceStateCount = args.ssh->getMaxAvailableSpace() / sizeof(RENDER_SURFACE_STATE);
args.stateBaseAddressCmd->setBindlessSurfaceStateSize(static_cast<uint32_t>(surfaceStateCount - 1));
}
}
args.stateBaseAddressCmd->setBindlessSamplerStateBaseAddressModifyEnable(true);