/* * Copyright (C) 2017-2018 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include #include #include "runtime/memory_manager/residency.h" namespace OCLRT { struct OsHandle; using OsGraphicsHandle = OsHandle; const int max_fragments_count = 3; enum class FragmentPosition { NONE = 0, LEADING, MIDDLE, TRAILING }; enum OverlapStatus { FRAGMENT_NOT_OVERLAPING_WITH_ANY_OTHER = 0, FRAGMENT_WITHIN_STORED_FRAGMENT, FRAGMENT_WITH_EXACT_SIZE_AS_STORED_FRAGMENT, FRAGMENT_OVERLAPING_AND_BIGGER_THEN_STORED_FRAGMENT, FRAGMENT_NOT_CHECKED }; enum RequirementsStatus { SUCCESS = 0, FATAL }; struct PartialAllocation { FragmentPosition fragmentPosition = FragmentPosition::NONE; const void *allocationPtr = nullptr; size_t allocationSize = 0u; }; struct AllocationRequirements { PartialAllocation AllocationFragments[max_fragments_count]; uint64_t totalRequiredSize = 0u; uint32_t requiredFragmentsCount = 0u; }; struct FragmentStorage { const void *fragmentCpuPointer = nullptr; size_t fragmentSize = 0; int refCount = 0; OsHandle *osInternalStorage = nullptr; ResidencyData *residency = nullptr; bool driverAllocation = false; }; struct AllocationStorageData { OsHandle *osHandleStorage; size_t fragmentSize = 0; const void *cpuPtr = nullptr; bool freeTheFragment = false; ResidencyData *residency = nullptr; }; struct OsHandleStorage { AllocationStorageData fragmentStorageData[max_fragments_count]; uint32_t fragmentCount = 0; OsHandleStorage() { for (int i = 0; i < max_fragments_count; i++) { fragmentStorageData[i].osHandleStorage = nullptr; fragmentStorageData[i].cpuPtr = nullptr; } } }; struct CheckedFragments { FragmentStorage *fragments[max_fragments_count]; OverlapStatus status[max_fragments_count]; size_t count = 0; }; } // namespace OCLRT