1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/source/command_stream/preemption_mode.h"
10 #include "shared/source/helpers/common_types.h"
11 #include "shared/source/helpers/engine_node_helper.h"
12 #include "shared/source/utilities/reference_tracked_object.h"
13 
14 #include "engine_node.h"
15 
16 #include <memory>
17 #include <mutex>
18 
19 namespace NEO {
20 class OSInterface;
21 
22 struct DirectSubmissionProperties;
23 struct HardwareInfo;
24 
25 class OsContext : public ReferenceTrackedObject<OsContext> {
26   public:
27     OsContext(uint32_t contextId, const EngineDescriptor &engineDescriptor);
28     static OsContext *create(OSInterface *osInterface, uint32_t contextId, const EngineDescriptor &engineDescriptor);
29 
30     bool isImmediateContextInitializationEnabled(bool isDefaultEngine) const;
isInitialized()31     bool isInitialized() const { return contextInitialized; }
32     void ensureContextInitialized();
33 
getContextId()34     uint32_t getContextId() const { return contextId; }
getNumSupportedDevices()35     uint32_t getNumSupportedDevices() const { return numSupportedDevices; }
getDeviceBitfield()36     DeviceBitfield getDeviceBitfield() const { return deviceBitfield; }
getPreemptionMode()37     PreemptionMode getPreemptionMode() const { return preemptionMode; }
getEngineType()38     aub_stream::EngineType &getEngineType() { return engineType; }
getEngineUsage()39     EngineUsage getEngineUsage() { return engineUsage; }
isRegular()40     bool isRegular() const { return engineUsage == EngineUsage::Regular; }
isLowPriority()41     bool isLowPriority() const { return engineUsage == EngineUsage::LowPriority; }
isInternalEngine()42     bool isInternalEngine() const { return engineUsage == EngineUsage::Internal; }
isCooperativeEngine()43     bool isCooperativeEngine() const { return engineUsage == EngineUsage::Cooperative; }
isRootDevice()44     bool isRootDevice() const { return rootDevice; }
isEngineInstanced()45     bool isEngineInstanced() const { return engineInstancedDevice; }
isDirectSubmissionSupported(const HardwareInfo & hwInfo)46     virtual bool isDirectSubmissionSupported(const HardwareInfo &hwInfo) const { return false; }
isDefaultContext()47     bool isDefaultContext() const { return defaultContext; }
setDefaultContext(bool value)48     void setDefaultContext(bool value) { defaultContext = value; }
isDirectSubmissionActive()49     bool isDirectSubmissionActive() { return directSubmissionActive; }
setDirectSubmissionActive()50     void setDirectSubmissionActive() { directSubmissionActive = true; }
51 
52     bool isDirectSubmissionAvailable(const HardwareInfo &hwInfo, bool &submitOnInit);
53     bool checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty,
54                                              aub_stream::EngineType contextEngineType,
55                                              bool &startOnInit,
56                                              bool &startInContext);
57 
58   protected:
initializeContext()59     virtual void initializeContext() {}
60 
61     const uint32_t contextId;
62     const DeviceBitfield deviceBitfield;
63     const PreemptionMode preemptionMode;
64     const uint32_t numSupportedDevices;
65     aub_stream::EngineType engineType = aub_stream::ENGINE_RCS;
66     const EngineUsage engineUsage;
67     const bool rootDevice = false;
68     bool defaultContext = false;
69     bool directSubmissionActive = false;
70     bool directSubmissionAvailableChecked = false;
71     std::once_flag contextInitializedFlag = {};
72     bool contextInitialized = false;
73     bool engineInstancedDevice = false;
74 };
75 } // namespace NEO
76