vgl 1.0.0
Virtual Globe Library: API reference
Loading...
Searching...
No Matches
render.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 Jeremiah van Oosten
3//
4// C++ wrapper for vgl/render.h (docs/c-api.md, section 16; docs/render-interface.md).
5
6#ifndef VGL_RENDER_HPP
7#define VGL_RENDER_HPP
8
9#include <vgl/base.hpp>
10#include <vgl/context.hpp>
11#include <vgl/render.h>
12
13#include <cstdint>
14#include <span>
15#include <utility>
16
17namespace vgl
18{
19
20// How depth is written and compared (vgl_depth_convention).
27
28// An open frame of a context. It ends when destroyed, so a frame cannot be left open by an
29// early return. Its lists are valid until it ends.
30class frame
31{
32public:
35 frame(const frame&) = delete;
36 frame& operator=(const frame&) = delete;
37 frame(frame&& other) noexcept : handle_(std::exchange(other.handle_, nullptr)) {}
39 {
40 if (this != &other)
41 {
42 end();
43 handle_ = std::exchange(other.handle_, nullptr);
44 }
45 return *this;
46 }
47 ~frame() { end(); }
48
49 // Begins a frame. The lists are read as spans of this header's structures, so the strides
50 // in info (draw_item_size and the others) must be 0 or this header's sizes; other strides
51 // return result::invalid_argument here, and are read through the C API instead.
53 const vgl_frame_begin_info* info = nullptr) noexcept
54 {
55 if (info != nullptr && !own_strides(*info))
56 {
58 }
59 vgl_frame* handle = nullptr;
60 const auto r = static_cast<result>(vgl_context_frame_begin(owner.get(), info, &handle));
61 if (failed(r))
62 {
63 return unexpected(r);
64 }
65 return frame(handle);
66 }
67
68 [[nodiscard]] vgl_frame* get() const noexcept { return handle_; }
69 [[nodiscard]] explicit operator bool() const noexcept { return handle_ != nullptr; }
70
71 // The lists, in the order to apply them. The frame must be open.
72 [[nodiscard]] std::span<const std::uint64_t> destroys_get() const noexcept
73 {
74 return list(&vgl_frame_destroys_get);
75 }
76 [[nodiscard]] std::span<const vgl_index_list_data> index_lists_get() const noexcept
77 {
78 return list(&vgl_frame_index_lists_get);
79 }
80 [[nodiscard]] std::span<const vgl_mesh_data> meshes_get() const noexcept
81 {
82 return list(&vgl_frame_meshes_get);
83 }
84 [[nodiscard]] std::span<const vgl_texture_data> textures_get() const noexcept
85 {
86 return list(&vgl_frame_textures_get);
87 }
88 [[nodiscard]] std::span<const vgl_draw_item> draw_list_get() const noexcept
89 {
90 return list(&vgl_frame_draw_list_get);
91 }
92 [[nodiscard]] std::span<const vgl_draw_layer> draw_layers_get() const noexcept
93 {
94 return list(&vgl_frame_draw_layers_get);
95 }
96
97 [[nodiscard]] result resource_handle_set(std::uint64_t resource, std::uint64_t handle) noexcept
98 {
99 return static_cast<result>(vgl_frame_resource_handle_set(handle_, resource, handle));
100 }
101
102 [[nodiscard]] result resource_failed(std::uint64_t resource, result reason) noexcept
103 {
104 return static_cast<result>(
105 vgl_frame_resource_failed(handle_, resource, static_cast<vgl_result>(reason)));
106 }
107
108 // Ends the frame early; the destructor does nothing then.
109 void end() noexcept { static_cast<void>(vgl_frame_end(std::exchange(handle_, nullptr))); }
110
111private:
112 template <typename T>
113 [[nodiscard]] static constexpr bool own_stride(std::uint32_t stride) noexcept
114 {
115 return stride == 0 || stride == sizeof(T);
116 }
117
118 [[nodiscard]] static constexpr bool own_strides(const vgl_frame_begin_info& info) noexcept
119 {
120 // The C API rejects a smaller structure; its strides are not read here.
121 if (info.struct_size < sizeof(vgl_frame_begin_info))
122 {
123 return true;
124 }
125 return own_stride<vgl_draw_item>(info.draw_item_size) &&
126 own_stride<vgl_draw_layer>(info.draw_layer_size) &&
127 own_stride<vgl_index_list_data>(info.index_list_data_size) &&
128 own_stride<vgl_mesh_data>(info.mesh_data_size) &&
129 own_stride<vgl_texture_data>(info.texture_data_size);
130 }
131
132 template <typename T>
133 using getter = vgl_result (*)(const vgl_frame*, const T**, std::uint32_t*);
134
135 template <typename T>
136 [[nodiscard]] std::span<const T> list(getter<T> fetch) const noexcept
137 {
138 const T* data = nullptr;
139 std::uint32_t count = 0;
140 if (handle_ == nullptr || fetch(handle_, &data, &count) != VGL_RESULT_SUCCESS)
141 {
142 return {};
143 }
144 return {data, count};
145 }
146
147 vgl_frame* handle_ = nullptr;
148};
149
150} // namespace vgl
151
152#endif // VGL_RENDER_HPP
vgl_result
Definition base.h:98
@ VGL_RESULT_SUCCESS
Definition base.h:100
Definition context.hpp:106
Definition base.hpp:87
Definition render.hpp:31
std::span< const vgl_draw_layer > draw_layers_get() const noexcept
Definition render.hpp:92
std::span< const vgl_draw_item > draw_list_get() const noexcept
Definition render.hpp:88
result resource_handle_set(std::uint64_t resource, std::uint64_t handle) noexcept
Definition render.hpp:97
std::span< const std::uint64_t > destroys_get() const noexcept
Definition render.hpp:72
std::span< const vgl_mesh_data > meshes_get() const noexcept
Definition render.hpp:80
std::span< const vgl_index_list_data > index_lists_get() const noexcept
Definition render.hpp:76
void end() noexcept
Definition render.hpp:109
frame() noexcept=default
std::span< const vgl_texture_data > textures_get() const noexcept
Definition render.hpp:84
frame(frame &&other) noexcept
Definition render.hpp:37
result resource_failed(std::uint64_t resource, result reason) noexcept
Definition render.hpp:102
~frame()
Definition render.hpp:47
frame & operator=(frame &&other) noexcept
Definition render.hpp:38
vgl_frame * get() const noexcept
Definition render.hpp:68
frame & operator=(const frame &)=delete
static expected< frame > begin(context &owner, const vgl_frame_begin_info *info=nullptr) noexcept
Definition render.hpp:52
frame(const frame &)=delete
Definition base.hpp:72
Definition base.hpp:22
depth_convention
Definition render.hpp:22
result
Definition base.hpp:25
vgl_result vgl_frame_destroys_get(const vgl_frame *frame, const uint64_t **out_resources, uint32_t *out_count)
vgl_result vgl_frame_draw_list_get(const vgl_frame *frame, const vgl_draw_item **out_items, uint32_t *out_count)
vgl_result vgl_frame_end(vgl_frame *frame)
vgl_result vgl_frame_meshes_get(const vgl_frame *frame, const vgl_mesh_data **out_meshes, uint32_t *out_count)
struct vgl_frame vgl_frame
Definition render.h:195
vgl_result vgl_frame_resource_handle_set(vgl_frame *frame, uint64_t resource, uint64_t handle)
vgl_result vgl_frame_index_lists_get(const vgl_frame *frame, const vgl_index_list_data **out_index_lists, uint32_t *out_count)
vgl_result vgl_frame_textures_get(const vgl_frame *frame, const vgl_texture_data **out_textures, uint32_t *out_count)
@ VGL_DEPTH_CONVENTION_LOGARITHMIC
Definition render.h:112
@ VGL_DEPTH_CONVENTION_CONVENTIONAL
Definition render.h:121
@ VGL_DEPTH_CONVENTION_REVERSED_Z
Definition render.h:118
vgl_result vgl_frame_resource_failed(vgl_frame *frame, uint64_t resource, vgl_result reason)
vgl_result vgl_frame_draw_layers_get(const vgl_frame *frame, const vgl_draw_layer **out_layers, uint32_t *out_count)
vgl_result vgl_context_frame_begin(vgl_context *context, const vgl_frame_begin_info *info, vgl_frame **out_frame)
Definition render.h:245