From 407df9a21d649f6bdabbae5c00ffa236525ac94f Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 1 Jan 2024 16:19:50 +0300 Subject: [PATCH] WebGPU wrapper wip: add render bundle encoder object --- .../include/psemek/wgpu/render_bundle.hpp | 3 + .../psemek/wgpu/render_bundle_encoder.hpp | 56 ++++++++++++ libs/wgpu/objects-todo | 2 +- libs/wgpu/source/render_bundle_encoder.cpp | 85 +++++++++++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 libs/wgpu/include/psemek/wgpu/render_bundle_encoder.hpp create mode 100644 libs/wgpu/source/render_bundle_encoder.cpp diff --git a/libs/wgpu/include/psemek/wgpu/render_bundle.hpp b/libs/wgpu/include/psemek/wgpu/render_bundle.hpp index 08ba35ea..2a09d3e5 100644 --- a/libs/wgpu/include/psemek/wgpu/render_bundle.hpp +++ b/libs/wgpu/include/psemek/wgpu/render_bundle.hpp @@ -3,6 +3,9 @@ #include #include +#include +#include + namespace psemek::wgpu { diff --git a/libs/wgpu/include/psemek/wgpu/render_bundle_encoder.hpp b/libs/wgpu/include/psemek/wgpu/render_bundle_encoder.hpp new file mode 100644 index 00000000..e5b2d3d5 --- /dev/null +++ b/libs/wgpu/include/psemek/wgpu/render_bundle_encoder.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace psemek::wgpu +{ + + struct render_bundle_encoder + : detail::object + { + using detail::object::object; + + struct descriptor + { + std::vector chain = {}; + std::string label = {}; + std::vector color_formats; + texture::format depth_stencil_format; + std::uint32_t sample_count = 1; + bool depthReadOnly = false; + bool stencilReadOnly = true; + }; + + void set_pipeline(render_pipeline const & pipeline); + void set_bind_group(std::uint32_t group_index, bind_group const & group, std::vector const & dynamic_offsets); + void set_vertex_buffer(std::uint32_t slot, buffer const & buffer, std::uint64_t offset, std::uint64_t size); + void set_index_buffer(buffer const & buffer, index_format format, std::uint64_t offset, std::uint64_t size); + void draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance); + void draw_indexed(std::uint32_t index_count, std::uint32_t instance_count, std::uint32_t first_index, std::uint32_t base_vertex, std::uint32_t first_instance); + void draw_indirect(buffer const & indirect_buffer, std::uint64_t offset); + void draw_indexed_indirect(buffer const & indirect_buffer, std::uint64_t offset); + void insert_debug_marker(std::string const & marker_label); + void push_debug_group(std::string const & group_label); + void pop_debug_group(); + render_bundle finish(render_bundle::descriptor const & desc); + void set_label(std::string const & label); + + static void reference(void * ptr); + static void release(void * ptr); + + private: + explicit render_bundle_encoder(void * ptr) + : detail::object(ptr) + {} + }; + +} diff --git a/libs/wgpu/objects-todo b/libs/wgpu/objects-todo index c60cb642..de66e173 100644 --- a/libs/wgpu/objects-todo +++ b/libs/wgpu/objects-todo @@ -12,7 +12,7 @@ + WGPUQuerySet + WGPUQueue + WGPURenderBundle - WGPURenderBundleEncoder ++ WGPURenderBundleEncoder + WGPURenderPassEncoder + WGPURenderPipeline + WGPUSampler diff --git a/libs/wgpu/source/render_bundle_encoder.cpp b/libs/wgpu/source/render_bundle_encoder.cpp new file mode 100644 index 00000000..b0c2b275 --- /dev/null +++ b/libs/wgpu/source/render_bundle_encoder.cpp @@ -0,0 +1,85 @@ +#include +#include + +namespace psemek::wgpu +{ + + void render_bundle_encoder::set_pipeline(render_pipeline const & pipeline) + { + wgpuRenderBundleEncoderSetPipeline((WGPURenderBundleEncoder)get(), (WGPURenderPipeline)pipeline.get()); + } + + void render_bundle_encoder::set_bind_group(std::uint32_t group_index, bind_group const & group, std::vector const & dynamic_offsets) + { + wgpuRenderBundleEncoderSetBindGroup((WGPURenderBundleEncoder)get(), group_index, (WGPUBindGroup)group.get(), dynamic_offsets.size(), dynamic_offsets.data()); + } + + void render_bundle_encoder::set_vertex_buffer(std::uint32_t slot, buffer const & buffer, std::uint64_t offset, std::uint64_t size) + { + wgpuRenderBundleEncoderSetVertexBuffer((WGPURenderBundleEncoder)get(), slot, (WGPUBuffer)buffer.get(), offset, size); + } + + void render_bundle_encoder::set_index_buffer(buffer const & buffer, index_format format, std::uint64_t offset, std::uint64_t size) + { + wgpuRenderBundleEncoderSetIndexBuffer((WGPURenderBundleEncoder)get(), (WGPUBuffer)buffer.get(), (WGPUIndexFormat)format, offset, size); + } + + void render_bundle_encoder::draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance) + { + wgpuRenderBundleEncoderDraw((WGPURenderBundleEncoder)get(), vertex_count, instance_count, first_vertex, first_instance); + } + + void render_bundle_encoder::draw_indexed(std::uint32_t index_count, std::uint32_t instance_count, std::uint32_t first_index, std::uint32_t base_vertex, std::uint32_t first_instance) + { + wgpuRenderBundleEncoderDrawIndexed((WGPURenderBundleEncoder)get(), index_count, instance_count, first_index, base_vertex, first_instance); + } + + void render_bundle_encoder::draw_indirect(buffer const & indirect_buffer, std::uint64_t offset) + { + wgpuRenderBundleEncoderDrawIndirect((WGPURenderBundleEncoder)get(), (WGPUBuffer)indirect_buffer.get(), offset); + } + + void render_bundle_encoder::draw_indexed_indirect(buffer const & indirect_buffer, std::uint64_t offset) + { + wgpuRenderBundleEncoderDrawIndexedIndirect((WGPURenderBundleEncoder)get(), (WGPUBuffer)indirect_buffer.get(), offset); + } + + void render_bundle_encoder::insert_debug_marker(std::string const & marker_label) + { + wgpuRenderBundleEncoderInsertDebugMarker((WGPURenderBundleEncoder)get(), marker_label.data()); + } + + void render_bundle_encoder::push_debug_group(std::string const & group_label) + { + wgpuRenderBundleEncoderPushDebugGroup((WGPURenderBundleEncoder)get(), group_label.data()); + } + + void render_bundle_encoder::pop_debug_group() + { + wgpuRenderBundleEncoderPopDebugGroup((WGPURenderBundleEncoder)get()); + } + + render_bundle render_bundle_encoder::finish(render_bundle::descriptor const & desc) + { + WGPURenderBundleDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + return render_bundle(wgpuRenderBundleEncoderFinish((WGPURenderBundleEncoder)get(), &descriptor)); + } + + void render_bundle_encoder::set_label(std::string const & label) + { + wgpuRenderBundleEncoderSetLabel((WGPURenderBundleEncoder)get(), label.data()); + } + + void render_bundle_encoder::reference(void * ptr) + { + wgpuRenderBundleEncoderReference((WGPURenderBundleEncoder)ptr); + } + + void render_bundle_encoder::release(void * ptr) + { + wgpuRenderBundleEncoderRelease((WGPURenderBundleEncoder)ptr); + } + +}