nicegraf
nicegraf-wrappers.h
1
22#pragma once
23
24#include "nicegraf-util.h"
25#include "nicegraf.h"
26
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <utility>
31
39namespace ngf {
40
49#define NGF_RETURN_IF_ERROR(expr) \
50 { \
51 const ngf_error tmp = (expr); \
52 if (tmp != NGF_ERROR_OK) return tmp; \
53 }
54
60template<class T, class ObjectManagementFuncs> class ngf_handle {
61 public:
63 explicit ngf_handle(T raw) : handle_(raw) {
64 }
65
67 ngf_handle() : handle_(nullptr) {
68 }
69
70 ngf_handle(const ngf_handle&) = delete;
71 ngf_handle(ngf_handle&& other) : handle_(nullptr) {
72 *this = std::move(other);
73 }
74
77 destroy_if_necessary();
78 }
79
80 ngf_handle& operator=(const ngf_handle&) = delete;
81
83 ngf_handle& operator=(ngf_handle&& other) noexcept {
84 destroy_if_necessary();
85 handle_ = other.handle_;
86 other.handle_ = nullptr;
87 return *this;
88 }
89
90 typedef typename ObjectManagementFuncs::InitType init_type;
91
93 ngf_error initialize(const typename ObjectManagementFuncs::InitType& info) {
94 destroy_if_necessary();
95 const ngf_error err = ObjectManagementFuncs::create(&info, &handle_);
96 if (err != NGF_ERROR_OK) handle_ = nullptr;
97 return err;
98 }
99
101 T get() {
102 return handle_;
103 }
104
106 const T get() const {
107 return handle_;
108 }
109
116 T tmp = handle_;
117 handle_ = nullptr;
118 return tmp;
119 }
120
122 operator T() {
123 return handle_;
124 }
125
127 operator const T() const {
128 return handle_;
129 }
130
134 void reset(T new_handle) {
135 destroy_if_necessary();
136 handle_ = new_handle;
137 }
138
139 private:
140 void destroy_if_necessary() {
141 if (handle_) {
142 ObjectManagementFuncs::destroy(handle_);
143 handle_ = nullptr;
144 }
145 }
146
147 T handle_;
148};
149
150#define NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(name) \
151 struct ngf_##name##_ManagementFuncs { \
152 using InitType = ngf_##name##_info; \
153 static ngf_error create(const InitType* info, ngf_##name* r) { \
154 return ngf_create_##name(info, r); \
155 } \
156 static void destroy(ngf_##name handle) { ngf_destroy_##name(handle); } \
157 };
158
159#define NGF_DEFINE_WRAPPER_TYPE(name) \
160 using name = ngf_handle<ngf_##name, ngf_##name##_ManagementFuncs>;
161
162NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(shader_stage);
163NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(graphics_pipeline);
164NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(compute_pipeline);
165NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(image);
166NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(sampler);
167NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(render_target);
168NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(buffer);
169NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(texel_buffer_view);
170NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(context);
171NGF_DEFINE_WRAPPER_MANAGEMENT_FUNCS(cmd_buffer);
172
178NGF_DEFINE_WRAPPER_TYPE(shader_stage);
179
185NGF_DEFINE_WRAPPER_TYPE(graphics_pipeline);
186
192NGF_DEFINE_WRAPPER_TYPE(compute_pipeline);
193
199NGF_DEFINE_WRAPPER_TYPE(image);
200
206NGF_DEFINE_WRAPPER_TYPE(sampler);
207
213NGF_DEFINE_WRAPPER_TYPE(render_target);
214
220NGF_DEFINE_WRAPPER_TYPE(buffer);
221
227NGF_DEFINE_WRAPPER_TYPE(texel_buffer_view);
228
234NGF_DEFINE_WRAPPER_TYPE(context);
235
241NGF_DEFINE_WRAPPER_TYPE(cmd_buffer);
242
249 public:
257 explicit render_encoder(ngf_cmd_buffer cmd_buf, const ngf_render_pass_info& pass_info) {
258 ngf_cmd_begin_render_pass(cmd_buf, &pass_info, &enc_);
259 }
260
281 ngf_cmd_buffer cmd_buf,
283 float clear_color_r,
284 float clear_color_g,
285 float clear_color_b,
286 float clear_color_a,
287 float clear_depth,
288 uint32_t clear_stencil) {
290 cmd_buf,
291 rt,
292 clear_color_r,
293 clear_color_g,
294 clear_color_b,
295 clear_color_a,
296 clear_depth,
297 clear_stencil,
298 &enc_);
299 }
300
305 if (enc_.pvt_data_donotuse.d0) ngf_cmd_end_render_pass(enc_);
306 }
307
308 render_encoder(render_encoder&& other) noexcept {
309 *this = std::move(other);
310 }
311
312 render_encoder& operator=(render_encoder&& other) noexcept {
313 enc_ = other.enc_;
314 other.enc_.pvt_data_donotuse.d0 = 0u;
315 other.enc_.pvt_data_donotuse.d1 = 0u;
316 return *this;
317 }
318
319 render_encoder(const render_encoder&) = delete;
320 render_encoder& operator=(const render_encoder&) = delete;
321
326 return enc_;
327 }
328
329 private:
330 ngf_render_encoder enc_ {};
331};
332
339 public:
345 explicit xfer_encoder(ngf_cmd_buffer cmd_buf, const ngf_xfer_pass_info& pass_info) {
346 ngf_cmd_begin_xfer_pass(cmd_buf, &pass_info, &enc_);
347 }
348
353 if (enc_.pvt_data_donotuse.d0) ngf_cmd_end_xfer_pass(enc_);
354 }
355
356 xfer_encoder(xfer_encoder&& other) noexcept {
357 *this = std::move(other);
358 }
359
360 xfer_encoder& operator=(xfer_encoder&& other) noexcept {
361 enc_ = other.enc_;
362 other.enc_.pvt_data_donotuse.d0 = 0u;
363 other.enc_.pvt_data_donotuse.d1 = 0u;
364 return *this;
365 }
366
367 xfer_encoder(const xfer_encoder&) = delete;
368 xfer_encoder& operator=(const xfer_encoder&) = delete;
369
373 operator ngf_xfer_encoder() {
374 return enc_;
375 }
376
377 private:
378 ngf_xfer_encoder enc_;
379};
380
387 public:
394 explicit compute_encoder(ngf_cmd_buffer cmd_buf, const ngf_compute_pass_info& pass_info) {
395 ngf_cmd_begin_compute_pass(cmd_buf, &pass_info, &enc_);
396 }
397
404 explicit compute_encoder(ngf_cmd_buffer cmd_buf) {
405 ngf_cmd_begin_compute_pass(cmd_buf, nullptr, &enc_);
406 }
407
412 if (enc_.pvt_data_donotuse.d0) ngf_cmd_end_compute_pass(enc_);
413 }
414
415 compute_encoder(compute_encoder&& other) noexcept {
416 *this = std::move(other);
417 }
418
419 compute_encoder& operator=(compute_encoder&& other) noexcept {
420 enc_ = other.enc_;
421 other.enc_.pvt_data_donotuse.d0 = 0u;
422 other.enc_.pvt_data_donotuse.d1 = 0u;
423 return *this;
424 }
425
426 compute_encoder(const compute_encoder&) = delete;
427 compute_encoder& operator=(const compute_encoder&) = delete;
428
433 return enc_;
434 }
435
436 private:
437 ngf_compute_encoder enc_ {};
438};
439
445template<uint32_t S> struct descriptor_set {
449 template<uint32_t B> struct binding {
458 op.target_binding = B;
459 op.target_set = S;
460 op.info.image_sampler.image = image;
461 return op;
462 }
463
472 op.type = NGF_DESCRIPTOR_STORAGE_IMAGE;
473 op.target_binding = B;
474 op.target_set = S;
475 op.info.image_sampler.image = image;
476 return op;
477 }
478
486 static ngf_resource_bind_op storage_buffer(const ngf_buffer buf, size_t offset, size_t range) {
489 op.target_binding = B;
490 op.target_set = S;
491 op.info.buffer.buffer = buf;
492 op.info.buffer.offset = offset;
493 op.info.buffer.range = range;
494 return op;
495 }
496
504 static ngf_resource_bind_op uniform_buffer(const ngf_buffer buf, size_t offset, size_t range) {
507 op.target_binding = B;
508 op.target_set = S;
509 op.info.buffer.buffer = buf;
510 op.info.buffer.offset = offset;
511 op.info.buffer.range = range;
512 return op;
513 }
514
526 op.target_binding = B;
527 op.target_set = S;
528 op.info.texel_buffer_view = buf_view;
529 return op;
530 }
531
540 op.target_binding = B;
541 op.target_set = S;
542 op.info.image_sampler.sampler = sampler;
543 return op;
544 }
545
556 op.target_binding = B;
557 op.target_set = S;
558 op.info.image_sampler.image = image;
559 op.info.image_sampler.sampler = sampler;
560 return op;
561 }
562 };
563};
564
577template<class... Args> void cmd_bind_resources(ngf_render_encoder enc, const Args&&... args) {
578 const ngf_resource_bind_op ops[] = {std::forward<const Args>(args)...};
579 ngf_cmd_bind_resources(enc, ops, sizeof(ops) / sizeof(ngf_resource_bind_op));
580}
581
595template<class... Args> void cmd_bind_resources(ngf_compute_encoder enc, const Args&&... args) {
596 const ngf_resource_bind_op ops[] = {std::forward<const Args>(args)...};
597 ngf_cmd_bind_compute_resources(enc, ops, sizeof(ops) / sizeof(ngf_resource_bind_op));
598}
599
605template<typename T> class uniform_multibuffer {
606 public:
607 uniform_multibuffer() = default;
609 *this = std::move(other);
610 }
612
613 uniform_multibuffer& operator=(uniform_multibuffer&& other) = default;
614 uniform_multibuffer& operator=(const uniform_multibuffer&) = delete;
615
616 ngf_error initialize(const uint32_t frames) {
618 const size_t aligned_size = ngf_util_align_size(sizeof(T), alignment);
620 aligned_size * frames,
621 NGF_BUFFER_STORAGE_HOST_WRITEABLE,
622 NGF_BUFFER_USAGE_UNIFORM_BUFFER}));
623 nframes_ = frames;
624 aligned_per_frame_size_ = aligned_size;
625 return NGF_ERROR_OK;
626 }
627
628 void write(const T& data) {
629 current_offset_ = (frame_)*aligned_per_frame_size_;
630 void* mapped_buf = ngf_buffer_map_range(buf_.get(), current_offset_, aligned_per_frame_size_);
631 memcpy(mapped_buf, (void*)&data, sizeof(T));
632 ngf_buffer_flush_range(buf_.get(), 0, aligned_per_frame_size_);
633 ngf_buffer_unmap(buf_.get());
634 frame_ = (frame_ + 1u) % nframes_;
635 }
636
637 ngf_resource_bind_op bind_op_at_current_offset(
638 uint32_t set,
639 uint32_t binding,
640 size_t additional_offset = 0,
641 size_t range = 0) const {
644 op.target_binding = binding;
645 op.target_set = set;
646 op.info.buffer.buffer = buf_.get();
647 op.info.buffer.offset = current_offset_ + additional_offset;
648 op.info.buffer.range = (range == 0) ? aligned_per_frame_size_ : range;
649 return op;
650 }
651
652 private:
653 buffer buf_;
654 uint32_t frame_ = 0;
655 size_t current_offset_ = 0;
656 size_t aligned_per_frame_size_ = 0;
657 uint32_t nframes_ = 0;
658};
659
660} // namespace ngf
Definition nicegraf-wrappers.h:386
compute_encoder(ngf_cmd_buffer cmd_buf)
Definition nicegraf-wrappers.h:404
~compute_encoder()
Definition nicegraf-wrappers.h:411
compute_encoder(ngf_cmd_buffer cmd_buf, const ngf_compute_pass_info &pass_info)
Definition nicegraf-wrappers.h:394
Definition nicegraf-wrappers.h:60
T release()
Definition nicegraf-wrappers.h:115
ngf_handle(T raw)
Definition nicegraf-wrappers.h:63
~ngf_handle()
Definition nicegraf-wrappers.h:76
void reset(T new_handle)
Definition nicegraf-wrappers.h:134
ngf_handle & operator=(ngf_handle &&other) noexcept
Definition nicegraf-wrappers.h:83
const T get() const
Definition nicegraf-wrappers.h:106
ngf_handle()
Definition nicegraf-wrappers.h:67
ngf_error initialize(const typename ObjectManagementFuncs::InitType &info)
Definition nicegraf-wrappers.h:93
T get()
Definition nicegraf-wrappers.h:101
Definition nicegraf-wrappers.h:248
render_encoder(ngf_cmd_buffer cmd_buf, const ngf_render_pass_info &pass_info)
Definition nicegraf-wrappers.h:257
~render_encoder()
Definition nicegraf-wrappers.h:304
render_encoder(ngf_cmd_buffer cmd_buf, ngf_render_target rt, float clear_color_r, float clear_color_g, float clear_color_b, float clear_color_a, float clear_depth, uint32_t clear_stencil)
Definition nicegraf-wrappers.h:280
Definition nicegraf-wrappers.h:605
Definition nicegraf-wrappers.h:338
~xfer_encoder()
Definition nicegraf-wrappers.h:352
xfer_encoder(ngf_cmd_buffer cmd_buf, const ngf_xfer_pass_info &pass_info)
Definition nicegraf-wrappers.h:345
void cmd_bind_resources(ngf_render_encoder enc, const Args &&... args)
Definition nicegraf-wrappers.h:577
#define NGF_RETURN_IF_ERROR(expr)
Definition nicegraf-wrappers.h:49
ngf_handle< ngf_sampler, ngf_sampler_ManagementFuncs > sampler
Definition nicegraf-wrappers.h:206
ngf_handle< ngf_image, ngf_image_ManagementFuncs > image
Definition nicegraf-wrappers.h:199
void * ngf_buffer_map_range(ngf_buffer buf, size_t offset, size_t size)
void ngf_buffer_unmap(ngf_buffer buf)
ngf_error
Definition nicegraf.h:293
ngf_error ngf_cmd_end_xfer_pass(ngf_xfer_encoder enc)
ngf_error ngf_cmd_end_render_pass(ngf_render_encoder enc)
ngf_error ngf_cmd_begin_compute_pass(ngf_cmd_buffer buf, const ngf_compute_pass_info *pass_info, ngf_compute_encoder *enc)
void ngf_cmd_bind_compute_resources(ngf_compute_encoder enc, const ngf_resource_bind_op *bind_operations, uint32_t nbind_operations)
const ngf_device_capabilities * ngf_get_device_capabilities(void)
ngf_error ngf_cmd_begin_render_pass(ngf_cmd_buffer buf, const ngf_render_pass_info *pass_info, ngf_render_encoder *enc)
ngf_error ngf_cmd_begin_render_pass_simple(ngf_cmd_buffer buf, ngf_render_target rt, float clear_color_r, float clear_color_g, float clear_color_b, float clear_color_a, float clear_depth, uint32_t clear_stencil, ngf_render_encoder *enc)
ngf_error ngf_cmd_begin_xfer_pass(ngf_cmd_buffer buf, const ngf_xfer_pass_info *pass_info, ngf_xfer_encoder *enc)
void ngf_cmd_bind_resources(ngf_render_encoder enc, const ngf_resource_bind_op *bind_operations, uint32_t nbind_operations)
ngf_error ngf_cmd_end_compute_pass(ngf_compute_encoder enc)
void ngf_buffer_flush_range(ngf_buffer buf, size_t offset, size_t size)
@ NGF_ERROR_OK
Definition nicegraf.h:296
@ NGF_DESCRIPTOR_IMAGE_AND_SAMPLER
Definition nicegraf.h:1441
@ NGF_DESCRIPTOR_TEXEL_BUFFER
Definition nicegraf.h:1449
@ NGF_DESCRIPTOR_UNIFORM_BUFFER
Definition nicegraf.h:1420
@ NGF_DESCRIPTOR_IMAGE
Definition nicegraf.h:1427
@ NGF_DESCRIPTOR_STORAGE_BUFFER
Definition nicegraf.h:1456
@ NGF_DESCRIPTOR_SAMPLER
Definition nicegraf.h:1434
Definition nicegraf-wrappers.h:449
static ngf_resource_bind_op texture_and_sampler(const ngf_image image, const ngf_sampler sampler)
Definition nicegraf-wrappers.h:553
static ngf_resource_bind_op texel_buffer(const ngf_texel_buffer_view buf_view)
Definition nicegraf-wrappers.h:523
static ngf_resource_bind_op uniform_buffer(const ngf_buffer buf, size_t offset, size_t range)
Definition nicegraf-wrappers.h:504
static ngf_resource_bind_op storage_image(const ngf_image image)
Definition nicegraf-wrappers.h:470
static ngf_resource_bind_op sampler(const ngf_sampler sampler)
Definition nicegraf-wrappers.h:537
static ngf_resource_bind_op texture(const ngf_image image)
Definition nicegraf-wrappers.h:455
static ngf_resource_bind_op storage_buffer(const ngf_buffer buf, size_t offset, size_t range)
Definition nicegraf-wrappers.h:486
Definition nicegraf-wrappers.h:445
size_t offset
Definition nicegraf.h:2065
size_t range
Definition nicegraf.h:2066
ngf_buffer buffer
Definition nicegraf.h:2064
Definition nicegraf.h:2010
Definition nicegraf.h:1848
Definition nicegraf.h:1907
size_t uniform_buffer_offset_alignment
Definition nicegraf.h:2317
ngf_sampler sampler
Definition nicegraf.h:2077
ngf_image image
Definition nicegraf.h:2076
Definition nicegraf.h:1827
Definition nicegraf.h:1857
Definition nicegraf.h:2095
uint32_t target_binding
Definition nicegraf.h:2097
union ngf_resource_bind_op::@1 info
uint32_t target_set
Definition nicegraf.h:2096
ngf_descriptor_type type
Definition nicegraf.h:2098
Definition nicegraf.h:1838
Definition nicegraf.h:1897