wgpu 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-APACHE +190 -0
  3. data/LICENSE-MIT +21 -0
  4. data/README.md +228 -0
  5. data/ext/wgpu/Makefile +7 -0
  6. data/ext/wgpu/extconf.rb +161 -0
  7. data/lib/wgpu/async_task.rb +55 -0
  8. data/lib/wgpu/commands/command_buffer.rb +17 -0
  9. data/lib/wgpu/commands/command_encoder.rb +201 -0
  10. data/lib/wgpu/commands/compute_pass.rb +89 -0
  11. data/lib/wgpu/commands/render_bundle.rb +18 -0
  12. data/lib/wgpu/commands/render_bundle_encoder.rb +148 -0
  13. data/lib/wgpu/commands/render_pass.rb +207 -0
  14. data/lib/wgpu/core/adapter.rb +186 -0
  15. data/lib/wgpu/core/canvas_context.rb +104 -0
  16. data/lib/wgpu/core/device.rb +397 -0
  17. data/lib/wgpu/core/instance.rb +81 -0
  18. data/lib/wgpu/core/queue.rb +197 -0
  19. data/lib/wgpu/core/surface.rb +221 -0
  20. data/lib/wgpu/error.rb +16 -0
  21. data/lib/wgpu/native/callbacks.rb +26 -0
  22. data/lib/wgpu/native/enums.rb +529 -0
  23. data/lib/wgpu/native/functions.rb +419 -0
  24. data/lib/wgpu/native/loader.rb +61 -0
  25. data/lib/wgpu/native/structs.rb +646 -0
  26. data/lib/wgpu/pipeline/bind_group.rb +80 -0
  27. data/lib/wgpu/pipeline/bind_group_layout.rb +121 -0
  28. data/lib/wgpu/pipeline/compute_pipeline.rb +88 -0
  29. data/lib/wgpu/pipeline/pipeline_layout.rb +43 -0
  30. data/lib/wgpu/pipeline/render_pipeline.rb +278 -0
  31. data/lib/wgpu/pipeline/shader_module.rb +202 -0
  32. data/lib/wgpu/resources/buffer.rb +228 -0
  33. data/lib/wgpu/resources/query_set.rb +45 -0
  34. data/lib/wgpu/resources/sampler.rb +47 -0
  35. data/lib/wgpu/resources/texture.rb +136 -0
  36. data/lib/wgpu/resources/texture_view.rb +49 -0
  37. data/lib/wgpu/version.rb +5 -0
  38. data/lib/wgpu/window.rb +177 -0
  39. data/lib/wgpu.rb +36 -0
  40. metadata +125 -0
