189 lines
8.2 KiB
C++
189 lines
8.2 KiB
C++
/*
|
|
* Copyright (C) 2017-2019 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::multiContextResourceDestructor;
|
|
using MemoryManager::registeredOsContexts;
|
|
using OsAgnosticMemoryManager::allocateGraphicsMemoryForImageFromHostPtr;
|
|
using OsAgnosticMemoryManager::OsAgnosticMemoryManager;
|
|
|
|
MockMemoryManager(ExecutionEnvironment &executionEnvironment) : MockMemoryManager(false, executionEnvironment) {}
|
|
|
|
MockMemoryManager(bool enableLocalMemory, ExecutionEnvironment &executionEnvironment) : OsAgnosticMemoryManager(false, enableLocalMemory, executionEnvironment) {
|
|
hostPtrManager.reset(new MockHostPtrManager);
|
|
};
|
|
|
|
MockMemoryManager() : MockMemoryManager(*(new ExecutionEnvironment)) {
|
|
mockExecutionEnvironment.reset(&executionEnvironment);
|
|
};
|
|
MockMemoryManager(bool enable64pages, bool enableLocalMemory) : OsAgnosticMemoryManager(enable64pages, enableLocalMemory, *(new ExecutionEnvironment)) {
|
|
mockExecutionEnvironment.reset(&executionEnvironment);
|
|
}
|
|
GraphicsAllocation *allocateGraphicsMemory64kb(AllocationData allocationData) override;
|
|
void setDeferredDeleter(DeferredDeleter *deleter);
|
|
void overrideAsyncDeleterFlag(bool newValue);
|
|
GraphicsAllocation *allocateGraphicsMemoryForImage(const AllocationData &allocationData) override;
|
|
int redundancyRatio = 1;
|
|
|
|
GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override;
|
|
GraphicsAllocation *allocateGraphicsMemoryWithAlignment(const AllocationData &allocationData) override;
|
|
GraphicsAllocation *allocateGraphicsMemoryWithProperties(const AllocationProperties &properties) override;
|
|
|
|
void *allocateSystemMemory(size_t size, size_t alignment) override;
|
|
|
|
void freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation) override {
|
|
freeGraphicsMemoryCalled++;
|
|
OsAgnosticMemoryManager::freeGraphicsMemoryImpl(gfxAllocation);
|
|
};
|
|
|
|
void *lockResourceImpl(GraphicsAllocation &gfxAllocation) override {
|
|
lockResourceCalled++;
|
|
return OsAgnosticMemoryManager::lockResourceImpl(gfxAllocation);
|
|
}
|
|
|
|
void unlockResourceImpl(GraphicsAllocation &gfxAllocation) override {
|
|
unlockResourceCalled++;
|
|
OsAgnosticMemoryManager::unlockResourceImpl(gfxAllocation);
|
|
}
|
|
|
|
uint32_t freeGraphicsMemoryCalled = 0u;
|
|
uint32_t unlockResourceCalled = 0u;
|
|
uint32_t lockResourceCalled = 0u;
|
|
bool allocationCreated = false;
|
|
bool allocation64kbPageCreated = false;
|
|
bool allocationInDevicePoolCreated = false;
|
|
bool failInDevicePool = false;
|
|
bool failInDevicePoolWithError = false;
|
|
bool failInAllocateWithSizeAndAlignment = false;
|
|
bool preferRenderCompressedFlagPassed = false;
|
|
bool allocateForImageCalled = false;
|
|
std::unique_ptr<ExecutionEnvironment> mockExecutionEnvironment;
|
|
};
|
|
|
|
using AllocationData = MockMemoryManager::AllocationData;
|
|
|
|
class GMockMemoryManager : public MockMemoryManager {
|
|
public:
|
|
GMockMemoryManager(const ExecutionEnvironment &executionEnvironment) : MockMemoryManager(const_cast<ExecutionEnvironment &>(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 MemoryManager::allocateGraphicsMemory;
|
|
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(const AllocationProperties &properties, 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 *lockResourceImpl(GraphicsAllocation &gfxAllocation) override { return nullptr; };
|
|
void unlockResourceImpl(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(const AllocationData &allocationData) override {
|
|
return nullptr;
|
|
}
|
|
int32_t failedAllocationsCount = 0;
|
|
};
|
|
|
|
class GMockMemoryManagerFailFirstAllocation : public MockMemoryManager {
|
|
public:
|
|
GMockMemoryManagerFailFirstAllocation(bool enableLocalMemory, const ExecutionEnvironment &executionEnvironment) : MockMemoryManager(enableLocalMemory, const_cast<ExecutionEnvironment &>(executionEnvironment)){};
|
|
GMockMemoryManagerFailFirstAllocation(const ExecutionEnvironment &executionEnvironment) : GMockMemoryManagerFailFirstAllocation(false, executionEnvironment){};
|
|
|
|
MOCK_METHOD2(allocateGraphicsMemoryInDevicePool, GraphicsAllocation *(const AllocationData &, AllocationStatus &));
|
|
GraphicsAllocation *baseAllocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) {
|
|
return OsAgnosticMemoryManager::allocateGraphicsMemoryInDevicePool(allocationData, status);
|
|
}
|
|
GraphicsAllocation *allocateNonSystemGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) {
|
|
auto allocation = baseAllocateGraphicsMemoryInDevicePool(allocationData, status);
|
|
if (!allocation) {
|
|
allocation = allocateGraphicsMemory(allocationData);
|
|
}
|
|
static_cast<MemoryAllocation *>(allocation)->overrideMemoryPool(MemoryPool::SystemCpuInaccessible);
|
|
return allocation;
|
|
}
|
|
};
|
|
|
|
} // namespace OCLRT
|