mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
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:
committed by
Compute-Runtime-Automation
parent
11c96559a9
commit
4aba0f0340
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user