@@ -0,0 +1,646 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WGPU
4
+ module Native
5
+ class ChainedStruct < FFI::Struct
6
+ layout :next, :pointer,
7
+ :s_type, SType
8
+ end
9
+
10
+ class StringView < FFI::Struct
11
+ layout :data, :pointer,
12
+ :length, :size_t
13
+ end
14
+
15
+ class ChainedStructOut < FFI::Struct
16
+ layout :next, :pointer,
17
+ :s_type, SType
18
+ end
19
+
20
+ class InstanceCapabilities < FFI::Struct
21
+ layout :next_in_chain, :pointer,
22
+ :timed_wait_any_enable, :uint32,
23
+ :timed_wait_any_max_count, :size_t
24
+ end
25
+
26
+ class InstanceDescriptor < FFI::Struct
27
+ layout :next_in_chain, :pointer,
28
+ :features, InstanceCapabilities
29
+ end
30
+
31
+ class RequestAdapterOptions < FFI::Struct
32
+ layout :next_in_chain, :pointer,
33
+ :feature_level, FeatureLevel,
34
+ :power_preference, PowerPreference,
35
+ :force_fallback_adapter, :uint32,
36
+ :backend_type, BackendType,
37
+ :compatible_surface, :pointer
38
+ end
39
+
40
+ class AdapterInfo < FFI::Struct
41
+ layout :next_in_chain, :pointer,
42
+ :vendor, StringView,
43
+ :architecture, StringView,
44
+ :device, StringView,
45
+ :description, StringView,
46
+ :backend_type, BackendType,
47
+ :adapter_type, AdapterType,
48
+ :vendor_id, :uint32,
49
+ :device_id, :uint32
50
+ end
51
+
52
+ class QueueDescriptor < FFI::Struct
53
+ layout :next_in_chain, :pointer,
54
+ :label, StringView
55
+ end
56
+
57
+ class DeviceLostCallbackInfo < FFI::Struct
58
+ layout :next_in_chain, :pointer,
59
+ :mode, :uint32,
60
+ :callback, :pointer,
61
+ :userdata, :pointer
62
+ end
63
+
64
+ class UncapturedErrorCallbackInfo < FFI::Struct
65
+ layout :next_in_chain, :pointer,
66
+ :callback, :pointer,
67
+ :userdata, :pointer
68
+ end
69
+
70
+ class PopErrorScopeCallbackInfo < FFI::Struct
71
+ layout :next_in_chain, :pointer,
72
+ :mode, :uint32,
73
+ :callback, :pointer,
74
+ :userdata1, :pointer,
75
+ :userdata2, :pointer
76
+ end
77
+
78
+ class QueueWorkDoneCallbackInfo < FFI::Struct
79
+ layout :next_in_chain, :pointer,
80
+ :mode, :uint32,
81
+ :callback, :pointer,
82
+ :userdata1, :pointer,
83
+ :userdata2, :pointer
84
+ end
85
+
86
+ class InstanceEnumerateAdapterOptions < FFI::Struct
87
+ layout :next_in_chain, :pointer,
88
+ :backends, :uint32
89
+ end
90
+
91
+ class Limits < FFI::Struct
92
+ layout :max_texture_dimension_1d, :uint32,
93
+ :max_texture_dimension_2d, :uint32,
94
+ :max_texture_dimension_3d, :uint32,
95
+ :max_texture_array_layers, :uint32,
96
+ :max_bind_groups, :uint32,
97
+ :max_bind_groups_plus_vertex_buffers, :uint32,
98
+ :max_bindings_per_bind_group, :uint32,
99
+ :max_dynamic_uniform_buffers_per_pipeline_layout, :uint32,
100
+ :max_dynamic_storage_buffers_per_pipeline_layout, :uint32,
101
+ :max_sampled_textures_per_shader_stage, :uint32,
102
+ :max_samplers_per_shader_stage, :uint32,
103
+ :max_storage_buffers_per_shader_stage, :uint32,
104
+ :max_storage_textures_per_shader_stage, :uint32,
105
+ :max_uniform_buffers_per_shader_stage, :uint32,
106
+ :max_uniform_buffer_binding_size, :uint64,
107
+ :max_storage_buffer_binding_size, :uint64,
108
+ :min_uniform_buffer_offset_alignment, :uint32,
109
+ :min_storage_buffer_offset_alignment, :uint32,
110
+ :max_vertex_buffers, :uint32,
111
+ :max_buffer_size, :uint64,
112
+ :max_vertex_attributes, :uint32,
113
+ :max_vertex_buffer_array_stride, :uint32,
114
+ :max_inter_stage_shader_variables, :uint32,
115
+ :max_color_attachments, :uint32,
116
+ :max_color_attachment_bytes_per_sample, :uint32,
117
+ :max_compute_workgroup_storage_size, :uint32,
118
+ :max_compute_invocations_per_workgroup, :uint32,
119
+ :max_compute_workgroup_size_x, :uint32,
120
+ :max_compute_workgroup_size_y, :uint32,
121
+ :max_compute_workgroup_size_z, :uint32,
122
+ :max_compute_workgroups_per_dimension, :uint32,
123
+ :max_subgroup_size, :uint32
124
+ end
125
+
126
+ class RequiredLimits < FFI::Struct
127
+ layout :next_in_chain, :pointer,
128
+ :limits, Limits
129
+ end
130
+
131
+ class DeviceDescriptor < FFI::Struct
132
+ layout :next_in_chain, :pointer,
133
+ :label, StringView,
134
+ :required_feature_count, :size_t,
135
+ :required_features, :pointer,
136
+ :required_limits, :pointer,
137
+ :default_queue, QueueDescriptor,
138
+ :device_lost_callback_info, DeviceLostCallbackInfo,
139
+ :uncaptured_error_callback_info, UncapturedErrorCallbackInfo
140
+ end
141
+
142
+ class BufferDescriptor < FFI::Struct
143
+ layout :next_in_chain, :pointer,
144
+ :label, StringView,
145
+ :usage, :uint64,
146
+ :size, :uint64,
147
+ :mapped_at_creation, :uint32
148
+ end
149
+
150
+ class Extent3D < FFI::Struct
151
+ layout :width, :uint32,
152
+ :height, :uint32,
153
+ :depth_or_array_layers, :uint32
154
+ end
155
+
156
+ class TextureDescriptor < FFI::Struct
157
+ layout :next_in_chain, :pointer,
158
+ :label, StringView,
159
+ :usage, :uint64,
160
+ :dimension, TextureDimension,
161
+ :size, Extent3D,
162
+ :format, TextureFormat,
163
+ :mip_level_count, :uint32,
164
+ :sample_count, :uint32,
165
+ :view_format_count, :size_t,
166
+ :view_formats, :pointer
167
+ end
168
+
169
+ class ShaderSourceSPIRV < FFI::Struct
170
+ layout :chain, ChainedStruct,
171
+ :code_size, :uint32,
172
+ :code, :pointer
173
+ end
174
+
175
+ class ShaderSourceWGSL < FFI::Struct
176
+ layout :chain, ChainedStruct,
177
+ :code, StringView
178
+ end
179
+
180
+ class ShaderDefine < FFI::Struct
181
+ layout :name, StringView,
182
+ :value, StringView
183
+ end
184
+
185
+ class ShaderSourceGLSL < FFI::Struct
186
+ layout :chain, ChainedStruct,
187
+ :stage, :uint64,
188
+ :code, StringView,
189
+ :define_count, :uint32,
190
+ :defines, :pointer
191
+ end
192
+
193
+ class ShaderModuleDescriptor < FFI::Struct
194
+ layout :next_in_chain, :pointer,
195
+ :label, StringView
196
+ end
197
+
198
+ class CommandEncoderDescriptor < FFI::Struct
199
+ layout :next_in_chain, :pointer,
200
+ :label, StringView
201
+ end
202
+
203
+ class CommandBufferDescriptor < FFI::Struct
204
+ layout :next_in_chain, :pointer,
205
+ :label, StringView
206
+ end
207
+
208
+ class Color < FFI::Struct
209
+ layout :r, :double,
210
+ :g, :double,
211
+ :b, :double,
212
+ :a, :double
213
+ end
214
+
215
+ class RenderPassColorAttachment < FFI::Struct
216
+ layout :next_in_chain, :pointer,
217
+ :view, :pointer,
218
+ :depth_slice, :uint32,
219
+ :resolve_target, :pointer,
220
+ :load_op, LoadOp,
221
+ :store_op, StoreOp,
222
+ :clear_value, Color
223
+ end
224
+
225
+ class RenderPassDepthStencilAttachment < FFI::Struct
226
+ layout :view, :pointer,
227
+ :depth_load_op, LoadOp,
228
+ :depth_store_op, StoreOp,
229
+ :depth_clear_value, :float,
230
+ :depth_read_only, :uint32,
231
+ :stencil_load_op, LoadOp,
232
+ :stencil_store_op, StoreOp,
233
+ :stencil_clear_value, :uint32,
234
+ :stencil_read_only, :uint32
235
+ end
236
+
237
+ class RenderPassTimestampWrites < FFI::Struct
238
+ layout :query_set, :pointer,
239
+ :beginning_of_pass_write_index, :uint32,
240
+ :end_of_pass_write_index, :uint32
241
+ end
242
+
243
+ class RenderPassDescriptor < FFI::Struct
244
+ layout :next_in_chain, :pointer,
245
+ :label, StringView,
246
+ :color_attachment_count, :size_t,
247
+ :color_attachments, :pointer,
248
+ :depth_stencil_attachment, :pointer,
249
+ :occlusion_query_set, :pointer,
250
+ :timestamp_writes, :pointer
251
+ end
252
+
253
+ class ComputePassDescriptor < FFI::Struct
254
+ layout :next_in_chain, :pointer,
255
+ :label, StringView,
256
+ :timestamp_writes, :pointer
257
+ end
258
+
259
+ class ComputePassTimestampWrites < FFI::Struct
260
+ layout :query_set, :pointer,
261
+ :beginning_of_pass_write_index, :uint32,
262
+ :end_of_pass_write_index, :uint32
263
+ end
264
+
265
+ class ConstantEntry < FFI::Struct
266
+ layout :next_in_chain, :pointer,
267
+ :key, StringView,
268
+ :value, :double
269
+ end
270
+
271
+ class ProgrammableStageDescriptor < FFI::Struct
272
+ layout :next_in_chain, :pointer,
273
+ :module, :pointer,
274
+ :entry_point, StringView,
275
+ :constant_count, :size_t,
276
+ :constants, :pointer
277
+ end
278
+
279
+ class ComputePipelineDescriptor < FFI::Struct
280
+ layout :next_in_chain, :pointer,
281
+ :label, StringView,
282
+ :layout, :pointer,
283
+ :compute, ProgrammableStageDescriptor
284
+ end
285
+
286
+ class BufferBindingLayout < FFI::Struct
287
+ layout :next_in_chain, :pointer,
288
+ :type, BufferBindingType,
289
+ :has_dynamic_offset, :uint32,
290
+ :min_binding_size, :uint64
291
+ end
292
+
293
+ class SamplerBindingLayout < FFI::Struct
294
+ layout :next_in_chain, :pointer,
295
+ :type, SamplerBindingType
296
+ end
297
+
298
+ class TextureBindingLayout < FFI::Struct
299
+ layout :next_in_chain, :pointer,
300
+ :sample_type, TextureSampleType,
301
+ :view_dimension, TextureViewDimension,
302
+ :multisampled, :uint32
303
+ end
304
+
305
+ class StorageTextureBindingLayout < FFI::Struct
306
+ layout :next_in_chain, :pointer,
307
+ :access, StorageTextureAccess,
308
+ :format, TextureFormat,
309
+ :view_dimension, TextureViewDimension
310
+ end
311
+
312
+ class BindGroupLayoutEntry < FFI::Struct
313
+ layout :next_in_chain, :pointer,
314
+ :binding, :uint32,
315
+ :visibility, :uint64,
316
+ :buffer, BufferBindingLayout,
317
+ :sampler, SamplerBindingLayout,
318
+ :texture, TextureBindingLayout,
319
+ :storage_texture, StorageTextureBindingLayout
320
+ end
321
+
322
+ class BindGroupLayoutDescriptor < FFI::Struct
323
+ layout :next_in_chain, :pointer,
324
+ :label, StringView,
325
+ :entry_count, :size_t,
326
+ :entries, :pointer
327
+ end
328
+
329
+ class BindGroupEntry < FFI::Struct
330
+ layout :next_in_chain, :pointer,
331
+ :binding, :uint32,
332
+ :buffer, :pointer,
333
+ :offset, :uint64,
334
+ :size, :uint64,
335
+ :sampler, :pointer,
336
+ :texture_view, :pointer
337
+ end
338
+
339
+ class BindGroupDescriptor < FFI::Struct
340
+ layout :next_in_chain, :pointer,
341
+ :label, StringView,
342
+ :layout, :pointer,
343
+ :entry_count, :size_t,
344
+ :entries, :pointer
345
+ end
346
+
347
+ class PipelineLayoutDescriptor < FFI::Struct
348
+ layout :next_in_chain, :pointer,
349
+ :label, StringView,
350
+ :bind_group_layout_count, :size_t,
351
+ :bind_group_layouts, :pointer
352
+ end
353
+
354
+ class RequestAdapterCallbackInfo < FFI::Struct
355
+ layout :next_in_chain, :pointer,
356
+ :mode, :uint32,
357
+ :callback, :pointer,
358
+ :userdata, :pointer
359
+ end
360
+
361
+ class RequestDeviceCallbackInfo < FFI::Struct
362
+ layout :next_in_chain, :pointer,
363
+ :mode, :uint32,
364
+ :callback, :pointer,
365
+ :userdata, :pointer
366
+ end
367
+
368
+ class BufferMapCallbackInfo < FFI::Struct
369
+ layout :next_in_chain, :pointer,
370
+ :mode, :uint32,
371
+ :callback, :pointer,
372
+ :userdata, :pointer
373
+ end
374
+
375
+ class TextureViewDescriptor < FFI::Struct
376
+ layout :next_in_chain, :pointer,
377
+ :label, StringView,
378
+ :format, TextureFormat,
379
+ :dimension, TextureViewDimension,
380
+ :base_mip_level, :uint32,
381
+ :mip_level_count, :uint32,
382
+ :base_array_layer, :uint32,
383
+ :array_layer_count, :uint32,
384
+ :aspect, TextureAspect
385
+ end
386
+
387
+ class SamplerDescriptor < FFI::Struct
388
+ layout :next_in_chain, :pointer,
389
+ :label, StringView,
390
+ :address_mode_u, AddressMode,
391
+ :address_mode_v, AddressMode,
392
+ :address_mode_w, AddressMode,
393
+ :mag_filter, FilterMode,
394
+ :min_filter, FilterMode,
395
+ :mipmap_filter, MipmapFilterMode,
396
+ :lod_min_clamp, :float,
397
+ :lod_max_clamp, :float,
398
+ :compare, CompareFunction,
399
+ :max_anisotropy, :uint16
400
+ end
401
+
402
+ class BlendComponent < FFI::Struct
403
+ layout :operation, BlendOperation,
404
+ :src_factor, BlendFactor,
405
+ :dst_factor, BlendFactor
406
+ end
407
+
408
+ class BlendState < FFI::Struct
409
+ layout :color, BlendComponent,
410
+ :alpha, BlendComponent
411
+ end
412
+
413
+ class ColorTargetState < FFI::Struct
414
+ layout :next_in_chain, :pointer,
415
+ :format, TextureFormat,
416
+ :blend, :pointer,
417
+ :write_mask, :uint64
418
+ end
419
+
420
+ class FragmentState < FFI::Struct
421
+ layout :next_in_chain, :pointer,
422
+ :module, :pointer,
423
+ :entry_point, StringView,
424
+ :constant_count, :size_t,
425
+ :constants, :pointer,
426
+ :target_count, :size_t,
427
+ :targets, :pointer
428
+ end
429
+
430
+ class VertexAttribute < FFI::Struct
431
+ layout :format, VertexFormat,
432
+ :offset, :uint64,
433
+ :shader_location, :uint32
434
+ end
435
+
436
+ class VertexBufferLayout < FFI::Struct
437
+ layout :step_mode, VertexStepMode,
438
+ :array_stride, :uint64,
439
+ :attribute_count, :size_t,
440
+ :attributes, :pointer
441
+ end
442
+
443
+ class VertexState < FFI::Struct
444
+ layout :next_in_chain, :pointer,
445
+ :module, :pointer,
446
+ :entry_point, StringView,
447
+ :constant_count, :size_t,
448
+ :constants, :pointer,
449
+ :buffer_count, :size_t,
450
+ :buffers, :pointer
451
+ end
452
+
453
+ class PrimitiveState < FFI::Struct
454
+ layout :next_in_chain, :pointer,
455
+ :topology, PrimitiveTopology,
456
+ :strip_index_format, IndexFormat,
457
+ :front_face, FrontFace,
458
+ :cull_mode, CullMode,
459
+ :unclipped_depth, :uint32
460
+ end
461
+
462
+ class StencilFaceState < FFI::Struct
463
+ layout :compare, CompareFunction,
464
+ :fail_op, StencilOperation,
465
+ :depth_fail_op, StencilOperation,
466
+ :pass_op, StencilOperation
467
+ end
468
+
469
+ class DepthStencilState < FFI::Struct
470
+ layout :next_in_chain, :pointer,
471
+ :format, TextureFormat,
472
+ :depth_write_enabled, :uint32,
473
+ :depth_compare, CompareFunction,
474
+ :stencil_front, StencilFaceState,
475
+ :stencil_back, StencilFaceState,
476
+ :stencil_read_mask, :uint32,
477
+ :stencil_write_mask, :uint32,
478
+ :depth_bias, :int32,
479
+ :depth_bias_slope_scale, :float,
480
+ :depth_bias_clamp, :float
481
+ end
482
+
483
+ class MultisampleState < FFI::Struct
484
+ layout :next_in_chain, :pointer,
485
+ :count, :uint32,
486
+ :mask, :uint32,
487
+ :alpha_to_coverage_enabled, :uint32
488
+ end
489
+
490
+ class RenderPipelineDescriptor < FFI::Struct
491
+ layout :next_in_chain, :pointer,
492
+ :label, StringView,
493
+ :layout, :pointer,
494
+ :vertex, VertexState,
495
+ :primitive, PrimitiveState,
496
+ :depth_stencil, :pointer,
497
+ :multisample, MultisampleState,
498
+ :fragment, :pointer
499
+ end
500
+
501
+ class Origin3D < FFI::Struct
502
+ layout :x, :uint32,
503
+ :y, :uint32,
504
+ :z, :uint32
505
+ end
506
+
507
+ class ImageCopyTexture < FFI::Struct
508
+ layout :texture, :pointer,
509
+ :mip_level, :uint32,
510
+ :origin, Origin3D,
511
+ :aspect, TextureAspect
512
+ end
513
+
514
+ class TextureDataLayout < FFI::Struct
515
+ layout :offset, :uint64,
516
+ :bytes_per_row, :uint32,
517
+ :rows_per_image, :uint32
518
+ end
519
+
520
+ class SurfaceDescriptor < FFI::Struct
521
+ layout :next_in_chain, :pointer,
522
+ :label, StringView
523
+ end
524
+
525
+ class SurfaceCapabilities < FFI::Struct
526
+ layout :next_in_chain, :pointer,
527
+ :usages, :uint64,
528
+ :format_count, :size_t,
529
+ :formats, :pointer,
530
+ :present_mode_count, :size_t,
531
+ :present_modes, :pointer,
532
+ :alpha_mode_count, :size_t,
533
+ :alpha_modes, :pointer
534
+ end
535
+
536
+ class SurfaceConfiguration < FFI::Struct
537
+ layout :next_in_chain, :pointer,
538
+ :device, :pointer,
539
+ :format, TextureFormat,
540
+ :usage, :uint64,
541
+ :width, :uint32,
542
+ :height, :uint32,
543
+ :view_format_count, :size_t,
544
+ :view_formats, :pointer,
545
+ :alpha_mode, :uint32,
546
+ :present_mode, :uint32
547
+ end
548
+
549
+ class SurfaceTexture < FFI::Struct
550
+ layout :next_in_chain, :pointer,
551
+ :texture, :pointer,
552
+ :status, :uint32
553
+ end
554
+
555
+ class SurfaceSourceMetalLayer < FFI::Struct
556
+ layout :chain, ChainedStruct,
557
+ :layer, :pointer
558
+ end
559
+
560
+ class SurfaceSourceWindowsHWND < FFI::Struct
561
+ layout :chain, ChainedStruct,
562
+ :hinstance, :pointer,
563
+ :hwnd, :pointer
564
+ end
565
+
566
+ class SurfaceSourceXlibWindow < FFI::Struct
567
+ layout :chain, ChainedStruct,
568
+ :display, :pointer,
569
+ :window, :uint64
570
+ end
571
+
572
+ class SurfaceSourceWaylandSurface < FFI::Struct
573
+ layout :chain, ChainedStruct,
574
+ :display, :pointer,
575
+ :surface, :pointer
576
+ end
577
+
578
+ class SurfaceSourceXCBWindow < FFI::Struct
579
+ layout :chain, ChainedStruct,
580
+ :connection, :pointer,
581
+ :window, :uint32
582
+ end
583
+
584
+ class QuerySetDescriptor < FFI::Struct
585
+ layout :next_in_chain, :pointer,
586
+ :label, StringView,
587
+ :type, QueryType,
588
+ :count, :uint32
589
+ end
590
+
591
+ class ImageCopyBuffer < FFI::Struct
592
+ layout :layout, TextureDataLayout,
593
+ :buffer, :pointer
594
+ end
595
+
596
+ class SupportedFeatures < FFI::Struct
597
+ layout :feature_count, :size_t,
598
+ :features, :pointer
599
+ end
600
+
601
+ class SupportedLimits < FFI::Struct
602
+ layout :next_in_chain, :pointer,
603
+ :limits, Limits
604
+ end
605
+
606
+ class CompilationMessage < FFI::Struct
607
+ layout :next_in_chain, :pointer,
608
+ :message, StringView,
609
+ :type, CompilationMessageType,
610
+ :line_num, :uint64,
611
+ :line_pos, :uint64,
612
+ :offset, :uint64,
613
+ :length, :uint64
614
+ end
615
+
616
+ class CompilationInfo < FFI::Struct
617
+ layout :next_in_chain, :pointer,
618
+ :message_count, :size_t,
619
+ :messages, :pointer
620
+ end
621
+
622
+ class CompilationInfoCallbackInfo < FFI::Struct
623
+ layout :next_in_chain, :pointer,
624
+ :mode, :uint32,
625
+ :callback, :pointer,
626
+ :userdata1, :pointer,
627
+ :userdata2, :pointer
628
+ end
629
+
630
+ class RenderBundleDescriptor < FFI::Struct
631
+ layout :next_in_chain, :pointer,
632
+ :label, StringView
633
+ end
634
+
635
+ class RenderBundleEncoderDescriptor < FFI::Struct
636
+ layout :next_in_chain, :pointer,
637
+ :label, StringView,
638
+ :color_format_count, :size_t,
639
+ :color_formats, :pointer,
640
+ :depth_stencil_format, TextureFormat,
641
+ :sample_count, :uint32,
642
+ :depth_read_only, :uint32,
643
+ :stencil_read_only, :uint32
644
+ end
645
+ end
646
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WGPU
4
+ class BindGroup
5
+ attr_reader :handle
6
+
7
+ def initialize(device, label: nil, layout:, entries:)
8
+ @device = device
9
+
10
+ entries_array = entries.map { |e| create_entry(e) }
11
+ entries_ptr = FFI::MemoryPointer.new(Native::BindGroupEntry, entries_array.size)
12
+ entries_array.each_with_index do |entry, i|
13
+ offset = i * Native::BindGroupEntry.size
14
+ (entries_ptr + offset).put_bytes(0, entry.pointer.read_bytes(Native::BindGroupEntry.size))
15
+ end
16
+
17
+ desc = Native::BindGroupDescriptor.new
18
+ desc[:next_in_chain] = nil
19
+ if label
20
+ label_ptr = FFI::MemoryPointer.from_string(label)
21
+ desc[:label][:data] = label_ptr
22
+ desc[:label][:length] = label.bytesize
23
+ else
24
+ desc[:label][:data] = nil
25
+ desc[:label][:length] = 0
26
+ end
27
+ desc[:layout] = layout.handle
28
+ desc[:entry_count] = entries_array.size
29
+ desc[:entries] = entries_ptr
30
+
31
+ device.push_error_scope(:validation)
32
+ @handle = Native.wgpuDeviceCreateBindGroup(device.handle, desc)
33
+ error = device.pop_error_scope
34
+
35
+ if @handle.null? || (error[:type] && error[:type] != :no_error)
36
+ msg = error[:message] || "Failed to create bind group"
37
+ raise PipelineError, msg
38
+ end
39
+ end
40
+
41
+ def release
42
+ return if @handle.null?
43
+ Native.wgpuBindGroupRelease(@handle)
44
+ @handle = FFI::Pointer::NULL
45
+ end
46
+
47
+ private
48
+
49
+ def create_entry(entry_hash)
50
+ entry = Native::BindGroupEntry.new
51
+ entry[:next_in_chain] = nil
52
+ entry[:binding] = entry_hash[:binding]
53
+
54
+ if entry_hash[:buffer]
55
+ buffer = entry_hash[:buffer]
56
+ entry[:buffer] = buffer.handle
57
+ entry[:offset] = entry_hash[:offset] || 0
58
+ entry[:size] = entry_hash[:size] || buffer.size
59
+ else
60
+ entry[:buffer] = nil
61
+ entry[:offset] = 0
62
+ entry[:size] = 0
63
+ end
64
+
65
+ if entry_hash[:sampler]
66
+ entry[:sampler] = entry_hash[:sampler].handle
67
+ else
68
+ entry[:sampler] = nil
69
+ end
70
+
71
+ if entry_hash[:texture_view]
72
+ entry[:texture_view] = entry_hash[:texture_view].handle
73
+ else
74
+ entry[:texture_view] = nil
75
+ end
76
+
77
+ entry
78
+ end
79
+ end
80
+ end