diff --git a/libs/wgpu/include/psemek/wgpu/device.hpp b/libs/wgpu/include/psemek/wgpu/device.hpp index 2eb7f23e..2b4b2d15 100644 --- a/libs/wgpu/include/psemek/wgpu/device.hpp +++ b/libs/wgpu/include/psemek/wgpu/device.hpp @@ -2,6 +2,11 @@ #include #include +#include +#include +#include +#include +#include #include #include @@ -102,7 +107,12 @@ namespace psemek::wgpu using request_callback = std::function; queue get_queue(); + buffer create_buffer(buffer::descriptor const & desc); command_encoder create_command_encoder(command_encoder::descriptor const & desc); + query_set create_query_set(query_set::descriptor const & desc); + sampler create_sampler(sampler::descriptor const & desc); + shader_module create_shader_module(shader_module::descriptor const & desc); + texture create_texture(texture::descriptor const & desc); static void reference(void * ptr); static void release(void * ptr); diff --git a/libs/wgpu/include/psemek/wgpu/query_set.hpp b/libs/wgpu/include/psemek/wgpu/query_set.hpp index 052ac831..0b9a3f69 100644 --- a/libs/wgpu/include/psemek/wgpu/query_set.hpp +++ b/libs/wgpu/include/psemek/wgpu/query_set.hpp @@ -41,7 +41,7 @@ namespace psemek::wgpu : detail::object(ptr) {} - friend struct command_encoder; + friend struct device; }; } diff --git a/libs/wgpu/include/psemek/wgpu/shader_module.hpp b/libs/wgpu/include/psemek/wgpu/shader_module.hpp index dc766950..fb357df1 100644 --- a/libs/wgpu/include/psemek/wgpu/shader_module.hpp +++ b/libs/wgpu/include/psemek/wgpu/shader_module.hpp @@ -63,7 +63,7 @@ namespace psemek::wgpu struct compilation_hint { std::vector chain = {}; - std::string entryPoint; + std::string entry_point; pipeline_layout layout; }; diff --git a/libs/wgpu/source/device.cpp b/libs/wgpu/source/device.cpp index 1a3b41dd..6276be46 100644 --- a/libs/wgpu/source/device.cpp +++ b/libs/wgpu/source/device.cpp @@ -13,6 +13,17 @@ namespace psemek::wgpu return queue(ptr); } + buffer device::create_buffer(buffer::descriptor const & desc) + { + WGPUBufferDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.usage = (WGPUBufferUsageFlags)desc.usage; + descriptor.size = desc.size; + descriptor.mappedAtCreation = desc.mapped_at_creation; + return buffer(wgpuDeviceCreateBuffer((WGPUDevice)get(), &descriptor)); + } + command_encoder device::create_command_encoder(command_encoder::descriptor const & desc) { WGPUCommandEncoderDescriptor descriptor = {}; @@ -21,6 +32,69 @@ namespace psemek::wgpu return command_encoder(wgpuDeviceCreateCommandEncoder((WGPUDevice)get(), &descriptor)); } + query_set device::create_query_set(query_set::descriptor const & desc) + { + WGPUQuerySetDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.type = (WGPUQueryType)desc.type; + descriptor.count = desc.count; + return query_set(wgpuDeviceCreateQuerySet((WGPUDevice)get(), &descriptor)); + } + + sampler device::create_sampler(sampler::descriptor const & desc) + { + WGPUSamplerDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.addressModeU = (WGPUAddressMode)desc.address_mode_u; + descriptor.addressModeV = (WGPUAddressMode)desc.address_mode_v; + descriptor.addressModeW = (WGPUAddressMode)desc.address_mode_w; + descriptor.magFilter = (WGPUFilterMode)desc.mag_filter; + descriptor.minFilter = (WGPUFilterMode)desc.min_filter; + descriptor.mipmapFilter = (WGPUMipmapFilterMode)desc.mipmap_filter; + descriptor.lodMinClamp = desc.lod_clamp.min; + descriptor.lodMaxClamp = desc.lod_clamp.max; + descriptor.compare = (WGPUCompareFunction)desc.compare; + descriptor.maxAnisotropy = desc.maxAnisotropy; + return sampler(wgpuDeviceCreateSampler((WGPUDevice)get(), &descriptor)); + } + + shader_module device::create_shader_module(shader_module::descriptor const & desc) + { + std::vector hints; + for (auto const & hint_in : desc.hints) + { + auto & hint = hints.emplace_back(); + hint.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(hint_in.chain); + hint.entryPoint = hint_in.entry_point.data(); + hint.layout = (WGPUPipelineLayout)hint_in.layout.get(); + } + + WGPUShaderModuleDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.hintCount = hints.size(); + descriptor.hints = hints.data(); + return shader_module(wgpuDeviceCreateShaderModule((WGPUDevice)get(), &descriptor)); + } + + texture device::create_texture(texture::descriptor const & desc) + { + WGPUTextureDescriptor descriptor = {}; + descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain); + descriptor.label = desc.label.data(); + descriptor.usage = (WGPUTextureUsageFlags)desc.usage; + descriptor.dimension = (WGPUTextureDimension)desc.dimension; + descriptor.size = {desc.size[0], desc.size[1], desc.size[2]}; + descriptor.format = (WGPUTextureFormat)desc.format; + descriptor.mipLevelCount = desc.mip_level_count; + descriptor.sampleCount = desc.sample_count; + descriptor.viewFormatCount = desc.view_formats.size(); + descriptor.viewFormats = (WGPUTextureFormat *)desc.view_formats.data(); + return texture(wgpuDeviceCreateTexture((WGPUDevice)get(), &descriptor)); + } + void device::reference(void * ptr) { wgpuDeviceReference((WGPUDevice)ptr);