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