#include #include 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 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); } }