/* * Copyright (C) 2021-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/cache_settings_helper.h" #include "shared/source/helpers/cache_policy.h" #include "shared/source/helpers/state_base_address_base.inl" namespace NEO { template void setSbaStatelessCompressionParams(typename GfxFamily::STATE_BASE_ADDRESS *stateBaseAddress, MemoryCompressionState memoryCompressionState) { using STATE_BASE_ADDRESS = typename GfxFamily::STATE_BASE_ADDRESS; if (memoryCompressionState == MemoryCompressionState::Enabled) { stateBaseAddress->setEnableMemoryCompressionForAllStatelessAccesses(STATE_BASE_ADDRESS::ENABLE_MEMORY_COMPRESSION_FOR_ALL_STATELESS_ACCESSES_ENABLED); } else { stateBaseAddress->setEnableMemoryCompressionForAllStatelessAccesses(STATE_BASE_ADDRESS::ENABLE_MEMORY_COMPRESSION_FOR_ALL_STATELESS_ACCESSES_DISABLED); } } template void StateBaseAddressHelper::appendStateBaseAddressParameters( StateBaseAddressHelperArgs &args) { using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; using STATE_BASE_ADDRESS = typename GfxFamily::STATE_BASE_ADDRESS; if (args.sbaProperties) { if (args.sbaProperties->indirectObjectBaseAddress.value != StreamProperty64::initValue) { auto baseAddress = static_cast(args.sbaProperties->indirectObjectBaseAddress.value); args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(baseAddress)); args.stateBaseAddressCmd->setGeneralStateBaseAddressModifyEnable(true); args.stateBaseAddressCmd->setGeneralStateBufferSizeModifyEnable(true); args.stateBaseAddressCmd->setGeneralStateBufferSize(0xfffff); } if (args.sbaProperties->globalAtomics.value != StreamProperty::initValue) { args.useGlobalAtomics = !!args.sbaProperties->globalAtomics.value; } } if (args.setGeneralStateBaseAddress && is64bit) { args.stateBaseAddressCmd->setGeneralStateBaseAddress(args.gmmHelper->decanonize(args.indirectObjectHeapBaseAddress)); } if (!args.useGlobalHeapsBaseAddress) { if (args.bindlessSurfaceStateBaseAddress != 0) { args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddress(args.bindlessSurfaceStateBaseAddress); args.stateBaseAddressCmd->setBindlessSurfaceStateBaseAddressModifyEnable(true); const auto surfaceStateCount = getMaxBindlessSurfaceStates(); args.stateBaseAddressCmd->setBindlessSurfaceStateSize(surfaceStateCount); } 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(surfaceStateCount - 1)); } } args.stateBaseAddressCmd->setBindlessSamplerStateBaseAddressModifyEnable(true); auto &productHelper = args.gmmHelper->getRootDeviceEnvironment().template getHelper(); auto heapResourceUsage = CacheSettingsHelper::getGmmUsageType(AllocationType::INTERNAL_HEAP, debugManager.flags.DisableCachingForHeaps.get(), productHelper); auto heapMocsValue = args.gmmHelper->getMOCS(heapResourceUsage); args.stateBaseAddressCmd->setSurfaceStateMemoryObjectControlState(heapMocsValue); args.stateBaseAddressCmd->setDynamicStateMemoryObjectControlState(heapMocsValue); args.stateBaseAddressCmd->setGeneralStateMemoryObjectControlState(heapMocsValue); args.stateBaseAddressCmd->setBindlessSurfaceStateMemoryObjectControlState(heapMocsValue); args.stateBaseAddressCmd->setBindlessSamplerStateMemoryObjectControlState(heapMocsValue); bool enableMultiGpuAtomics = args.isMultiOsContextCapable; if (debugManager.flags.EnableMultiGpuAtomicsOptimization.get()) { enableMultiGpuAtomics = args.useGlobalAtomics && (args.isMultiOsContextCapable || args.areMultipleSubDevicesInContext); } args.stateBaseAddressCmd->setDisableSupportForMultiGpuAtomicsForStatelessAccesses(!enableMultiGpuAtomics); args.stateBaseAddressCmd->setDisableSupportForMultiGpuPartialWritesForStatelessMessages(!args.isMultiOsContextCapable); if (debugManager.flags.ForceMultiGpuAtomics.get() != -1) { args.stateBaseAddressCmd->setDisableSupportForMultiGpuAtomicsForStatelessAccesses(!!debugManager.flags.ForceMultiGpuAtomics.get()); } if (debugManager.flags.ForceMultiGpuPartialWrites.get() != -1) { args.stateBaseAddressCmd->setDisableSupportForMultiGpuPartialWritesForStatelessMessages(!!debugManager.flags.ForceMultiGpuPartialWrites.get()); } if (args.memoryCompressionState != MemoryCompressionState::NotApplicable) { setSbaStatelessCompressionParams(args.stateBaseAddressCmd, args.memoryCompressionState); } bool l3MocsEnabled = (args.stateBaseAddressCmd->getStatelessDataPortAccessMemoryObjectControlState() >> 1) == (args.gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER) >> 1); bool constMocsAllowed = (l3MocsEnabled && (debugManager.flags.ForceL1Caching.get() != 0)); if (constMocsAllowed) { auto constMocsIndex = args.gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CONST); GmmHelper::applyMocsEncryptionBit(constMocsIndex); args.stateBaseAddressCmd->setStatelessDataPortAccessMemoryObjectControlState(constMocsIndex); } appendExtraCacheSettings(args); } template void StateBaseAddressHelper::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(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)); } *bindingTablePoolAlloc = cmd; } template uint32_t StateBaseAddressHelper::getMaxBindlessSurfaceStates() { return std::numeric_limits::max(); } template void StateBaseAddressHelper::appendExtraCacheSettings(StateBaseAddressHelperArgs &args) { auto cachePolicy = args.isDebuggerActive ? args.l1CachePolicyDebuggerActive : args.l1CachePolicy; args.stateBaseAddressCmd->setL1CachePolicyL1CacheControl(static_cast(cachePolicy)); if (debugManager.flags.ForceStatelessL1CachingPolicy.get() != -1 && debugManager.flags.ForceAllResourcesUncached.get() == false) { args.stateBaseAddressCmd->setL1CachePolicyL1CacheControl(static_cast(debugManager.flags.ForceStatelessL1CachingPolicy.get())); } } template void StateBaseAddressHelper::appendIohParameters(StateBaseAddressHelperArgs &args) { } } // namespace NEO