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_RENDER_DATA_STRUCTURES_H
17 #define API_RENDER_RENDER_DATA_STRUCTURES_H
18 
19 #include <cstdint>
20 
21 #include <base/containers/fixed_string.h>
22 #include <base/containers/vector.h>
23 #include <base/math/vector.h>
24 #include <base/util/formats.h>
25 #include <render/device/gpu_resource_desc.h>
26 #include <render/device/intf_device.h>
27 #include <render/device/pipeline_state_desc.h>
28 #include <render/namespace.h>
29 #include <render/resource_handle.h>
30 
RENDER_BEGIN_NAMESPACE()31 RENDER_BEGIN_NAMESPACE()
32 /** \addtogroup group_render_renderdatastructures
33  *  @{
34  */
35 /** Render data constants */
36 namespace RenderDataConstants {
37 static constexpr uint32_t MAX_DEFAULT_NAME_LENGTH { 128 };
38 using RenderDataFixedString = BASE_NS::fixed_string<RenderDataConstants::MAX_DEFAULT_NAME_LENGTH>;
39 } // namespace RenderDataConstants
40 
41 /** Handle to gpu buffer.
42     Byte offset to buffer.
43     Byte size for vertex buffer.
44 */
45 struct VertexBuffer {
46     /** Buffer handle */
47     RenderHandle bufferHandle;
48     /** Buffer offset */
49     uint32_t bufferOffset { 0 };
50     /** Byte size */
51     uint32_t byteSize { PipelineStateConstants::GPU_BUFFER_WHOLE_SIZE };
52 };
53 
54 /** Index buffer */
55 struct IndexBuffer {
56     /** Buffer handle */
57     RenderHandle bufferHandle;
58     /** Buffer offset */
59     uint32_t bufferOffset { 0 };
60     /** Byte size */
61     uint32_t byteSize { PipelineStateConstants::GPU_BUFFER_WHOLE_SIZE };
62     /** Index type */
63     IndexType indexType { IndexType::CORE_INDEX_TYPE_UINT32 };
64 };
65 
66 /** Vertex buffer with render handle reference */
67 struct VertexBufferWithHandleReference {
68     /** Buffer handle */
69     RenderHandleReference bufferHandle;
70     /** Buffer offset */
71     uint32_t bufferOffset { 0 };
72     /** Byte size */
73     uint32_t byteSize { PipelineStateConstants::GPU_BUFFER_WHOLE_SIZE };
74 };
75 
76 /** Index buffer with render handle reference */
77 struct IndexBufferWithHandleReference {
78     /** Buffer handle */
79     RenderHandleReference bufferHandle;
80     /** Buffer offset */
81     uint32_t bufferOffset { 0 };
82     /** Byte size */
83     uint32_t byteSize { PipelineStateConstants::GPU_BUFFER_WHOLE_SIZE };
84     /** Index type */
85     IndexType indexType { IndexType::CORE_INDEX_TYPE_UINT32 };
86 };
87 
88 /** Helper struct for descriptor types and their counts.
89  */
90 struct DescriptorCounts {
91     /** Typed count */
92     struct TypedCount {
93         /** Type */
94         DescriptorType type { DescriptorType::CORE_DESCRIPTOR_TYPE_MAX_ENUM };
95         /** Count */
96         uint32_t count { 0u };
97     };
98 
99     /** Counts list */
100     BASE_NS::vector<TypedCount> counts;
101 };
102 
103 /** Acceleration AABB */
104 struct AabbPositions {
105     /** Min x */
106     float minX { 0.0f };
107     /** Min y */
108     float minY { 0.0f };
109     /** Min z */
110     float minZ { 0.0f };
111     /** Max x */
112     float maxX { 0.0f };
113     /** Max y */
114     float maxY { 0.0f };
115     /** Max z */
116     float maxZ { 0.0f };
117 };
118 
119 /** Render slot sort type */
120 enum class RenderSlotSortType : uint32_t {
121     /** Node */
122     NONE = 0,
123     /** Front to back */
124     FRONT_TO_BACK = 1,
125     /** Back to front */
126     BACK_TO_FRONT = 2,
127     /** By material */
128     BY_MATERIAL = 3,
129 };
130 
131 /** Render slot cull type */
132 enum class RenderSlotCullType : uint32_t {
133     /** None */
134     NONE = 0,
135     /** View frustum cull */
136     VIEW_FRUSTUM_CULL = 1,
137 };
138 
139 /** Render node graph resource type */
140 enum class RenderNodeGraphResourceLocationType : uint32_t {
141     /** Default, fetch with name */
142     DEFAULT = 0,
143     /** Get with input index from render node graph share */
144     FROM_RENDER_GRAPH_INPUT = 1,
145     /** Get with output index from render node graph share */
146     FROM_RENDER_GRAPH_OUTPUT = 2,
147     /** Get output index from previous render node */
148     FROM_PREVIOUS_RENDER_NODE_OUTPUT = 3,
149     /** Get output index from named render node */
150     FROM_NAMED_RENDER_NODE_OUTPUT = 4,
151     /** Get output from the previous render node graph */
152     FROM_PREVIOUS_RENDER_NODE_GRAPH_OUTPUT = 5,
153 };
154 
155 /** Set for default command buffer recording.
156     Requested queue type and index.
157 */
158 struct ContextInitDescription {
159     /** Requested queue */
160     GpuQueue requestedQueue;
161 };
162 
163 /** Render node resource */
164 struct RenderNodeResource {
165     /** Set of this resource */
166     uint32_t set { ~0u };
167     /** Binding */
168     uint32_t binding { ~0u };
169     /** Handle */
170     RenderHandle handle {};
171     /** Second handle (e.g. sampler for combined image sampler) */
172     RenderHandle secondHandle {};
173     /** Mip level for image binding */
174     uint32_t mip { PipelineStateConstants::GPU_IMAGE_ALL_MIP_LEVELS };
175     /** Layer for image binding */
176     uint32_t layer { PipelineStateConstants::GPU_IMAGE_ALL_LAYERS };
177 };
178 
179 /** Render node attachment */
180 struct RenderNodeAttachment {
181     /** Handle */
182     RenderHandle handle;
183 
184     /** Load operation */
185     AttachmentLoadOp loadOp { AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_DONT_CARE };
186     /** Store operation */
187     AttachmentStoreOp storeOp { AttachmentStoreOp::CORE_ATTACHMENT_STORE_OP_DONT_CARE };
188 
189     /** Stencil load operation */
190     AttachmentLoadOp stencilLoadOp { AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_DONT_CARE };
191     /** Stencil store operation */
192     AttachmentStoreOp stencilStoreOp { AttachmentStoreOp::CORE_ATTACHMENT_STORE_OP_DONT_CARE };
193 
194     /** Clear value */
195     ClearValue clearValue;
196 
197     /** Mip level */
198     uint32_t mip { 0u };
199     /** Layer */
200     uint32_t layer { 0u };
201 };
202 
203 /** RenderNodeHandles.
204     Helper struct for inputs that can be defined in pipeline initilization phase.
205 */
206 struct RenderNodeHandles {
207     /** Input render pass */
208     struct InputRenderPass {
209         /** Attachments array */
210         BASE_NS::vector<RenderNodeAttachment> attachments;
211 
212         /** Subpass index, if subpass index is other that zero, render pass is patched to previous render passes */
213         uint32_t subpassIndex { 0u };
214         /** Subpass count, automatically calculated from render node graph setup */
215         uint32_t subpassCount { 1u };
216 
217         /** Render pass subpass contents */
218         SubpassContents subpassContents { SubpassContents::CORE_SUBPASS_CONTENTS_INLINE };
219 
220         // render pass subpass attachment indices
221         /** Depth attachment index */
222         uint32_t depthAttachmentIndex { ~0u };
223         /** Depth resolve attachment index */
224         uint32_t depthResolveAttachmentIndex { ~0u };
225         /** Input attachment indices */
226         BASE_NS::vector<uint32_t> inputAttachmentIndices;
227         /** Color attachment indices */
228         BASE_NS::vector<uint32_t> colorAttachmentIndices;
229         /** Resolve attachment indices */
230         BASE_NS::vector<uint32_t> resolveAttachmentIndices;
231         /** Fragment shading rate attachment index */
232         uint32_t fragmentShadingRateAttachmentIndex { ~0u };
233 
234         /** Depth resolve mode flag bit */
235         ResolveModeFlagBits depthResolveModeFlagBit { ResolveModeFlagBits::CORE_RESOLVE_MODE_NONE };
236         /** Stencil resolve mode flag bit */
237         ResolveModeFlagBits stencilResolveModeFlagBit { ResolveModeFlagBits::CORE_RESOLVE_MODE_NONE };
238 
239         /** Shading rate attachment texel size for subpass */
240         Size2D shadingRateTexelSize { 1u, 1u };
241         /** Multi-view bitfield of view indices. Multi-view is ignored while zero. */
242         uint32_t viewMask { 0u };
243     };
244 
245     /** Input resources */
246     struct InputResources {
247         /** Buffers */
248         BASE_NS::vector<RenderNodeResource> buffers;
249         /** Images */
250         BASE_NS::vector<RenderNodeResource> images;
251         /** Samplers */
252         BASE_NS::vector<RenderNodeResource> samplers;
253 
254         /** Custom input buffers */
255         BASE_NS::vector<RenderNodeResource> customInputBuffers;
256         /** Custom output buffers */
257         BASE_NS::vector<RenderNodeResource> customOutputBuffers;
258 
259         /** Custom input images */
260         BASE_NS::vector<RenderNodeResource> customInputImages;
261         /** Custom output images */
262         BASE_NS::vector<RenderNodeResource> customOutputImages;
263     };
264 };
265 
266 /** Register all the inputs, outputs, resources etc. for RenderNode to use.
267  */
268 struct RenderNodeGraphInputs {
269     /** Resource */
270     struct Resource {
271         /** Set */
272         uint32_t set { ~0u };
273         /** Binding */
274         uint32_t binding { ~0u };
275         /** Name, optionally with FROM_NAMED_RENDER_NODE_OUTPUT the registered name */
276         RenderDataConstants::RenderDataFixedString name;
277         /** Usage name, optional usage name for some render nodes
278          * e.g. "depth", this should be handled as depth image
279          */
280         RenderDataConstants::RenderDataFixedString usageName;
281 
282         /** From where is the input routed. Default uses named GPU resource from GPU resource manager. */
283         RenderNodeGraphResourceLocationType resourceLocation { RenderNodeGraphResourceLocationType::DEFAULT };
284         /** Index of the routed input. */
285         uint32_t resourceIndex { ~0u };
286         /** Node name, with FROM_NAMED_RENDER_NODE_OUTPUT */
287         RenderDataConstants::RenderDataFixedString nodeName;
288 
289         /** Additional binding information */
290 
291         /** Mip level for image binding */
292         uint32_t mip { PipelineStateConstants::GPU_IMAGE_ALL_MIP_LEVELS };
293         /** Layer for image binding */
294         uint32_t layer { PipelineStateConstants::GPU_IMAGE_ALL_LAYERS };
295     };
296 
297     /** Attachment */
298     struct Attachment {
299         /** Load operation */
300         AttachmentLoadOp loadOp { AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_DONT_CARE };
301         /** Store operation */
302         AttachmentStoreOp storeOp { AttachmentStoreOp::CORE_ATTACHMENT_STORE_OP_DONT_CARE };
303 
304         /** Stencil load operation */
305         AttachmentLoadOp stencilLoadOp { AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_DONT_CARE };
306         /** Stencil store operation */
307         AttachmentStoreOp stencilStoreOp { AttachmentStoreOp::CORE_ATTACHMENT_STORE_OP_DONT_CARE };
308 
309         /** Clear value */
310         ClearValue clearValue {};
311 
312         /** Name, optionally with FROM_NAMED_RENDER_NODE_OUTPUT the registered name */
313         RenderDataConstants::RenderDataFixedString name;
314         /** From where is the input routed. Default uses named GPU resource from GPU resource manager. */
315         RenderNodeGraphResourceLocationType resourceLocation { RenderNodeGraphResourceLocationType::DEFAULT };
316         /** Index of the routed input. */
317         uint32_t resourceIndex { ~0u };
318         /** Node name, with FROM_NAMED_RENDER_NODE_OUTPUT */
319         RenderDataConstants::RenderDataFixedString nodeName;
320 
321         /** Mip level */
322         uint32_t mip { 0u };
323         /** Layer */
324         uint32_t layer { 0u };
325     };
326 
327     /** Shader input */
328     struct ShaderInput {
329         /** Name */
330         RenderDataConstants::RenderDataFixedString name;
331     };
332 
333     /** Input render pass */
334     struct InputRenderPass {
335         /** Render pass attachments */
336         BASE_NS::vector<Attachment> attachments;
337 
338         /** Subpass index, if subpass index is not zero, this subpass is patched to previous render pass */
339         uint32_t subpassIndex { 0u };
340         /** Subpass count, calculated automatically when loading render node graph */
341         uint32_t subpassCount { 1u };
342 
343         /** Render pass subpass contents */
344         SubpassContents subpassContents { SubpassContents::CORE_SUBPASS_CONTENTS_INLINE };
345 
346         /** Depth attachment index */
347         uint32_t depthAttachmentIndex { ~0u };
348         /** Depth resolve attachment index */
349         uint32_t depthResolveAttachmentIndex { ~0u };
350         /** Input attachment indices */
351         BASE_NS::vector<uint32_t> inputAttachmentIndices;
352         /** Color attachment indices */
353         BASE_NS::vector<uint32_t> colorAttachmentIndices;
354         /** Resolve attachment indices */
355         BASE_NS::vector<uint32_t> resolveAttachmentIndices;
356         /** Fragment shading rate attachment index */
357         uint32_t fragmentShadingRateAttachmentIndex { ~0u };
358 
359         /** Depth resolve mode flag bit */
360         ResolveModeFlagBits depthResolveModeFlagBit { ResolveModeFlagBits::CORE_RESOLVE_MODE_NONE };
361         /** Stencil resolve mode flag bit */
362         ResolveModeFlagBits stencilResolveModeFlagBit { ResolveModeFlagBits::CORE_RESOLVE_MODE_NONE };
363 
364         /** Shading rate attachment texel size for subpass
365          */
366         Size2D shadingRateTexelSize { 1u, 1u };
367         /** Multi-view bitfield of view indices. Multi-view is ignored while zero. */
368         uint32_t viewMask { 0u };
369     };
370 
371     /** Input resources (Descriptor sets etc.) */
372     struct InputResources {
373         // descriptors
374         /** Buffers */
375         BASE_NS::vector<Resource> buffers;
376         /** Images */
377         BASE_NS::vector<Resource> images;
378         /** Samplers */
379         BASE_NS::vector<Resource> samplers;
380 
381         /** Custom input buffers */
382         BASE_NS::vector<Resource> customInputBuffers;
383         /** Custom output buffers */
384         BASE_NS::vector<Resource> customOutputBuffers;
385 
386         /** Custom input images */
387         BASE_NS::vector<Resource> customInputImages;
388         /** Custom output images */
389         BASE_NS::vector<Resource> customOutputImages;
390     };
391 
392     /** Render node graph GPU buffer descriptor */
393     struct RenderNodeGraphGpuBufferDesc {
394         /** Name */
395         RenderDataConstants::RenderDataFixedString name;
396         /** Dependency buffer name */
397         RenderDataConstants::RenderDataFixedString dependencyBufferName;
398         /** Render node graph share name */
399         RenderDataConstants::RenderDataFixedString shareName;
400         /** Buffer descriptor (Contains: usage flags, memory property flags, engine buffer creation flags and byte size)
401          */
402         GpuBufferDesc desc;
403     };
404 
405     /** Render node graph GPU image descriptor */
406     struct RenderNodeGraphGpuImageDesc {
407         /** Name */
408         RenderDataConstants::RenderDataFixedString name;
409         /** Dependency image name */
410         RenderDataConstants::RenderDataFixedString dependencyImageName;
411         /** Render node graph share name */
412         RenderDataConstants::RenderDataFixedString shareName;
413         /** Dependency flag bits */
414         enum DependencyFlagBits : uint32_t {
415             /** Format */
416             FORMAT = 1,
417             /** Size */
418             SIZE = 2,
419             /** Mip count */
420             MIP_COUNT = 4,
421             /** Layer count */
422             LAYER_COUNT = 8,
423             /** Samples */
424             SAMPLES = 16,
425             /** Max enumeration */
426             MAX_DEPENDENCY_FLAG_ENUM = 0x7FFFFFFF
427         };
428         /** Container for dependency flag bits */
429         using DependencyFlags = uint32_t;
430         /** Dependency flags */
431         DependencyFlags dependencyFlags { 0 };
432         /** Dependency size scale (scales only the size if size is a dependency) */
433         float dependencySizeScale { 1.0f };
434         /** Fragment shading rate requested texel size
435          * Will check the valid values and divides the size
436          */
437         Size2D shadingRateTexelSize { 1u, 1u };
438         /** Image descriptor (GpuImageDesc) */
439         GpuImageDesc desc;
440     };
441 
442     /** Resource creation description */
443     struct ResourceCreationDescription {
444         /** GPU buffer descriptors */
445         BASE_NS::vector<RenderNodeGraphGpuBufferDesc> gpuBufferDescs;
446         /** GPU image descriptors */
447         BASE_NS::vector<RenderNodeGraphGpuImageDesc> gpuImageDescs;
448     };
449 
450     /** CPU dependencies */
451     struct CpuDependencies {
452         /** Render node type based dependancy. Finds previous render node of type */
453         BASE_NS::vector<RenderDataConstants::RenderDataFixedString> typeNames;
454         /** Render node name based dependancy. Finds previous render node of name */
455         BASE_NS::vector<RenderDataConstants::RenderDataFixedString> nodeNames;
456     };
457 
458     /** GPU queue wait signal dependencies */
459     struct GpuQueueWaitForSignals {
460         /** Render node type based dependancy. Finds previous render node of type */
461         BASE_NS::vector<RenderDataConstants::RenderDataFixedString> typeNames;
462         /** Render node name based dependancy. Finds previous render node of name */
463         BASE_NS::vector<RenderDataConstants::RenderDataFixedString> nodeNames;
464     };
465 
466     /** Render data store */
467     struct RenderDataStore {
468         /** Data store name */
469         RenderDataConstants::RenderDataFixedString dataStoreName;
470         /** Type name */
471         RenderDataConstants::RenderDataFixedString typeName;
472         /** Configuration name */
473         RenderDataConstants::RenderDataFixedString configurationName;
474     };
475 
476     /** Queue */
477     GpuQueue queue;
478     /** CPU dependency */
479     CpuDependencies cpuDependencies;
480     /** GPU queue wait for signals */
481     GpuQueueWaitForSignals gpuQueueWaitForSignals;
482     /** Base render data store hook */
483     RenderDataConstants::RenderDataFixedString nodeDataStoreName;
484 };
485 
486 /** Rendering configuration */
487 struct RenderingConfiguration {
488     /** Render backend */
489     DeviceBackendType renderBackend { DeviceBackendType::VULKAN };
490     /** NDC origin enumeration */
491     enum class NdcOrigin {
492         /** Undefined */
493         UNDEFINED = 0,
494         /** "Topleft (Vulkan, Default)" */
495         TOP_LEFT = 1,
496         /** "Bottomleft (OpenGL, OpenGL ES)" */
497         BOTTOM_LEFT = 2
498     };
499     /** NDC origin */
500     NdcOrigin ndcOrigin { NdcOrigin::TOP_LEFT };
501     /** Render timings
502      *(.x = delta time (ms), .y = tick delta time (ms), .z = tick total time (s), .w = frame index (asuint)) */
503     BASE_NS::Math::Vec4 renderTimings { 0.0f, 0.0f, 0.0f, 0.0f };
504 };
505 
506 /** Render node graph data */
507 struct RenderNodeGraphData {
508     /** Render node graph name */
509     RenderDataConstants::RenderDataFixedString renderNodeGraphName;
510     /** Name of the first (access point) data store */
511     RenderDataConstants::RenderDataFixedString renderNodeGraphDataStoreName;
512     /** Rendering configuration */
513     RenderingConfiguration renderingConfiguration;
514 };
515 /** @} */
516 RENDER_END_NAMESPACE()
517 
518 #endif // API_RENDER_RENDER_DATA_STRUCTURES_H
519