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