psemek/libs/wgpu/source/device.cpp

108 lines
4 KiB
C++

#include <psemek/wgpu/device.hpp>
#include <psemek/wgpu/external/webgpu.h>
namespace psemek::wgpu
{
queue device::get_queue()
{
auto ptr = wgpuDeviceGetQueue((WGPUDevice)get());
// Queue is actually owned by the device
// Reference it to prevent destroying
wgpuQueueReference(ptr);
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 = {};
descriptor.nextInChain = (WGPUChainedStruct const *)detail::fill_chain(desc.chain);
descriptor.label = desc.label.data();
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<WGPUShaderModuleCompilationHint> 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);
}
void device::release(void * ptr)
{
wgpuDeviceRelease((WGPUDevice)ptr);
}
}