1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef API_RENDER_IRENDER_CONTEXT_H
17 #define API_RENDER_IRENDER_CONTEXT_H
18 
19 #include <base/containers/string.h>
20 #include <base/containers/string_view.h>
21 #include <core/plugin/intf_class_factory.h>
22 #include <render/device/intf_device.h>
23 #include <render/namespace.h>
24 #include <render/resource_handle.h>
25 
26 CORE_BEGIN_NAMESPACE()
27 class IEngine;
28 CORE_END_NAMESPACE()
29 
30 RENDER_BEGIN_NAMESPACE()
31 class IRenderDataStoreManager;
32 class IRenderNodeGraphManager;
33 class IRenderer;
34 class IRenderUtil;
35 
36 /**
37  * RenderResultCode
38  */
39 enum class RenderResultCode : uint32_t {
40     RENDER_SUCCESS = 0,
41     RENDER_ERROR = 1,
42 };
43 
44 /**
45  * VersionInfo
46  */
47 struct VersionInfo {
48     /** Name, default is "no_name" */
49     BASE_NS::string name { "no_name" };
50     /** Major number of version */
51     uint32_t versionMajor { 0 };
52     /** Minor number of version */
53     uint32_t versionMinor { 0 };
54     /** Patch number of version */
55     uint32_t versionPatch { 0 };
56 };
57 
58 /**
59  * RenderCreateInfo
60  */
61 struct RenderCreateInfo {
62     /** Create info flag bits to setup configuration flags */
63     enum CreateInfoFlagBits : uint32_t {
64         /** Request double buffered render data stores for better multi-threading options */
65         DOUBLE_BUFFERED_RENDER_DATA_STORES = 0x00000001,
66         /** Request separate render frame backend (backend graphics API control) */
67         SEPARATE_RENDER_FRAME_BACKEND = 0x00000002,
68         /** Request separate render frame present (backend graphics API presentation) */
69         SEPARATE_RENDER_FRAME_PRESENT = 0x00000004,
70     };
71     /** Container for render create info flag bits */
72     using CreateInfoFlags = uint32_t;
73 
74     /** Application version info */
75     VersionInfo applicationInfo;
76     /** Device create info */
77     DeviceCreateInfo deviceCreateInfo;
78     /** Creation flags */
79     CreateInfoFlags createFlags { 0 };
80 };
81 
82 /**
83  * IRenderContext interface for accessing managers and renderer.
84  * Device must be created to access valid renderer, render node graph manager, and render data store manager.
85  */
86 class IRenderContext : public CORE_NS::IClassFactory {
87 public:
88     static constexpr auto UID = BASE_NS::Uid { "c8d8650b-efac-4e04-8e66-e12b35d2749e" };
89     using Ptr = BASE_NS::refcnt_ptr<IRenderContext>;
90 
91     /** Init, create device for render use.
92      *  @param createInfo Device creation info.
93      */
94     virtual RenderResultCode Init(const RenderCreateInfo& createInfo) = 0;
95 
96     /** Get active device. */
97     virtual IDevice& GetDevice() const = 0;
98     /** Get rendererer */
99     virtual IRenderer& GetRenderer() const = 0;
100     /** Get render node graph manager */
101     virtual IRenderNodeGraphManager& GetRenderNodeGraphManager() const = 0;
102     /** Get render data store manager */
103     virtual IRenderDataStoreManager& GetRenderDataStoreManager() const = 0;
104 
105     /** Get render utilities */
106     virtual IRenderUtil& GetRenderUtil() const = 0;
107 
108     /** Get engine */
109     virtual CORE_NS::IEngine& GetEngine() const = 0;
110 
111     /** Get version */
112     virtual BASE_NS::string_view GetVersion() = 0;
113 
114 protected:
115     IRenderContext() = default;
116     virtual ~IRenderContext() = default;
117 };
118 
GetName(const IRenderContext *)119 inline constexpr BASE_NS::string_view GetName(const IRenderContext*)
120 {
121     return "IRenderContext";
122 }
123 RENDER_END_NAMESPACE()
124 
125 #endif // API_RENDER_IRENDER_CONTEXT_H
126