zgpu

git clone git://git.electrosoup.com/zgpu
Log | Files | Refs | Submodules | README

device.zig (7475B)


      1 const std = @import("std");
      2 
      3 const c = @import("c.zig").c;
      4 const BindGroup = @import("bind_group.zig").BindGroup;
      5 const BindGroupLayout = @import("bind_group_layout.zig").BindGroupLayout;
      6 const Buffer = @import("buffer.zig").Buffer;
      7 const CallbackMode = @import("common.zig").CallbackMode;
      8 const ChainedStruct = @import("common.zig").ChainedStruct;
      9 const CommandEncoder = @import("command_encoder.zig").CommandEncoder;
     10 const PipelineLayout = @import("pipeline_layout.zig").PipelineLayout;
     11 const Queue = @import("queue.zig").Queue;
     12 const RenderPipeline = @import("render_pipeline.zig").RenderPipeline;
     13 const Sampler = @import("sampler.zig").Sampler;
     14 const ShaderModule = @import("shader_module.zig").ShaderModule;
     15 const StringView = @import("common.zig").StringView;
     16 const Texture = @import("texture.zig").Texture;
     17 
     18 pub const FeatureName = enum(u32) {
     19     undefined = 0x00000000,
     20     depth_clip_control = 0x00000001,
     21     depth32_float_stencil8 = 0x00000002,
     22     timestamp_query = 0x00000003,
     23     texture_compression_bc = 0x00000004,
     24     texture_compression_bc_sliced_3d = 0x00000005,
     25     texture_compression_etc2 = 0x00000006,
     26     texture_compression_astc = 0x00000007,
     27     texture_compression_astc_sliced_3d = 0x00000008,
     28     indirect_first_instance = 0x00000009,
     29     shader_f16 = 0x0000000A,
     30     rg11b10_ufloat_renderable = 0x0000000B,
     31     bgra8_unorm_storage = 0x0000000C,
     32     float32_filterable = 0x0000000D,
     33     float32_blendable = 0x0000000E,
     34     clip_distances = 0x0000000F,
     35     dual_source_blending = 0x00000010,
     36 };
     37 
     38 pub const Limits = extern struct {
     39     max_texture_dimension_1d: u32,
     40     max_texture_dimension_2d: u32,
     41     max_texture_dimension_3d: u32,
     42     max_texture_array_layers: u32,
     43     max_bind_groups: u32,
     44     max_bind_groups_plus_vertex_buffers: u32,
     45     max_bindings_per_bind_group: u32,
     46     max_dynamic_uniform_buffers_per_pipeline_layout: u32,
     47     max_dynamic_storage_buffers_per_pipeline_layout: u32,
     48     max_sampled_textures_per_shader_stage: u32,
     49     max_sampler_per_shader_stage: u32,
     50     max_storage_buffers_per_shader_stage: u32,
     51     max_storage_textures_per_shader_stage: u32,
     52     max_uniform_buffers_per_shader_stage: u32,
     53     max_uniform_buffer_binding_size: u64,
     54     max_storage_buffer_binding_size: u64,
     55     min_uniform_buffer_offset_alignment: u32,
     56     min_storage_buffer_offset_alignmnet: u32,
     57     max_vertex_buffers: u32,
     58     max_buffer_size: u64,
     59     max_vertex_attributes: u32,
     60     max_vertex_buffer_array_stride: u32,
     61     max_inter_stage_shader_variables: u32,
     62     max_color_attachments: u32,
     63     max_color_attachment_bytes_per_sample: u32,
     64     max_compute_workgroup_storage_size: u32,
     65     max_compute_invocations_per_workgroup: u32,
     66     max_compute_workgroup_size_x: u32,
     67     max_compute_workgroup_size_y: u32,
     68     max_compute_workgroup_size_z: u32,
     69     max_compute_workgroups_per_dimension: u32,
     70 };
     71 
     72 pub const RequiredLimits = extern struct {
     73     next: ?*const ChainedStruct = null,
     74     limits: Limits,
     75 };
     76 
     77 pub const DeviceLostReason = enum(u32) {
     78     unknown = 0x00000001,
     79     destroyed = 0x00000002,
     80     instance_dropped = 0x00000003,
     81     failed_creation = 0x00000004,
     82 };
     83 
     84 pub const DeviceLostCallback = fn (
     85     device: *const Device,
     86     reason: DeviceLostReason,
     87     message: StringView,
     88     userdata1: ?*anyopaque,
     89     userdata2: ?*anyopaque,
     90 ) callconv(.C) void;
     91 
     92 pub const DeviceLostCallbackInfo = extern struct {
     93     next: ?*const ChainedStruct = null,
     94     mode: CallbackMode,
     95     callback: *const DeviceLostCallback,
     96     userdata1: ?*anyopaque,
     97     userdata2: ?*anyopaque,
     98 };
     99 
    100 pub const ErrorType = enum(u32) {
    101     no_error = 0x00000001,
    102     validation = 0x00000002,
    103     out_of_memory = 0x00000003,
    104     internal = 0x00000004,
    105     unknown = 0x00000005,
    106 };
    107 
    108 pub const UncapturedErrorCallback = fn (
    109     device: *const Device,
    110     @"type": ErrorType,
    111     message: StringView,
    112     userdata1: ?*anyopaque,
    113     userdata2: ?*anyopaque,
    114 ) callconv(.C) void;
    115 
    116 pub const UncapturedErrorCallbackInfo = extern struct {
    117     next: ?*const ChainedStruct = null,
    118     callback: ?*const UncapturedErrorCallback,
    119     userdata1: ?*anyopaque,
    120     userdata2: ?*anyopaque,
    121 };
    122 
    123 pub const Device = opaque {
    124     pub const Descriptor = extern struct {
    125         next: ?*const ChainedStruct = null,
    126         label: StringView,
    127         required_feature_count: usize,
    128         required_features: ?[*]const FeatureName,
    129         required_limits: ?*const RequiredLimits,
    130         default_queue: Queue.Descriptor,
    131         device_lost_callback_info: DeviceLostCallbackInfo,
    132         uncaptured_error_callback_info: UncapturedErrorCallbackInfo,
    133     };
    134 
    135     pub fn release(device: *Device) void {
    136         c.wgpuDeviceRelease(@ptrCast(device));
    137     }
    138 
    139     pub fn getQueue(device: *Device) *Queue {
    140         return @ptrCast(c.wgpuDeviceGetQueue(@ptrCast(device)).?);
    141     }
    142 
    143     pub fn createCommandEncoder(
    144         device: *Device,
    145         descriptor: *const CommandEncoder.Descriptor,
    146     ) ?*CommandEncoder {
    147         return @ptrCast(c.wgpuDeviceCreateCommandEncoder(
    148             @ptrCast(device),
    149             @ptrCast(descriptor),
    150         ));
    151     }
    152 
    153     pub fn createRenderPipeline(
    154         device: *Device,
    155         descriptor: *const RenderPipeline.Descriptor,
    156     ) ?*RenderPipeline {
    157         return @ptrCast(c.wgpuDeviceCreateRenderPipeline(
    158             @ptrCast(device),
    159             @ptrCast(descriptor),
    160         ));
    161     }
    162 
    163     pub fn createPipelineLayout(
    164         device: *Device,
    165         descriptor: *const PipelineLayout.Descriptor,
    166     ) ?*PipelineLayout {
    167         return @ptrCast(c.wgpuDeviceCreatePipelineLayout(
    168             @ptrCast(device),
    169             @ptrCast(descriptor),
    170         ));
    171     }
    172 
    173     pub fn createShaderModule(
    174         device: *Device,
    175         descriptor: *const ShaderModule.Descriptor,
    176     ) ?*ShaderModule {
    177         return @ptrCast(c.wgpuDeviceCreateShaderModule(
    178             @ptrCast(device),
    179             @ptrCast(descriptor),
    180         ));
    181     }
    182 
    183     pub fn createBindGroupLayout(
    184         device: *Device,
    185         descriptor: *const BindGroupLayout.Descriptor,
    186     ) ?*BindGroupLayout {
    187         return @ptrCast(c.wgpuDeviceCreateBindGroupLayout(
    188             @ptrCast(device),
    189             @ptrCast(descriptor),
    190         ));
    191     }
    192 
    193     pub fn createBindGroup(
    194         device: *Device,
    195         descriptor: *const BindGroup.Descriptor,
    196     ) ?*BindGroup {
    197         return @ptrCast(c.wgpuDeviceCreateBindGroup(
    198             @ptrCast(device),
    199             @ptrCast(descriptor),
    200         ));
    201     }
    202 
    203     pub fn createBuffer(
    204         device: *Device,
    205         descriptor: *const Buffer.Descriptor,
    206     ) ?*Buffer {
    207         return @ptrCast(c.wgpuDeviceCreateBuffer(
    208             @ptrCast(device),
    209             @ptrCast(descriptor),
    210         ));
    211     }
    212 
    213     pub fn createSampler(
    214         device: *Device,
    215         descriptor: *const Sampler.Descriptor,
    216     ) ?*Sampler {
    217         return @ptrCast(c.wgpuDeviceCreateSampler(
    218             @ptrCast(device),
    219             @ptrCast(descriptor),
    220         ));
    221     }
    222 
    223     pub fn createTexture(
    224         device: *Device,
    225         descriptor: *const Texture.Descriptor,
    226     ) ?*Texture {
    227         return @ptrCast(c.wgpuDeviceCreateTexture(
    228             @ptrCast(device),
    229             @ptrCast(descriptor),
    230         ));
    231     }
    232 
    233     // createComputePipeline
    234     // createComputePipelineAsync
    235     // createQuerySet
    236     // createRenderBundleEncoder
    237     // createRenderPipelineAsync
    238     // destroy
    239     // enumerateFeatures
    240     // getLimits
    241     // hasFeature
    242     // popErrorScope
    243     // pushErrorScope
    244     // setLabel
    245     // reference
    246 };