/* * Copyright (C) 2017-2018 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "runtime/execution_environment/execution_environment.h" #include "runtime/memory_manager/os_agnostic_memory_manager.h" #include "unit_tests/mocks/mock_host_ptr_manager.h" #include "gmock/gmock.h" namespace OCLRT { class MockMemoryManager : public OsAgnosticMemoryManager { public: using MemoryManager::allocateGraphicsMemory; using MemoryManager::allocateGraphicsMemoryInPreferredPool; using MemoryManager::AllocationData; using MemoryManager::getAllocationData; using MemoryManager::registeredOsContexts; using OsAgnosticMemoryManager::OsAgnosticMemoryManager; MockMemoryManager(ExecutionEnvironment &executionEnvironment) : OsAgnosticMemoryManager(false, false, executionEnvironment) { hostPtrManager.reset(new MockHostPtrManager); }; MockMemoryManager() : MockMemoryManager(*(new ExecutionEnvironment)) { mockExecutionEnvironment.reset(&executionEnvironment); }; MockMemoryManager(bool enable64pages) : OsAgnosticMemoryManager(enable64pages, false, *(new ExecutionEnvironment)) { mockExecutionEnvironment.reset(&executionEnvironment); } GraphicsAllocation *allocateGraphicsMemory64kb(AllocationData allocationData) override; void setDeferredDeleter(DeferredDeleter *deleter); void overrideAsyncDeleterFlag(bool newValue); GraphicsAllocation *allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) override; int redundancyRatio = 1; GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override; GraphicsAllocation *allocateGraphicsMemoryWithAlignment(const AllocationData &allocationData) override; void freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation) override { freeGraphicsMemoryCalled++; OsAgnosticMemoryManager::freeGraphicsMemoryImpl(gfxAllocation); }; void unlockResource(GraphicsAllocation *gfxAllocation) override { unlockResourceCalled++; OsAgnosticMemoryManager::unlockResource(gfxAllocation); } uint32_t freeGraphicsMemoryCalled = 0u; uint32_t unlockResourceCalled = 0u; bool allocationCreated = false; bool allocation64kbPageCreated = false; bool allocationInDevicePoolCreated = false; bool failInDevicePool = false; bool failInDevicePoolWithError = false; bool failInAllocateWithSizeAndAlignment = false; bool preferRenderCompressedFlagPassed = false; std::unique_ptr mockExecutionEnvironment; }; using AllocationData = MockMemoryManager::AllocationData; class GMockMemoryManager : public MockMemoryManager { public: GMockMemoryManager(const ExecutionEnvironment &executionEnvironment) : MockMemoryManager(const_cast(executionEnvironment)){}; MOCK_METHOD1(populateOsHandles, MemoryManager::AllocationStatus(OsHandleStorage &handleStorage)); MOCK_METHOD2(allocateGraphicsMemoryForNonSvmHostPtr, GraphicsAllocation *(size_t, void *)); MemoryManager::AllocationStatus MemoryManagerPopulateOsHandles(OsHandleStorage &handleStorage) { return OsAgnosticMemoryManager::populateOsHandles(handleStorage); } }; class MockAllocSysMemAgnosticMemoryManager : public OsAgnosticMemoryManager { public: MockAllocSysMemAgnosticMemoryManager(ExecutionEnvironment &executionEnvironment) : OsAgnosticMemoryManager(false, false, executionEnvironment) { ptrRestrictions = nullptr; testRestrictions.minAddress = 0; } AlignedMallocRestrictions *getAlignedMallocRestrictions() override { return ptrRestrictions; } void *allocateSystemMemory(size_t size, size_t alignment) override { constexpr size_t minAlignment = 16; alignment = std::max(alignment, minAlignment); return alignedMalloc(size, alignment); } AlignedMallocRestrictions testRestrictions; AlignedMallocRestrictions *ptrRestrictions; }; class FailMemoryManager : public MockMemoryManager { public: using MockMemoryManager::MockMemoryManager; FailMemoryManager(int32_t failedAllocationsCount); GraphicsAllocation *allocateGraphicsMemoryWithAlignment(const AllocationData &allocationData) override { if (failedAllocationsCount <= 0) { return nullptr; } failedAllocationsCount--; return OsAgnosticMemoryManager::allocateGraphicsMemoryWithAlignment(allocationData); }; GraphicsAllocation *allocateGraphicsMemoryForNonSvmHostPtr(size_t size, void *cpuPtr) override { return nullptr; } GraphicsAllocation *allocateGraphicsMemory64kb(AllocationData allocationData) override { return nullptr; }; GraphicsAllocation *allocateGraphicsMemory(size_t size, const void *ptr) override { return nullptr; }; GraphicsAllocation *allocate32BitGraphicsMemory(size_t size, const void *ptr, AllocationOrigin allocationOrigin) override { return nullptr; }; GraphicsAllocation *createGraphicsAllocationFromSharedHandle(osHandle handle, bool requireSpecificBitness) override { return nullptr; }; GraphicsAllocation *createGraphicsAllocationFromNTHandle(void *handle) override { return nullptr; }; void *lockResource(GraphicsAllocation *gfxAllocation) override { return nullptr; }; void unlockResource(GraphicsAllocation *gfxAllocation) override{}; MemoryManager::AllocationStatus populateOsHandles(OsHandleStorage &handleStorage) override { return AllocationStatus::Error; }; void cleanOsHandles(OsHandleStorage &handleStorage) override{}; uint64_t getSystemSharedMemory() override { return 0; }; uint64_t getMaxApplicationAddress() override { return MemoryConstants::max32BitAppAddress; }; GraphicsAllocation *createGraphicsAllocation(OsHandleStorage &handleStorage, size_t hostPtrSize, const void *hostPtr) override { return nullptr; }; GraphicsAllocation *allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) override { return nullptr; } int32_t failedAllocationsCount = 0; }; } // namespace OCLRT