From 818db07676707697c452956bee1ac0ca579677f3 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 1 Jan 2024 15:03:44 +0300 Subject: [PATCH] WebGPU wrapper wip: add compute pass encoder object --- .../psemek/wgpu/compute_pass_encoder.hpp | 57 +++++++++++++++++ .../psemek/wgpu/render_pass_encoder.hpp | 3 +- libs/wgpu/objects-todo | 2 +- libs/wgpu/source/compute_pass_encoder.cpp | 62 +++++++++++++++++++ 4 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 libs/wgpu/include/psemek/wgpu/compute_pass_encoder.hpp create mode 100644 libs/wgpu/source/compute_pass_encoder.cpp diff --git a/libs/wgpu/include/psemek/wgpu/compute_pass_encoder.hpp b/libs/wgpu/include/psemek/wgpu/compute_pass_encoder.hpp new file mode 100644 index 00000000..6ed04b8d --- /dev/null +++ b/libs/wgpu/include/psemek/wgpu/compute_pass_encoder.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace psemek::wgpu +{ + + struct compute_pass_encoder + : detail::object + { + using detail::object::object; + + struct timestamp_writes + { + struct query_set query_set; + uint32_t begin_index; + uint32_t end_index; + }; + + struct descriptor + { + std::vector chain = {}; + std::string label = {}; + std::optional timestamp_writes = {}; + }; + + void set_bind_group(std::uint32_t group_index, bind_group group, std::vector dynamic_offsets); + void set_pipeline(compute_pipeline pipeline); + void dispatch_workgroups(geom::vector const & workgroup_count); + void dispatch_workgroups_indirect(buffer 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(); + void end(); + void set_label(std::string const & label); + + static void reference(void * ptr); + static void release(void * ptr); + + private: + explicit compute_pass_encoder(void * ptr) + : detail::object(ptr) + {} + + friend struct command_encoder; + }; + +} diff --git a/libs/wgpu/include/psemek/wgpu/render_pass_encoder.hpp b/libs/wgpu/include/psemek/wgpu/render_pass_encoder.hpp index 527353bd..3e09272f 100644 --- a/libs/wgpu/include/psemek/wgpu/render_pass_encoder.hpp +++ b/libs/wgpu/include/psemek/wgpu/render_pass_encoder.hpp @@ -55,7 +55,8 @@ namespace psemek::wgpu bool stencil_read_only; }; - struct timestamp_writes { + struct timestamp_writes + { struct query_set query_set; std::uint32_t begin_index; std::uint32_t end_index; diff --git a/libs/wgpu/objects-todo b/libs/wgpu/objects-todo index 216c54df..dc3a08fe 100644 --- a/libs/wgpu/objects-todo +++ b/libs/wgpu/objects-todo @@ -4,7 +4,7 @@ + WGPUBuffer + WGPUCommandBuffer - WGPUCommandEncoder - WGPUComputePassEncoder ++ WGPUComputePassEncoder + WGPUComputePipeline - WGPUDevice + WGPUInstance diff --git a/libs/wgpu/source/compute_pass_encoder.cpp b/libs/wgpu/source/compute_pass_encoder.cpp new file mode 100644 index 00000000..3252a8c0 --- /dev/null +++ b/libs/wgpu/source/compute_pass_encoder.cpp @@ -0,0 +1,62 @@ +#include +#include + +namespace psemek::wgpu +{ + + void compute_pass_encoder::set_bind_group(std::uint32_t group_index, bind_group group, std::vector dynamic_offsets) + { + wgpuComputePassEncoderSetBindGroup((WGPUComputePassEncoder)get(), group_index, (WGPUBindGroup)group.get(), dynamic_offsets.size(), dynamic_offsets.data()); + } + + void compute_pass_encoder::set_pipeline(compute_pipeline pipeline) + { + wgpuComputePassEncoderSetPipeline((WGPUComputePassEncoder)get(), (WGPUComputePipeline)pipeline.get()); + } + + void compute_pass_encoder::dispatch_workgroups(geom::vector const & workgroup_count) + { + wgpuComputePassEncoderDispatchWorkgroups((WGPUComputePassEncoder)get(), workgroup_count[0], workgroup_count[1], workgroup_count[2]); + } + + void compute_pass_encoder::dispatch_workgroups_indirect(buffer indirect_buffer, std::uint64_t offset) + { + wgpuComputePassEncoderDispatchWorkgroupsIndirect((WGPUComputePassEncoder)get(), (WGPUBuffer)indirect_buffer.get(), offset); + } + + void compute_pass_encoder::insert_debug_marker(std::string const & marker_label) + { + wgpuComputePassEncoderInsertDebugMarker((WGPUComputePassEncoder)get(), marker_label.data()); + } + + void compute_pass_encoder::push_debug_group(std::string const & group_label) + { + wgpuComputePassEncoderPushDebugGroup((WGPUComputePassEncoder)get(), group_label.data()); + } + + void compute_pass_encoder::pop_debug_group() + { + wgpuComputePassEncoderPopDebugGroup((WGPUComputePassEncoder)get()); + } + + void compute_pass_encoder::end() + { + wgpuComputePassEncoderEnd((WGPUComputePassEncoder)get()); + } + + void compute_pass_encoder::set_label(std::string const & label) + { + wgpuComputePassEncoderSetLabel((WGPUComputePassEncoder)get(), label.data()); + } + + void compute_pass_encoder::reference(void * ptr) + { + wgpuComputePassEncoderReference((WGPUComputePassEncoder)ptr); + } + + void compute_pass_encoder::release(void * ptr) + { + wgpuComputePassEncoderRelease((WGPUComputePassEncoder)ptr); + } + +}