nngn
Loading...
Searching...
No Matches
graphics.h
Go to the documentation of this file.
1
69#ifndef NNGN_GRAPHICS_GRAPHICS_H
70#define NNGN_GRAPHICS_GRAPHICS_H
71
72#include <array>
73#include <bit>
74#include <cmath>
75#include <cstdint>
76#include <memory>
77#include <span>
78#include <string>
79#include <tuple>
80
81#include "const.h"
82#include "math/mat4.h"
83#include "math/math.h"
84#include "math/vec2.h"
85#include "math/vec3.h"
86#include "utils/def.h"
87#include "utils/flags.h"
88#include "utils/utils.h"
89
90#include "stats.h"
91
92struct GLFWwindow;
93
94namespace nngn {
95
96struct CameraUBO { mat4 proj, view; };
97struct Vertex { vec3 pos, color; };
98
99struct Graphics {
100 using size_callback_f = void (*)(void*, uvec2);
101 using key_callback_f = void (*)(void*, int, int, int, int);
102 using mouse_button_callback_f = void (*)(void*, int, int, int);
103 using mouse_move_callback_f = void (*)(void*, dvec2);
104 enum class Backend : u8 {
106 };
107 enum class LogLevel { DEBUG, WARNING, ERROR };
109 struct Parameters {
110 enum Flag {
111 HIDDEN = 1u << 0, DEBUG = 1u << 1,
112 };
114 };
115 struct Version { u32 major, minor, patch; const char *name; };
116 struct OpenGLParameters : Parameters { int maj = {}, min = {}; };
120 };
121 struct Extension {
122 static constexpr std::size_t name_max_len = 256;
123 std::array<char, name_max_len> name = {};
125 };
126 struct Layer {
127 std::array<char, 256> name = {};
128 std::array<char, 256> description = {};
129 std::array<char, 15> spec_version = {};
131 };
132 struct DeviceInfo {
133 enum class Type {
135 };
136 std::array<char, 256> name = {};
137 std::array<char, 15> version = {};
139 Type type = {};
140 };
141 struct QueueFamily {
142 enum Flag : u8 {
143 GRAPHICS = 1u << 0, COMPUTE = 1u << 1, TRANSFER = 1u << 2,
144 PRESENT = 1u << 3,
145 };
146 u32 count = {};
148 };
149 struct MemoryHeap {
150 enum Flag : u8 { DEVICE_LOCAL = 1u << 0 };
151 u64 size = {};
153 };
154 struct MemoryType {
155 enum Flag : std::uint8_t {
156 DEVICE_LOCAL = 1u << 0, HOST_VISIBLE = 1u << 1,
157 HOST_COHERENT = 1u << 2, HOST_CACHED = 1u << 3,
159 };
161 };
162 struct SurfaceInfo {
165 };
167 enum Flag : u8 {
168 DEPTH_TEST = 1u << 0,
170 };
171 enum class Type : u8 {
173 };
174 const char *name = {};
175 Type type = {};
177 };
179 enum class Type { VERTEX, INDEX };
180 const char *name = {};
181 Type type = {};
182 u64 size = {};
183 };
184 struct RenderList {
185 struct Stage {
187 std::span<const std::pair<u32, u32>> buffers = {};
188 };
189 std::span<const Stage> normal = {}, overlay = {};
190 };
192 struct Camera {
193 const uvec2 *screen = nullptr;
194 const mat4 *proj = nullptr, *view = nullptr;
195 };
196 static constexpr u32
201 static_assert(std::popcount(TEXTURE_EXTENT) == 1);
202 static std::unique_ptr<Graphics> create(Backend b, const void *params);
203 static const char *enum_str(DeviceInfo::Type t);
204 static const char *enum_str(QueueFamily::Flag f);
205 static const char *enum_str(PresentMode m);
206 static const char *enum_str(MemoryHeap::Flag m);
207 static const char *enum_str(MemoryType::Flag m);
208 static std::string flags_str(QueueFamily::Flag f);
209 static std::string flags_str(MemoryHeap::Flag f);
210 static std::string flags_str(MemoryType::Flag f);
212 // Initialization
217 virtual bool init();
218 virtual bool init_backend() = 0;
219 virtual bool init_instance() = 0;
220 virtual bool init_device() = 0;
221 virtual bool init_device(std::size_t i) = 0;
222 // Information
223 virtual std::size_t n_extensions() const = 0;
224 virtual std::size_t n_layers() const = 0;
225 virtual std::size_t n_devices() const = 0;
226 virtual std::size_t n_device_extensions(std::size_t i) const = 0;
227 virtual std::size_t n_queue_families(std::size_t i) const = 0;
228 virtual std::size_t n_present_modes() const = 0;
229 virtual std::size_t n_heaps(std::size_t i) const = 0;
230 virtual std::size_t n_memory_types(std::size_t i, std::size_t ih) const = 0;
231 virtual std::size_t selected_device() const = 0;
232 virtual void extensions(Extension *p) const = 0;
233 virtual void layers(Layer *p) const = 0;
234 virtual void device_infos(DeviceInfo *p) const = 0;
235 virtual void device_extensions(std::size_t i, Extension *p) const = 0;
236 virtual void queue_families(std::size_t i, QueueFamily *p) const = 0;
237 virtual SurfaceInfo surface_info() const = 0;
238 virtual void present_modes(PresentMode *p) const = 0;
239 virtual void heaps(std::size_t i, MemoryHeap *p) const = 0;
240 virtual void memory_types(
241 std::size_t i, std::size_t ih, MemoryType *p) const = 0;
242 // Operations
243 virtual bool error() = 0;
244 virtual Version version() const = 0;
245 virtual bool window_closed() const = 0;
246 virtual int swap_interval() const = 0;
247 virtual uvec2 window_size() const = 0;
248 virtual GraphicsStats stats() = 0;
249 virtual void get_keys(size_t n, int32_t *keys) const = 0;
250 virtual ivec2 mouse_pos(void) const = 0;
251 virtual bool set_n_frames(std::size_t n) = 0;
252 virtual bool set_n_swap_chain_images(std::size_t n) = 0;
253 virtual void set_swap_interval(int i) = 0;
254 virtual void set_window_title(const char *t) = 0;
255 virtual void set_cursor_mode(CursorMode m) = 0;
256 virtual void set_size_callback(void *data, size_callback_f f) = 0;
257 virtual void set_key_callback(void *data, key_callback_f f) = 0;
259 void *data, mouse_button_callback_f f) = 0;
261 void *data, mouse_move_callback_f f) = 0;
262 virtual void resize(int w, int h) = 0;
263 virtual void set_camera(const Camera &c) = 0;
264 virtual void set_camera_updated() = 0;
265 // Pipelines
266 virtual u32 create_pipeline(const PipelineConfiguration &conf) = 0;
267 // Buffers
268 virtual u32 create_buffer(const BufferConfiguration &conf) = 0;
269 virtual bool set_buffer_capacity(u32 b, u64 size) = 0;
270 virtual bool set_buffer_size(u32 b, std::uint64_t size) = 0;
271 virtual bool write_to_buffer(
272 u32 b, u64 offset, u64 n, u64 size,
273 void *data, void f(void*, void*, u64, u64)) = 0;
274 template<typename F>
275 bool write_to_buffer(u32 b, u64 offset, u64 n, u64 size, F &&f);
276 bool update_buffers(
277 u32 vbo, u32 ebo, u64 voff, u64 eoff,
278 u64 vn, u64 vsize, u64 en, u64 esize,
279 void *data, auto &&vgen, auto &&egen);
280 // Textures
281 virtual bool resize_textures(std::uint32_t s) = 0;
282 virtual bool load_textures(
283 std::uint32_t i, std::uint32_t n, const std::byte *v) = 0;
284 // Rendering
285 virtual bool set_render_list(const RenderList &l) = 0;
286 virtual void poll_events() const = 0;
287 virtual bool render() = 0;
288 virtual bool vsync() = 0;
289};
290
291inline bool Graphics::init() {
292 return this->init_backend()
293 && this->init_instance()
294 && this->init_device({});
295}
296
297template<typename F>
298bool Graphics::write_to_buffer(u32 b, u64 offset, u64 n, u64 size, F &&f) {
299 return this->write_to_buffer(
300 b, offset, n, size, &f,
301 [](void *p, auto ...args) { (*static_cast<F*>(p))(args...); });
302}
303
305 u32 vbo, u32 ebo, u64 voff, u64 eoff,
306 u64 vn, u64 vsize, u64 en, u64 esize,
307 void *data, auto &&vgen, auto &&egen
308) {
309 const bool ok = this->write_to_buffer(vbo, voff, vn, vsize, data, vgen)
310 && this->write_to_buffer(ebo, eoff, en, esize, data, egen);
311 if(!ok)
312 return false;
313 this->set_buffer_size(vbo, voff + vn * vsize);
314 this->set_buffer_size(ebo, eoff + en * esize);
315 return true;
316}
317
318template<Graphics::Backend>
319std::unique_ptr<Graphics> graphics_create_backend(const void *params);
320
321}
322
323#endif
static constexpr T mip_levels(T extent)
Definition: math.h:233
precision highp int
Definition: common.h:13
#define NNGN_TEXTURE_EXTENT
Definition: const.h:4
#define NNGN_TEXTURE_SIZE
Definition: const.h:5
function g l
Definition: plot.lua:8
Definition: debug.h:45
std::uint64_t u64
Definition: def.h:15
std::uint8_t u8
Definition: def.h:12
std::uint32_t u32
Definition: def.h:14
std::unique_ptr< Graphics > graphics_create_backend(const void *params)
vec2_base< double > dvec2
Definition: vec2.h:30
vec2_base< std::uint32_t > uvec2
Definition: vec2.h:27
#define F(...)
Definition: pp.cpp:12
m
Definition: input.lua:19
function f()) end
v[1]
Definition: math.lua:19
w
Definition: strict.lua:12
Definition: graphics.h:96
mat4 proj
Definition: graphics.h:96
mat4 view
Definition: graphics.h:96
Wrapper for a small unsigned integral representing flags.
Definition: flags.h:18
Definition: stats.h:10
Definition: graphics.h:178
const char * name
Definition: graphics.h:180
Type type
Definition: graphics.h:181
Type
Definition: graphics.h:179
u64 size
Definition: graphics.h:182
Definition: graphics.h:192
const mat4 * view
Definition: graphics.h:194
const mat4 * proj
Definition: graphics.h:194
const uvec2 * screen
Definition: graphics.h:193
Definition: graphics.h:132
Type
Definition: graphics.h:133
u32 driver_version
Definition: graphics.h:138
std::array< char, 256 > name
Definition: graphics.h:136
Type type
Definition: graphics.h:139
u32 vendor_id
Definition: graphics.h:138
std::array< char, 15 > version
Definition: graphics.h:137
u32 device_id
Definition: graphics.h:138
Definition: graphics.h:121
u32 version
Definition: graphics.h:124
std::array< char, name_max_len > name
Definition: graphics.h:123
static constexpr std::size_t name_max_len
Definition: graphics.h:122
Definition: graphics.h:126
u32 version
Definition: graphics.h:130
std::array< char, 256 > name
Definition: graphics.h:127
std::array< char, 256 > description
Definition: graphics.h:128
std::array< char, 15 > spec_version
Definition: graphics.h:129
Definition: graphics.h:149
u64 size
Definition: graphics.h:151
Flag
Definition: graphics.h:150
@ DEVICE_LOCAL
Definition: graphics.h:150
Flag flags
Definition: graphics.h:152
Definition: graphics.h:154
Flag
Definition: graphics.h:155
@ HOST_VISIBLE
Definition: graphics.h:156
@ LAZILY_ALLOCATED
Definition: graphics.h:158
@ HOST_CACHED
Definition: graphics.h:157
@ DEVICE_LOCAL
Definition: graphics.h:156
@ HOST_COHERENT
Definition: graphics.h:157
Flag flags
Definition: graphics.h:160
Definition: graphics.h:116
int maj
Definition: graphics.h:116
int min
Definition: graphics.h:116
Definition: graphics.h:109
Flags< Flag > flags
Definition: graphics.h:113
Flag
Definition: graphics.h:110
@ HIDDEN
Definition: graphics.h:111
@ DEBUG
Definition: graphics.h:111
Definition: graphics.h:166
Type
Definition: graphics.h:171
Flag
Definition: graphics.h:167
@ CULL_BACK_FACES
Definition: graphics.h:169
@ DEPTH_TEST
Definition: graphics.h:168
Type type
Definition: graphics.h:175
const char * name
Definition: graphics.h:174
Flag flags
Definition: graphics.h:176
Definition: graphics.h:141
Flag flags
Definition: graphics.h:147
Flag
Definition: graphics.h:142
@ GRAPHICS
Definition: graphics.h:143
@ COMPUTE
Definition: graphics.h:143
@ TRANSFER
Definition: graphics.h:143
@ PRESENT
Definition: graphics.h:144
u32 count
Definition: graphics.h:146
Definition: graphics.h:185
std::span< const std::pair< u32, u32 > > buffers
Definition: graphics.h:187
u32 pipeline
Definition: graphics.h:186
Definition: graphics.h:184
std::span< const Stage > normal
Definition: graphics.h:189
std::span< const Stage > overlay
Definition: graphics.h:189
Definition: graphics.h:162
u32 max_images
Definition: graphics.h:163
uvec2 min_extent
Definition: graphics.h:164
uvec2 cur_extent
Definition: graphics.h:164
u32 min_images
Definition: graphics.h:163
uvec2 max_extent
Definition: graphics.h:164
Definition: graphics.h:115
u32 minor
Definition: graphics.h:115
const char * name
Definition: graphics.h:115
u32 major
Definition: graphics.h:115
u32 patch
Definition: graphics.h:115
Definition: graphics.h:117
Version version
Definition: graphics.h:118
LogLevel log_level
Definition: graphics.h:119
Definition: graphics.h:99
Backend
Definition: graphics.h:104
virtual std::size_t n_memory_types(std::size_t i, std::size_t ih) const =0
static constexpr u32 TEXTURE_SIZE
Definition: graphics.h:199
virtual int swap_interval() const =0
virtual std::size_t n_present_modes() const =0
void(*)(void *, int, int, int, int) key_callback_f
Definition: graphics.h:101
virtual bool init_instance()=0
static constexpr u32 TEXTURE_EXTENT_LOG2
Definition: graphics.h:198
virtual bool init_device()=0
virtual void set_cursor_mode(CursorMode m)=0
virtual GraphicsStats stats()=0
virtual bool resize_textures(std::uint32_t s)=0
void(*)(void *, dvec2) mouse_move_callback_f
Definition: graphics.h:103
virtual u32 create_buffer(const BufferConfiguration &conf)=0
virtual bool init_device(std::size_t i)=0
CursorMode
Definition: graphics.h:191
static std::string flags_str(QueueFamily::Flag f)
Definition: graphics.cpp:49
virtual void set_mouse_move_callback(void *data, mouse_move_callback_f f)=0
virtual void set_mouse_button_callback(void *data, mouse_button_callback_f f)=0
virtual bool init()
Fully initialize the back end.
Definition: graphics.h:291
static std::unique_ptr< Graphics > create(Backend b, const void *params)
Definition: graphics.cpp:7
virtual u32 create_pipeline(const PipelineConfiguration &conf)=0
virtual std::size_t n_device_extensions(std::size_t i) const =0
virtual ivec2 mouse_pos(void) const =0
LogLevel
Definition: graphics.h:107
void(*)(void *, uvec2) size_callback_f
Definition: graphics.h:100
virtual uvec2 window_size() const =0
virtual void present_modes(PresentMode *p) const =0
virtual bool set_render_list(const RenderList &l)=0
virtual void set_key_callback(void *data, key_callback_f f)=0
void(*)(void *, int, int, int) mouse_button_callback_f
Definition: graphics.h:102
virtual void set_camera(const Camera &c)=0
virtual void device_infos(DeviceInfo *p) const =0
virtual void set_window_title(const char *t)=0
virtual void heaps(std::size_t i, MemoryHeap *p) const =0
virtual bool set_buffer_size(u32 b, std::uint64_t size)=0
virtual void memory_types(std::size_t i, std::size_t ih, MemoryType *p) const =0
virtual bool load_textures(std::uint32_t i, std::uint32_t n, const std::byte *v)=0
virtual void queue_families(std::size_t i, QueueFamily *p) const =0
virtual void poll_events() const =0
virtual void layers(Layer *p) const =0
virtual bool window_closed() const =0
virtual void set_swap_interval(int i)=0
virtual Version version() const =0
virtual void device_extensions(std::size_t i, Extension *p) const =0
static constexpr u32 TEXTURE_EXTENT
Definition: graphics.h:197
virtual bool render()=0
virtual bool vsync()=0
static const char * enum_str(DeviceInfo::Type t)
Definition: graphics.cpp:24
bool update_buffers(u32 vbo, u32 ebo, u64 voff, u64 eoff, u64 vn, u64 vsize, u64 en, u64 esize, void *data, auto &&vgen, auto &&egen)
Definition: graphics.h:304
virtual bool write_to_buffer(u32 b, u64 offset, u64 n, u64 size, void *data, void f(void *, void *, u64, u64))=0
virtual std::size_t n_extensions() const =0
virtual void extensions(Extension *p) const =0
virtual void resize(int w, int h)=0
virtual void set_camera_updated()=0
virtual std::size_t n_heaps(std::size_t i) const =0
virtual void get_keys(size_t n, int32_t *keys) const =0
virtual bool init_backend()=0
virtual SurfaceInfo surface_info() const =0
virtual std::size_t selected_device() const =0
virtual std::size_t n_queue_families(std::size_t i) const =0
virtual bool error()=0
virtual std::size_t n_layers() const =0
PresentMode
Definition: graphics.h:108
virtual std::size_t n_devices() const =0
virtual bool set_n_swap_chain_images(std::size_t n)=0
virtual bool set_n_frames(std::size_t n)=0
virtual bool set_buffer_capacity(u32 b, u64 size)=0
virtual void set_size_callback(void *data, size_callback_f f)=0
static constexpr u32 TEXTURE_MIP_LEVELS
Definition: graphics.h:200
Definition: graphics.h:97
vec3 color
Definition: graphics.h:97
vec3 pos
Definition: graphics.h:97
std::chrono::seconds s
Definition: timing.cpp:6
#define NNGN_VIRTUAL(x)
Definition: utils.h:27