/* * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/memory_manager/internal_allocation_storage.h" #include "shared/source/command_stream/command_stream_receiver.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/memory_manager/host_ptr_manager.h" #include "shared/source/os_interface/os_context.h" namespace NEO { InternalAllocationStorage::InternalAllocationStorage(CommandStreamReceiver &commandStreamReceiver) : commandStreamReceiver(commandStreamReceiver){}; void InternalAllocationStorage::storeAllocation(std::unique_ptr &&gfxAllocation, uint32_t allocationUsage) { TaskCountType taskCount = gfxAllocation->getTaskCount(commandStreamReceiver.getOsContext().getContextId()); if (allocationUsage == REUSABLE_ALLOCATION) { taskCount = commandStreamReceiver.peekTaskCount(); } storeAllocationWithTaskCount(std::move(gfxAllocation), allocationUsage, taskCount); } void InternalAllocationStorage::storeAllocationWithTaskCount(std::unique_ptr &&gfxAllocation, uint32_t allocationUsage, TaskCountType taskCount) { if (allocationUsage == REUSABLE_ALLOCATION) { if (DebugManager.flags.DisableResourceRecycling.get()) { commandStreamReceiver.getMemoryManager()->freeGraphicsMemory(gfxAllocation.release()); return; } } auto &allocationsList = allocationLists[allocationUsage]; gfxAllocation->updateTaskCount(taskCount, commandStreamReceiver.getOsContext().getContextId()); allocationsList.pushTailOne(*gfxAllocation.release()); } void InternalAllocationStorage::cleanAllocationList(TaskCountType waitTaskCount, uint32_t allocationUsage) { freeAllocationsList(waitTaskCount, allocationLists[allocationUsage]); if (allocationUsage == TEMPORARY_ALLOCATION) { freeAllocationsList(waitTaskCount, allocationLists[DEFERRED_DEALLOCATION]); } } void InternalAllocationStorage::freeAllocationsList(TaskCountType waitTaskCount, AllocationsList &allocationsList) { auto memoryManager = commandStreamReceiver.getMemoryManager(); auto lock = memoryManager->getHostPtrManager()->obtainOwnership(); GraphicsAllocation *curr = allocationsList.detachNodes(); IDList allocationsLeft; while (curr != nullptr) { auto *next = curr->next; if (curr->hostPtrTaskCountAssignment == 0 && curr->getTaskCount(commandStreamReceiver.getOsContext().getContextId()) <= waitTaskCount) { memoryManager->freeGraphicsMemory(curr); } else { allocationsLeft.pushTailOne(*curr); } curr = next; } if (allocationsLeft.peekIsEmpty() == false) { allocationsList.splice(*allocationsLeft.detachNodes()); } } std::unique_ptr InternalAllocationStorage::obtainReusableAllocation(size_t requiredSize, AllocationType allocationType) { auto allocation = allocationLists[REUSABLE_ALLOCATION].detachAllocation(requiredSize, nullptr, &commandStreamReceiver, allocationType); return allocation; } std::unique_ptr InternalAllocationStorage::obtainTemporaryAllocationWithPtr(size_t requiredSize, const void *requiredPtr, AllocationType allocationType) { auto allocation = allocationLists[TEMPORARY_ALLOCATION].detachAllocation(requiredSize, requiredPtr, &commandStreamReceiver, allocationType); return allocation; } DeviceBitfield InternalAllocationStorage::getDeviceBitfield() const { return commandStreamReceiver.getOsContext().getDeviceBitfield(); } } // namespace NEO