From c0b485ae4bf18b8e34a8378ae461c404caa52159 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 1 Jan 2024 14:47:57 +0300 Subject: [PATCH] WebGPU wrapper wip: add pipeline layout object --- libs/wgpu/include/psemek/wgpu/device.hpp | 2 ++ libs/wgpu/include/psemek/wgpu/pipeline_layout.hpp | 14 ++++++++++++++ libs/wgpu/objects-todo | 2 +- libs/wgpu/source/device.cpp | 11 +++++++++++ libs/wgpu/source/pipeline_layout.cpp | 5 +++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/libs/wgpu/include/psemek/wgpu/device.hpp b/libs/wgpu/include/psemek/wgpu/device.hpp index 52b460f3..a294f7af 100644 --- a/libs/wgpu/include/psemek/wgpu/device.hpp +++ b/libs/wgpu/include/psemek/wgpu/device.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -116,6 +117,7 @@ namespace psemek::wgpu buffer create_buffer(buffer::descriptor const & desc); command_encoder create_command_encoder(command_encoder::descriptor const & desc); compute_pipeline create_compute_pipeline(compute_pipeline::descriptor const & desc); + pipeline_layout create_pipeline_layout(pipeline_layout::descriptor const & desc); query_set create_query_set(query_set::descriptor const & desc); render_pipeline create_render_pipeline(render_pipeline::descriptor const & desc); sampler create_sampler(sampler::descriptor const & desc); diff --git a/libs/wgpu/include/psemek/wgpu/pipeline_layout.hpp b/libs/wgpu/include/psemek/wgpu/pipeline_layout.hpp index 7f311b3a..3ccafb9e 100644 --- a/libs/wgpu/include/psemek/wgpu/pipeline_layout.hpp +++ b/libs/wgpu/include/psemek/wgpu/pipeline_layout.hpp @@ -1,6 +1,11 @@ #pragma once #include +#include +#include + +#include +#include namespace psemek::wgpu { @@ -10,6 +15,15 @@ namespace psemek::wgpu { using detail::object::object; + struct descriptor + { + std::vector chain = {}; + std::string label = {}; + std::vector layouts; + }; + + void set_label(std::string const & label); + static void reference(void * ptr); static void release(void * ptr); diff --git a/libs/wgpu/objects-todo b/libs/wgpu/objects-todo index 419cc38f..216c54df 100644 --- a/libs/wgpu/objects-todo +++ b/libs/wgpu/objects-todo @@ -8,7 +8,7 @@ + WGPUComputePipeline - WGPUDevice + WGPUInstance -- WGPUPipelineLayout ++ WGPUPipelineLayout + WGPUQuerySet + WGPUQueue WGPURenderBundle diff --git a/libs/wgpu/source/device.cpp b/libs/wgpu/source/device.cpp index 1d28f4c1..aa9ea6b3 100644 --- a/libs/wgpu/source/device.cpp +++ b/libs/wgpu/source/device.cpp @@ -115,6 +115,17 @@ namespace psemek::wgpu return compute_pipeline(wgpuDeviceCreateComputePipeline((WGPUDevice)get(), &descriptor)); } + pipeline_layout device::create_pipeline_layout(pipeline_layout::descriptor const & desc) + { + WGPUPipelineLayoutDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.bindGroupLayoutCount = desc.layouts.size(); + static_assert(sizeof(WGPUBindGroupLayout) == sizeof(bind_group_layout)); + descriptor.bindGroupLayouts = (WGPUBindGroupLayout const *)desc.layouts.data(); + return pipeline_layout(wgpuDeviceCreatePipelineLayout((WGPUDevice)get(), &descriptor)); + } + query_set device::create_query_set(query_set::descriptor const & desc) { WGPUQuerySetDescriptor descriptor = {}; diff --git a/libs/wgpu/source/pipeline_layout.cpp b/libs/wgpu/source/pipeline_layout.cpp index e0014927..67b6d153 100644 --- a/libs/wgpu/source/pipeline_layout.cpp +++ b/libs/wgpu/source/pipeline_layout.cpp @@ -4,6 +4,11 @@ namespace psemek::wgpu { + void pipeline_layout::set_label(std::string const & label) + { + wgpuPipelineLayoutSetLabel((WGPUPipelineLayout)get(), label.data()); + } + void pipeline_layout::reference(void * ptr) { wgpuPipelineLayoutReference((WGPUPipelineLayout)ptr);