WebGPU wrapper wip: add push constants support
This commit is contained in:
parent
0a088684d9
commit
082b8e0493
7 changed files with 59 additions and 11 deletions
|
|
@ -17,31 +17,47 @@ namespace psemek::wgpu
|
||||||
virtual void * ptr() = 0;
|
virtual void * ptr() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
struct empty_storage
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <typename ChainedType, typename StorageType>
|
||||||
struct chained_struct_impl
|
struct chained_struct_impl
|
||||||
: chained_struct_base
|
: chained_struct_base
|
||||||
{
|
{
|
||||||
chained_struct_impl(T const & value)
|
chained_struct_impl(ChainedType const & chained, StorageType const & storage)
|
||||||
: value_(value)
|
: chained_(chained)
|
||||||
|
, storage_(std::move(storage))
|
||||||
|
{}
|
||||||
|
|
||||||
|
chained_struct_impl(ChainedType const & chained, StorageType && storage)
|
||||||
|
: chained_(chained)
|
||||||
|
, storage_(std::move(storage))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void * ptr() override
|
void * ptr() override
|
||||||
{
|
{
|
||||||
return &value_;
|
return &chained_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T value_;
|
ChainedType chained_;
|
||||||
|
StorageType storage_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void * fill_chain(std::vector<chained_struct> const & chain);
|
void * fill_chain(std::vector<chained_struct> const & chain);
|
||||||
|
|
||||||
using chained_struct_ptr = std::shared_ptr<chained_struct_base>;
|
using chained_struct_ptr = std::shared_ptr<chained_struct_base>;
|
||||||
|
|
||||||
template <typename T>
|
template <typename ChainedType>
|
||||||
chained_struct_ptr make_chained_struct(T const & value)
|
chained_struct_ptr make_chained_struct(ChainedType const & chained)
|
||||||
{
|
{
|
||||||
return std::make_shared<chained_struct_impl<T>>(value);
|
return std::make_shared<chained_struct_impl<ChainedType, empty_storage>>(chained, empty_storage{});
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename ChainedType, typename StorageType>
|
||||||
|
chained_struct_ptr make_chained_struct(ChainedType const & chained, StorageType && storage)
|
||||||
|
{
|
||||||
|
return std::make_shared<chained_struct_impl<ChainedType, std::remove_cvref_t<StorageType>>>(chained, std::forward<StorageType>(storage));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,13 @@
|
||||||
namespace psemek::wgpu
|
namespace psemek::wgpu
|
||||||
{
|
{
|
||||||
|
|
||||||
|
struct push_constant_range
|
||||||
|
{
|
||||||
|
shader_stage stages;
|
||||||
|
std::uint32_t start;
|
||||||
|
std::uint32_t end;
|
||||||
|
};
|
||||||
|
|
||||||
struct pipeline_layout
|
struct pipeline_layout
|
||||||
: detail::object<pipeline_layout>
|
: detail::object<pipeline_layout>
|
||||||
{
|
{
|
||||||
|
|
@ -22,6 +29,11 @@ namespace psemek::wgpu
|
||||||
std::vector<bind_group_layout> layouts;
|
std::vector<bind_group_layout> layouts;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct extras
|
||||||
|
{
|
||||||
|
std::vector<push_constant_range> ranges;
|
||||||
|
};
|
||||||
|
|
||||||
void set_label(std::string const & label);
|
void set_label(std::string const & label);
|
||||||
|
|
||||||
static void reference(void * ptr);
|
static void reference(void * ptr);
|
||||||
|
|
@ -35,4 +47,6 @@ namespace psemek::wgpu
|
||||||
friend struct device;
|
friend struct device;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
detail::chained_struct_ptr to_chained_struct(pipeline_layout::extras && value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,7 @@ namespace psemek::wgpu
|
||||||
void set_scissor_rect(geom::box<std::uint32_t, 2> const & rect);
|
void set_scissor_rect(geom::box<std::uint32_t, 2> const & rect);
|
||||||
void set_blend_constant(geom::vector<double, 4> const & color);
|
void set_blend_constant(geom::vector<double, 4> const & color);
|
||||||
void set_stencil_reference(std::uint32_t reference);
|
void set_stencil_reference(std::uint32_t reference);
|
||||||
|
void set_push_constants(shader_stage stages, std::uint32_t offset, util::span<char const> data);
|
||||||
void draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance);
|
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_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_indirect(buffer const & indirect_buffer, std::uint64_t offset);
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,6 @@ namespace psemek::wgpu
|
||||||
|
|
||||||
detail::chained_struct_ptr to_chained_struct(shader_module::spirv_descriptor const & value);
|
detail::chained_struct_ptr to_chained_struct(shader_module::spirv_descriptor const & value);
|
||||||
detail::chained_struct_ptr to_chained_struct(shader_module::wgsl_descriptor const & value);
|
detail::chained_struct_ptr to_chained_struct(shader_module::wgsl_descriptor const & value);
|
||||||
detail::chained_struct_ptr to_chained_struct(shader_module::glsl_descriptor const & value);
|
detail::chained_struct_ptr to_chained_struct(shader_module::glsl_descriptor && value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <psemek/wgpu/pipeline_layout.hpp>
|
#include <psemek/wgpu/pipeline_layout.hpp>
|
||||||
#include <psemek/wgpu/external/webgpu.h>
|
#include <psemek/wgpu/external/webgpu.h>
|
||||||
|
#include <psemek/wgpu/external/wgpu.h>
|
||||||
|
|
||||||
namespace psemek::wgpu
|
namespace psemek::wgpu
|
||||||
{
|
{
|
||||||
|
|
@ -19,4 +20,14 @@ namespace psemek::wgpu
|
||||||
wgpuPipelineLayoutRelease((WGPUPipelineLayout)ptr);
|
wgpuPipelineLayoutRelease((WGPUPipelineLayout)ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detail::chained_struct_ptr to_chained_struct(pipeline_layout::extras && value)
|
||||||
|
{
|
||||||
|
WGPUPipelineLayoutExtras chained = {};
|
||||||
|
chained.chain.sType = (WGPUSType)WGPUSType_PipelineLayoutExtras;
|
||||||
|
static_assert(sizeof(WGPUPushConstantRange) == sizeof(push_constant_range));
|
||||||
|
chained.pushConstantRangeCount = value.ranges.size();
|
||||||
|
chained.pushConstantRanges = (WGPUPushConstantRange *)value.ranges.data();
|
||||||
|
return detail::make_chained_struct(chained, std::move(value));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <psemek/wgpu/render_pass_encoder.hpp>
|
#include <psemek/wgpu/render_pass_encoder.hpp>
|
||||||
#include <psemek/wgpu/external/webgpu.h>
|
#include <psemek/wgpu/external/webgpu.h>
|
||||||
|
#include <psemek/wgpu/external/wgpu.h>
|
||||||
|
|
||||||
namespace psemek::wgpu
|
namespace psemek::wgpu
|
||||||
{
|
{
|
||||||
|
|
@ -45,6 +46,11 @@ namespace psemek::wgpu
|
||||||
wgpuRenderPassEncoderSetStencilReference((WGPURenderPassEncoder)get(), reference);
|
wgpuRenderPassEncoderSetStencilReference((WGPURenderPassEncoder)get(), reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void render_pass_encoder::set_push_constants(shader_stage stages, std::uint32_t offset, util::span<char const> data)
|
||||||
|
{
|
||||||
|
wgpuRenderPassEncoderSetPushConstants((WGPURenderPassEncoder)get(), (WGPUShaderStageFlags)stages, offset, data.size(), (void *)data.data());
|
||||||
|
}
|
||||||
|
|
||||||
void render_pass_encoder::draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance)
|
void render_pass_encoder::draw(std::uint32_t vertex_count, std::uint32_t instance_count, std::uint32_t first_vertex, std::uint32_t first_instance)
|
||||||
{
|
{
|
||||||
wgpuRenderPassEncoderDraw((WGPURenderPassEncoder)get(), vertex_count, instance_count, first_vertex, first_instance);
|
wgpuRenderPassEncoderDraw((WGPURenderPassEncoder)get(), vertex_count, instance_count, first_vertex, first_instance);
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ namespace psemek::wgpu
|
||||||
return detail::make_chained_struct(chained);
|
return detail::make_chained_struct(chained);
|
||||||
}
|
}
|
||||||
|
|
||||||
detail::chained_struct_ptr to_chained_struct(shader_module::glsl_descriptor const & value)
|
detail::chained_struct_ptr to_chained_struct(shader_module::glsl_descriptor && value)
|
||||||
{
|
{
|
||||||
WGPUShaderModuleGLSLDescriptor chained = {};
|
WGPUShaderModuleGLSLDescriptor chained = {};
|
||||||
chained.chain.sType = (WGPUSType)WGPUSType_ShaderModuleGLSLDescriptor;
|
chained.chain.sType = (WGPUSType)WGPUSType_ShaderModuleGLSLDescriptor;
|
||||||
|
|
@ -83,7 +83,7 @@ namespace psemek::wgpu
|
||||||
chained.defineCount = value.defines.size();
|
chained.defineCount = value.defines.size();
|
||||||
static_assert(sizeof(WGPUShaderDefine) == sizeof(shader_module::define));
|
static_assert(sizeof(WGPUShaderDefine) == sizeof(shader_module::define));
|
||||||
chained.defines = (WGPUShaderDefine *)value.defines.data();
|
chained.defines = (WGPUShaderDefine *)value.defines.data();
|
||||||
return detail::make_chained_struct(chained);
|
return detail::make_chained_struct(chained, std::move(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue