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,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sdl3"
4
+
5
+ module WGPU
6
+ module Window
7
+ class SDLWindow
8
+ attr_reader :width, :height, :window
9
+
10
+ # Property names for native window handles
11
+ SDL_PROP_WINDOW_WIN32_HWND_POINTER = "SDL.window.win32.hwnd"
12
+ SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER = "SDL.window.win32.instance"
13
+ SDL_PROP_WINDOW_X11_DISPLAY_POINTER = "SDL.window.x11.display"
14
+ SDL_PROP_WINDOW_X11_WINDOW_NUMBER = "SDL.window.x11.window"
15
+ SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER = "SDL.window.wayland.display"
16
+ SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER = "SDL.window.wayland.surface"
17
+
18
+ def initialize(title:, width: 800, height: 600, resizable: true)
19
+ @width = width
20
+ @height = height
21
+ @metal_view = nil
22
+
23
+ flags = 0
24
+ flags |= SDL3::Raw::SDL_WINDOW_RESIZABLE if resizable
25
+ flags |= SDL3::Raw::SDL_WINDOW_HIGH_PIXEL_DENSITY if macos?
26
+ flags |= SDL3::Raw::SDL_WINDOW_METAL if macos?
27
+
28
+ @window = SDL3::Window.new(title, width, height, flags)
29
+ end
30
+
31
+ def create_surface(instance)
32
+ case platform
33
+ when :macos
34
+ create_metal_surface(instance)
35
+ when :windows
36
+ create_windows_surface(instance)
37
+ when :linux_x11
38
+ create_x11_surface(instance)
39
+ when :linux_wayland
40
+ create_wayland_surface(instance)
41
+ else
42
+ raise WindowError, "Unsupported platform: #{RbConfig::CONFIG["host_os"]}"
43
+ end
44
+ end
45
+
46
+ def poll_events
47
+ events = []
48
+ SDL3::Event.each do |event|
49
+ events << event
50
+ end
51
+ events
52
+ end
53
+
54
+ def should_close?(events)
55
+ events.any?(&:quit?)
56
+ end
57
+
58
+ def key_pressed?(events, key)
59
+ scancode = case key
60
+ when :escape then SDL3::Raw::SDL_SCANCODE_ESCAPE
61
+ when :space then SDL3::Raw::SDL_SCANCODE_SPACE
62
+ when :return, :enter then SDL3::Raw::SDL_SCANCODE_RETURN
63
+ else key
64
+ end
65
+
66
+ events.any? do |event|
67
+ next unless event.key_down?
68
+
69
+ event_scancode = event.raw[:key][:scancode] rescue nil
70
+ event_scancode == scancode
71
+ end
72
+ end
73
+
74
+ def drawable_size
75
+ @window.size_in_pixels
76
+ rescue
77
+ [@width, @height]
78
+ end
79
+
80
+ def close
81
+ if @metal_view && !@metal_view.null?
82
+ SDL3::Raw.SDL_Metal_DestroyView(@metal_view)
83
+ @metal_view = nil
84
+ end
85
+ @window.destroy if @window
86
+ end
87
+
88
+ private
89
+
90
+ def window_pointer
91
+ @window.to_ptr
92
+ end
93
+
94
+ def window_properties
95
+ SDL3::Raw.SDL_GetWindowProperties(window_pointer)
96
+ end
97
+
98
+ def create_metal_surface(instance)
99
+ ptr = window_pointer
100
+ raise WindowError, "Could not get window pointer" if ptr.nil? || ptr.null?
101
+
102
+ @metal_view = SDL3::Raw.SDL_Metal_CreateView(ptr)
103
+ raise WindowError, "Failed to create Metal view" if @metal_view.nil? || @metal_view.null?
104
+
105
+ layer = SDL3::Raw.SDL_Metal_GetLayer(@metal_view)
106
+ raise WindowError, "Failed to get Metal layer" if layer.nil? || layer.null?
107
+
108
+ Surface.from_metal_layer(instance, layer)
109
+ end
110
+
111
+ def create_windows_surface(instance)
112
+ ptr = window_pointer
113
+ raise WindowError, "Could not get window pointer" if ptr.nil? || ptr.null?
114
+
115
+ props = window_properties
116
+ raise WindowError, "Failed to get window properties" if props == 0
117
+
118
+ hwnd = SDL3::Raw.SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WIN32_HWND_POINTER, nil)
119
+ hinstance = SDL3::Raw.SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER, nil)
120
+ raise WindowError, "Failed to get Windows window info" unless hwnd
121
+
122
+ Surface.from_windows_hwnd(instance, hinstance, hwnd)
123
+ end
124
+
125
+ def create_x11_surface(instance)
126
+ ptr = window_pointer
127
+ raise WindowError, "Could not get window pointer" if ptr.nil? || ptr.null?
128
+
129
+ props = window_properties
130
+ raise WindowError, "Failed to get window properties" if props == 0
131
+
132
+ display = SDL3::Raw.SDL_GetPointerProperty(props, SDL_PROP_WINDOW_X11_DISPLAY_POINTER, nil)
133
+ window_id = SDL3::Raw.SDL_GetNumberProperty(props, SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0)
134
+ raise WindowError, "Failed to get X11 window info" unless display
135
+
136
+ Surface.from_xlib_window(instance, display, window_id)
137
+ end
138
+
139
+ def create_wayland_surface(instance)
140
+ ptr = window_pointer
141
+ raise WindowError, "Could not get window pointer" if ptr.nil? || ptr.null?
142
+
143
+ props = window_properties
144
+ raise WindowError, "Failed to get window properties" if props == 0
145
+
146
+ display = SDL3::Raw.SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, nil)
147
+ wl_surface = SDL3::Raw.SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, nil)
148
+ raise WindowError, "Failed to get Wayland window info" unless display
149
+
150
+ Surface.from_wayland_surface(instance, display, wl_surface)
151
+ end
152
+
153
+ def platform
154
+ case RbConfig::CONFIG["host_os"]
155
+ when /darwin/
156
+ :macos
157
+ when /mswin|mingw/
158
+ :windows
159
+ when /linux/
160
+ if ENV["XDG_SESSION_TYPE"] == "wayland" || ENV["WAYLAND_DISPLAY"]
161
+ :linux_wayland
162
+ else
163
+ :linux_x11
164
+ end
165
+ else
166
+ :unknown
167
+ end
168
+ end
169
+
170
+ def macos?
171
+ platform == :macos
172
+ end
173
+ end
174
+
175
+ class WindowError < StandardError; end
176
+ end
177
+ end
data/lib/wgpu.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "wgpu/version"
4
+ require_relative "wgpu/error"
5
+ require_relative "wgpu/native/loader"
6
+ require_relative "wgpu/async_task"
7
+
8
+ require_relative "wgpu/resources/buffer"
9
+ require_relative "wgpu/resources/texture"
10
+ require_relative "wgpu/resources/texture_view"
11
+ require_relative "wgpu/resources/sampler"
12
+ require_relative "wgpu/resources/query_set"
13
+
14
+ require_relative "wgpu/pipeline/shader_module"
15
+ require_relative "wgpu/pipeline/bind_group_layout"
16
+ require_relative "wgpu/pipeline/bind_group"
17
+ require_relative "wgpu/pipeline/pipeline_layout"
18
+ require_relative "wgpu/pipeline/compute_pipeline"
19
+ require_relative "wgpu/pipeline/render_pipeline"
20
+
21
+ require_relative "wgpu/commands/command_buffer"
22
+ require_relative "wgpu/commands/compute_pass"
23
+ require_relative "wgpu/commands/render_pass"
24
+ require_relative "wgpu/commands/render_bundle"
25
+ require_relative "wgpu/commands/render_bundle_encoder"
26
+ require_relative "wgpu/commands/command_encoder"
27
+
28
+ require_relative "wgpu/core/queue"
29
+ require_relative "wgpu/core/device"
30
+ require_relative "wgpu/core/adapter"
31
+ require_relative "wgpu/core/instance"
32
+ require_relative "wgpu/core/surface"
33
+ require_relative "wgpu/core/canvas_context"
34
+
35
+ module WGPU
36
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wgpu
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yudai Takada
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ffi
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.15'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.15'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rubyzip
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.3'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.3'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sdl3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 1.0.0
54
+ description: Ruby bindings for the WebGPU API, providing GPU compute and graphics
55
+ capabilities through the wgpu-native library.
56
+ email:
57
+ - t.yudai92@gmail.com
58
+ executables: []
59
+ extensions:
60
+ - ext/wgpu/extconf.rb
61
+ extra_rdoc_files: []
62
+ files:
63
+ - LICENSE-APACHE
64
+ - LICENSE-MIT
65
+ - README.md
66
+ - ext/wgpu/Makefile
67
+ - ext/wgpu/extconf.rb
68
+ - lib/wgpu.rb
69
+ - lib/wgpu/async_task.rb
70
+ - lib/wgpu/commands/command_buffer.rb
71
+ - lib/wgpu/commands/command_encoder.rb
72
+ - lib/wgpu/commands/compute_pass.rb
73
+ - lib/wgpu/commands/render_bundle.rb
74
+ - lib/wgpu/commands/render_bundle_encoder.rb
75
+ - lib/wgpu/commands/render_pass.rb
76
+ - lib/wgpu/core/adapter.rb
77
+ - lib/wgpu/core/canvas_context.rb
78
+ - lib/wgpu/core/device.rb
79
+ - lib/wgpu/core/instance.rb
80
+ - lib/wgpu/core/queue.rb
81
+ - lib/wgpu/core/surface.rb
82
+ - lib/wgpu/error.rb
83
+ - lib/wgpu/native/callbacks.rb
84
+ - lib/wgpu/native/enums.rb
85
+ - lib/wgpu/native/functions.rb
86
+ - lib/wgpu/native/loader.rb
87
+ - lib/wgpu/native/structs.rb
88
+ - lib/wgpu/pipeline/bind_group.rb
89
+ - lib/wgpu/pipeline/bind_group_layout.rb
90
+ - lib/wgpu/pipeline/compute_pipeline.rb
91
+ - lib/wgpu/pipeline/pipeline_layout.rb
92
+ - lib/wgpu/pipeline/render_pipeline.rb
93
+ - lib/wgpu/pipeline/shader_module.rb
94
+ - lib/wgpu/resources/buffer.rb
95
+ - lib/wgpu/resources/query_set.rb
96
+ - lib/wgpu/resources/sampler.rb
97
+ - lib/wgpu/resources/texture.rb
98
+ - lib/wgpu/resources/texture_view.rb
99
+ - lib/wgpu/version.rb
100
+ - lib/wgpu/window.rb
101
+ homepage: https://github.com/ydah/wgpu-ruby
102
+ licenses:
103
+ - MIT
104
+ - Apache-2.0
105
+ metadata:
106
+ homepage_uri: https://github.com/ydah/wgpu-ruby
107
+ source_code_uri: https://github.com/ydah/wgpu-ruby
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: 3.2.0
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubygems_version: 4.0.6
123
+ specification_version: 4
124
+ summary: Ruby bindings for WebGPU via wgpu-native
125
+ test_files: []