WebGPU wrapper wip: add buffer object
This commit is contained in:
parent
1144d4a46c
commit
2af6a1000a
3 changed files with 164 additions and 1 deletions
91
libs/wgpu/include/psemek/wgpu/buffer.hpp
Normal file
91
libs/wgpu/include/psemek/wgpu/buffer.hpp
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <psemek/wgpu/chained_struct.hpp>
|
||||||
|
#include <psemek/wgpu/detail/object.hpp>
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace psemek::wgpu
|
||||||
|
{
|
||||||
|
|
||||||
|
struct buffer
|
||||||
|
: detail::object<buffer>
|
||||||
|
{
|
||||||
|
using detail::object<buffer>::object;
|
||||||
|
|
||||||
|
enum usage : std::uint32_t
|
||||||
|
{
|
||||||
|
none = 0x00000000,
|
||||||
|
map_read = 0x00000001,
|
||||||
|
map_write = 0x00000002,
|
||||||
|
copy_src = 0x00000004,
|
||||||
|
copy_dst = 0x00000008,
|
||||||
|
index = 0x00000010,
|
||||||
|
vertex = 0x00000020,
|
||||||
|
uniform = 0x00000040,
|
||||||
|
storage = 0x00000080,
|
||||||
|
indirect = 0x00000100,
|
||||||
|
query_resolve = 0x00000200,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class map_mode : std::uint32_t
|
||||||
|
{
|
||||||
|
none = 0x00000000,
|
||||||
|
read = 0x00000001,
|
||||||
|
write = 0x00000002,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class map_state : std::uint32_t
|
||||||
|
{
|
||||||
|
unmapped = 0x00000000,
|
||||||
|
pending = 0x00000001,
|
||||||
|
mapped = 0x00000002,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class map_async_status : std::uint32_t
|
||||||
|
{
|
||||||
|
success = 0x00000000,
|
||||||
|
validation_error = 0x00000001,
|
||||||
|
unknown = 0x00000002,
|
||||||
|
device_lost = 0x00000003,
|
||||||
|
destroyed_before_callback = 0x00000004,
|
||||||
|
unmapped_before_callback = 0x00000005,
|
||||||
|
mapping_already_pending = 0x00000006,
|
||||||
|
offset_out_of_range = 0x00000007,
|
||||||
|
size_out_of_range = 0x00000008,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct descriptor {
|
||||||
|
std::vector<chained_struct> chain = {};
|
||||||
|
std::string label = {};
|
||||||
|
enum usage usage;
|
||||||
|
uint64_t size;
|
||||||
|
bool mapped_at_creation = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
using map_callback = std::function<void(map_async_status)>;
|
||||||
|
|
||||||
|
void destroy();
|
||||||
|
std::uint64_t get_size();
|
||||||
|
usage get_usage();
|
||||||
|
map_state get_map_state();
|
||||||
|
void const * get_const_mapped_range(std::size_t offset, std::size_t size);
|
||||||
|
void * get_mapped_range(std::size_t offset, std::size_t size);
|
||||||
|
void map_async(map_mode flags, std::size_t offset, std::size_t size, map_callback const & callback);
|
||||||
|
void unmap();
|
||||||
|
void set_label(std::string const & label);
|
||||||
|
|
||||||
|
static void reference(void * ptr);
|
||||||
|
static void release(void * ptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
explicit buffer(void * ptr)
|
||||||
|
: detail::object<buffer>(ptr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
friend struct device;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
+ WGPUAdapter
|
+ WGPUAdapter
|
||||||
WGPUBindGroup
|
WGPUBindGroup
|
||||||
WGPUBindGroupLayout
|
WGPUBindGroupLayout
|
||||||
WGPUBuffer
|
+ WGPUBuffer
|
||||||
WGPUCommandBuffer
|
WGPUCommandBuffer
|
||||||
WGPUCommandEncoder
|
WGPUCommandEncoder
|
||||||
WGPUComputePassEncoder
|
WGPUComputePassEncoder
|
||||||
|
|
|
||||||
72
libs/wgpu/source/buffer.cpp
Normal file
72
libs/wgpu/source/buffer.cpp
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
#include <psemek/wgpu/buffer.hpp>
|
||||||
|
#include <psemek/wgpu/external/webgpu.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace psemek::wgpu
|
||||||
|
{
|
||||||
|
|
||||||
|
void buffer::destroy()
|
||||||
|
{
|
||||||
|
wgpuBufferDestroy((WGPUBuffer)get());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uint64_t buffer::get_size()
|
||||||
|
{
|
||||||
|
return wgpuBufferGetSize((WGPUBuffer)get());
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer::usage buffer::get_usage()
|
||||||
|
{
|
||||||
|
return (usage)wgpuBufferGetUsage((WGPUBuffer)get());
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer::map_state buffer::get_map_state()
|
||||||
|
{
|
||||||
|
return (map_state)wgpuBufferGetMapState((WGPUBuffer)get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void const * buffer::get_const_mapped_range(std::size_t offset, std::size_t size)
|
||||||
|
{
|
||||||
|
return wgpuBufferGetConstMappedRange((WGPUBuffer)get(), offset, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void * buffer::get_mapped_range(std::size_t offset, std::size_t size)
|
||||||
|
{
|
||||||
|
return wgpuBufferGetMappedRange((WGPUBuffer)get(), offset, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer::map_async(map_mode flags, std::size_t offset, std::size_t size, map_callback const & callback)
|
||||||
|
{
|
||||||
|
auto userdata = new map_callback(callback);
|
||||||
|
|
||||||
|
auto real_callback = [](WGPUBufferMapAsyncStatus status, void * userdata)
|
||||||
|
{
|
||||||
|
std::unique_ptr<map_callback> callback((map_callback *)userdata);
|
||||||
|
if (*callback) (*callback)((map_async_status)status);
|
||||||
|
};
|
||||||
|
|
||||||
|
wgpuBufferMapAsync((WGPUBuffer)get(), (WGPUMapModeFlags)flags, offset, size, real_callback, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer::unmap()
|
||||||
|
{
|
||||||
|
wgpuBufferUnmap((WGPUBuffer)get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer::set_label(std::string const & label)
|
||||||
|
{
|
||||||
|
wgpuBufferSetLabel((WGPUBuffer)get(), label.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer::reference(void * ptr)
|
||||||
|
{
|
||||||
|
wgpuBufferReference((WGPUBuffer)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer::release(void * ptr)
|
||||||
|
{
|
||||||
|
wgpuBufferRelease((WGPUBuffer)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue