1 /*
2  * Copyright (C) 2020-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 
10 #include "shared/test/common/mocks/mock_device.h"
11 
12 #include "opencl/source/cl_device/cl_device.h"
13 #include "opencl/test/unit_test/mocks/mock_cl_execution_environment.h"
14 
15 namespace NEO {
16 class FailMemoryManager;
17 class OSTime;
18 class SubDevice;
19 template <typename GfxFamily>
20 class UltCommandStreamReceiver;
21 struct HardwareInfo;
22 
23 extern CommandStreamReceiver *createCommandStream(ExecutionEnvironment &executionEnvironment,
24                                                   uint32_t rootDeviceIndex,
25                                                   const DeviceBitfield deviceBitfield);
26 
27 class MockClDevice : public ClDevice {
28   public:
29     using ClDevice::ClDevice;
30     using ClDevice::compilerExtensions;
31     using ClDevice::compilerExtensionsWithFeatures;
32     using ClDevice::deviceExtensions;
33     using ClDevice::deviceInfo;
34     using ClDevice::driverInfo;
35     using ClDevice::enabledClVersion;
36     using ClDevice::getClDeviceName;
37     using ClDevice::getQueueFamilyCapabilities;
38     using ClDevice::getQueueFamilyCapabilitiesAll;
39     using ClDevice::initializeCaps;
40     using ClDevice::name;
41     using ClDevice::ocl21FeaturesEnabled;
42     using ClDevice::simultaneousInterops;
43     using ClDevice::subDevices;
44 
45     explicit MockClDevice(MockDevice *pMockDevice);
46 
createEngines()47     bool createEngines() { return device.createEngines(); }
setOSTime(OSTime * osTime)48     void setOSTime(OSTime *osTime) { device.setOSTime(osTime); }
getCpuTime(uint64_t * timeStamp)49     bool getCpuTime(uint64_t *timeStamp) { return device.getCpuTime(timeStamp); }
setPreemptionMode(PreemptionMode mode)50     void setPreemptionMode(PreemptionMode mode) { device.setPreemptionMode(mode); }
injectMemoryManager(MemoryManager * pMemoryManager)51     void injectMemoryManager(MemoryManager *pMemoryManager) { device.injectMemoryManager(pMemoryManager); }
setPerfCounters(PerformanceCounters * perfCounters)52     void setPerfCounters(PerformanceCounters *perfCounters) { device.setPerfCounters(perfCounters); }
getProductAbbrev()53     const char *getProductAbbrev() const { return device.getProductAbbrev(); }
54     template <typename T>
getUltCommandStreamReceiver()55     UltCommandStreamReceiver<T> &getUltCommandStreamReceiver() { return device.getUltCommandStreamReceiver<T>(); }
56     template <typename T>
getUltCommandStreamReceiverFromIndex(uint32_t index)57     UltCommandStreamReceiver<T> &getUltCommandStreamReceiverFromIndex(uint32_t index) { return device.getUltCommandStreamReceiverFromIndex<T>(index); }
getGpgpuCommandStreamReceiver()58     CommandStreamReceiver &getGpgpuCommandStreamReceiver() const { return device.getGpgpuCommandStreamReceiver(); }
resetCommandStreamReceiver(CommandStreamReceiver * newCsr)59     void resetCommandStreamReceiver(CommandStreamReceiver *newCsr) { device.resetCommandStreamReceiver(newCsr); }
resetCommandStreamReceiver(CommandStreamReceiver * newCsr,uint32_t engineIndex)60     void resetCommandStreamReceiver(CommandStreamReceiver *newCsr, uint32_t engineIndex) { device.resetCommandStreamReceiver(newCsr, engineIndex); }
setSourceLevelDebuggerActive(bool active)61     void setSourceLevelDebuggerActive(bool active) { device.setDebuggerActive(active); }
62     template <typename T>
createWithExecutionEnvironment(const HardwareInfo * pHwInfo,ExecutionEnvironment * executionEnvironment,uint32_t rootDeviceIndex)63     static T *createWithExecutionEnvironment(const HardwareInfo *pHwInfo, ExecutionEnvironment *executionEnvironment, uint32_t rootDeviceIndex) {
64         return MockDevice::createWithExecutionEnvironment<T>(pHwInfo, executionEnvironment, rootDeviceIndex);
65     }
66     template <typename T>
67     static T *createWithNewExecutionEnvironment(const HardwareInfo *pHwInfo, uint32_t rootDeviceIndex = 0) {
68         auto executionEnvironment = prepareExecutionEnvironment(pHwInfo, rootDeviceIndex);
69         return MockDevice::createWithExecutionEnvironment<T>(pHwInfo, executionEnvironment, rootDeviceIndex);
70     }
prepareExecutionEnvironment(const HardwareInfo * pHwInfo,uint32_t rootDeviceIndex)71     static ExecutionEnvironment *prepareExecutionEnvironment(const HardwareInfo *pHwInfo, uint32_t rootDeviceIndex) {
72         auto executionEnvironment = new MockClExecutionEnvironment();
73         auto numRootDevices = DebugManager.flags.CreateMultipleRootDevices.get() ? DebugManager.flags.CreateMultipleRootDevices.get() : rootDeviceIndex + 1;
74         executionEnvironment->prepareRootDeviceEnvironments(numRootDevices);
75         pHwInfo = pHwInfo ? pHwInfo : defaultHwInfo.get();
76         for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) {
77             executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(pHwInfo);
78         }
79         executionEnvironment->calculateMaxOsContextCount();
80         return executionEnvironment;
81     }
createSubDevice(uint32_t subDeviceIndex)82     SubDevice *createSubDevice(uint32_t subDeviceIndex) { return device.createSubDevice(subDeviceIndex); }
createCommandStreamReceiver()83     std::unique_ptr<CommandStreamReceiver> createCommandStreamReceiver() const { return device.createCommandStreamReceiver(); }
getBuiltIns()84     BuiltIns *getBuiltIns() const { return getDevice().getBuiltIns(); }
85 
86     bool areOcl21FeaturesSupported() const;
87 
setDebuggerActive(bool active)88     void setDebuggerActive(bool active) {
89         sharedDeviceInfo.debuggerActive = active;
90     }
91 
92     MockDevice &device;
93     DeviceInfo &sharedDeviceInfo;
94     ExecutionEnvironment *&executionEnvironment;
95     static bool &createSingleDevice;
96     static decltype(&createCommandStream) &createCommandStreamReceiverFunc;
97     std::vector<EngineControl> &allEngines;
98 };
99 
100 class MockDeviceWithDebuggerActive : public MockDevice {
101   public:
MockDeviceWithDebuggerActive(ExecutionEnvironment * executionEnvironment,uint32_t deviceIndex)102     MockDeviceWithDebuggerActive(ExecutionEnvironment *executionEnvironment, uint32_t deviceIndex) : MockDevice(executionEnvironment, deviceIndex) {}
initializeCaps()103     void initializeCaps() override {
104         MockDevice::initializeCaps();
105         this->setDebuggerActive(true);
106     }
107 };
108 
109 } // namespace NEO
110