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.
- checksums.yaml +7 -0
- data/LICENSE-APACHE +190 -0
- data/LICENSE-MIT +21 -0
- data/README.md +228 -0
- data/ext/wgpu/Makefile +7 -0
- data/ext/wgpu/extconf.rb +161 -0
- data/lib/wgpu/async_task.rb +55 -0
- data/lib/wgpu/commands/command_buffer.rb +17 -0
- data/lib/wgpu/commands/command_encoder.rb +201 -0
- data/lib/wgpu/commands/compute_pass.rb +89 -0
- data/lib/wgpu/commands/render_bundle.rb +18 -0
- data/lib/wgpu/commands/render_bundle_encoder.rb +148 -0
- data/lib/wgpu/commands/render_pass.rb +207 -0
- data/lib/wgpu/core/adapter.rb +186 -0
- data/lib/wgpu/core/canvas_context.rb +104 -0
- data/lib/wgpu/core/device.rb +397 -0
- data/lib/wgpu/core/instance.rb +81 -0
- data/lib/wgpu/core/queue.rb +197 -0
- data/lib/wgpu/core/surface.rb +221 -0
- data/lib/wgpu/error.rb +16 -0
- data/lib/wgpu/native/callbacks.rb +26 -0
- data/lib/wgpu/native/enums.rb +529 -0
- data/lib/wgpu/native/functions.rb +419 -0
- data/lib/wgpu/native/loader.rb +61 -0
- data/lib/wgpu/native/structs.rb +646 -0
- data/lib/wgpu/pipeline/bind_group.rb +80 -0
- data/lib/wgpu/pipeline/bind_group_layout.rb +121 -0
- data/lib/wgpu/pipeline/compute_pipeline.rb +88 -0
- data/lib/wgpu/pipeline/pipeline_layout.rb +43 -0
- data/lib/wgpu/pipeline/render_pipeline.rb +278 -0
- data/lib/wgpu/pipeline/shader_module.rb +202 -0
- data/lib/wgpu/resources/buffer.rb +228 -0
- data/lib/wgpu/resources/query_set.rb +45 -0
- data/lib/wgpu/resources/sampler.rb +47 -0
- data/lib/wgpu/resources/texture.rb +136 -0
- data/lib/wgpu/resources/texture_view.rb +49 -0
- data/lib/wgpu/version.rb +5 -0
- data/lib/wgpu/window.rb +177 -0
- data/lib/wgpu.rb +36 -0
- metadata +125 -0
data/lib/wgpu/window.rb
ADDED
|
@@ -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: []
|