rlsl 1.0.0 → 1.0.1
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 +4 -4
- data/.rubocop.yml +8 -0
- data/CHANGELOG.md +3 -1
- data/README.md +101 -28
- data/Rakefile +7 -0
- data/lib/rlsl/base_translator/call_parser.rb +13 -2
- data/lib/rlsl/base_translator/code_scanner.rb +39 -1
- data/lib/rlsl/base_translator.rb +24 -2
- data/lib/rlsl/code_generator/math_prelude.rb +103 -10
- data/lib/rlsl/code_generator/ruby_wrapper_generator.rb +52 -12
- data/lib/rlsl/code_generator/template_context.rb +6 -3
- data/lib/rlsl/code_generator/uniform_struct_generator.rb +1 -1
- data/lib/rlsl/code_generator.rb +7 -4
- data/lib/rlsl/compiled_shader.rb +1 -1
- data/lib/rlsl/errors.rb +29 -0
- data/lib/rlsl/glsl/translator.rb +19 -6
- data/lib/rlsl/msl/shader.rb +27 -9
- data/lib/rlsl/msl/translator.rb +25 -4
- data/lib/rlsl/msl/uniform_buffer_packer.rb +11 -7
- data/lib/rlsl/prism/ast_visitor/control_flow_visiting.rb +59 -18
- data/lib/rlsl/prism/ast_visitor/definition_visiting.rb +22 -9
- data/lib/rlsl/prism/ast_visitor/expression_visiting.rb +18 -14
- data/lib/rlsl/prism/ast_visitor/scope_context.rb +4 -0
- data/lib/rlsl/prism/ast_visitor.rb +78 -20
- data/lib/rlsl/prism/builtins/function_registry.rb +41 -24
- data/lib/rlsl/prism/builtins/operator_rules.rb +24 -0
- data/lib/rlsl/prism/builtins/swizzle_rules.rb +10 -1
- data/lib/rlsl/prism/builtins.rb +8 -0
- data/lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb +51 -8
- data/lib/rlsl/prism/emitters/base_emitter/definition_emission.rb +42 -12
- data/lib/rlsl/prism/emitters/base_emitter/expression_emission.rb +20 -4
- data/lib/rlsl/prism/emitters/base_emitter/statement_emission.rb +7 -1
- data/lib/rlsl/prism/emitters/base_emitter.rb +66 -5
- data/lib/rlsl/prism/emitters/c_emitter.rb +103 -7
- data/lib/rlsl/prism/emitters/glsl_emitter.rb +48 -0
- data/lib/rlsl/prism/emitters/msl_emitter.rb +43 -1
- data/lib/rlsl/prism/emitters/target_emitter.rb +56 -9
- data/lib/rlsl/prism/emitters/wgsl_emitter.rb +173 -18
- data/lib/rlsl/prism/errors.rb +9 -0
- data/lib/rlsl/prism/ir/control_flow.rb +6 -4
- data/lib/rlsl/prism/ir/definitions.rb +17 -2
- data/lib/rlsl/prism/ir/expressions.rb +5 -1
- data/lib/rlsl/prism/ir/node.rb +1 -1
- data/lib/rlsl/prism/ir/traversal.rb +6 -2
- data/lib/rlsl/prism/mutation_analyzer.rb +30 -0
- data/lib/rlsl/prism/node_traversal.rb +41 -0
- data/lib/rlsl/prism/parameter_list.rb +46 -0
- data/lib/rlsl/prism/return_flow_validator.rb +73 -0
- data/lib/rlsl/prism/source_extractor/block_locator.rb +23 -25
- data/lib/rlsl/prism/source_extractor.rb +7 -6
- data/lib/rlsl/prism/source_unit/parser.rb +42 -32
- data/lib/rlsl/prism/source_unit.rb +10 -10
- data/lib/rlsl/prism/target_capability_validator.rb +27 -2
- data/lib/rlsl/prism/transpiler.rb +40 -3
- data/lib/rlsl/prism/type_inference/call_type_resolver.rb +28 -4
- data/lib/rlsl/prism/type_inference/call_validator.rb +5 -1
- data/lib/rlsl/prism/type_inference/collection_type_resolver.rb +45 -19
- data/lib/rlsl/prism/type_inference/control_flow_inferer.rb +88 -7
- data/lib/rlsl/prism/type_inference/definition_inferer.rb +16 -1
- data/lib/rlsl/prism/type_inference/expression_inferer.rb +4 -0
- data/lib/rlsl/prism/type_inference/field_type_resolver.rb +23 -2
- data/lib/rlsl/prism/type_inference/scope_stack.rb +1 -1
- data/lib/rlsl/prism/type_inference/type_shapes.rb +3 -3
- data/lib/rlsl/prism/type_inference.rb +10 -5
- data/lib/rlsl/shader_builder/build_service.rb +34 -7
- data/lib/rlsl/shader_builder/native_extension_compiler.rb +50 -24
- data/lib/rlsl/shader_builder/shader_definition.rb +3 -3
- data/lib/rlsl/shader_builder/source_resolver.rb +19 -1
- data/lib/rlsl/shader_builder.rb +50 -10
- data/lib/rlsl/shader_name.rb +18 -0
- data/lib/rlsl/types/type_spec.rb +3 -3
- data/lib/rlsl/types/value_normalizer.rb +16 -11
- data/lib/rlsl/types.rb +0 -4
- data/lib/rlsl/uniform_context.rb +18 -1
- data/lib/rlsl/version.rb +1 -1
- data/lib/rlsl/wgsl/translator.rb +29 -6
- data/lib/rlsl/wgsl/uniform_layout.rb +25 -0
- data/lib/rlsl.rb +24 -3
- metadata +23 -11
data/lib/rlsl/wgsl/translator.rb
CHANGED
|
@@ -16,27 +16,40 @@ module RLSL
|
|
|
16
16
|
target_vec2: "vec2<f32>",
|
|
17
17
|
target_vec3: "vec3<f32>",
|
|
18
18
|
target_vec4: "vec4<f32>"
|
|
19
|
-
)
|
|
19
|
+
).merge("fmodf" => BaseTranslator.infix_call("%"))
|
|
20
20
|
)
|
|
21
21
|
|
|
22
22
|
protected
|
|
23
23
|
|
|
24
|
+
def validate_source_format!(source)
|
|
25
|
+
return if source.target_code?
|
|
26
|
+
|
|
27
|
+
raise RLSL::TranslationError,
|
|
28
|
+
"WGSL generation only supports Ruby shader source; legacy C source cannot be translated to WGSL"
|
|
29
|
+
end
|
|
30
|
+
|
|
24
31
|
def generate_shader(helpers, fragment)
|
|
25
32
|
<<~WGSL
|
|
26
|
-
|
|
33
|
+
#{generated_by_comment("WGSL")}
|
|
27
34
|
|
|
28
35
|
struct Uniforms {
|
|
29
36
|
#{generate_uniform_struct}
|
|
30
|
-
}
|
|
37
|
+
}
|
|
31
38
|
|
|
32
39
|
@group(0) @binding(0) var<uniform> u: Uniforms;
|
|
33
40
|
@group(0) @binding(1) var output_texture: texture_storage_2d<rgba8unorm, write>;
|
|
41
|
+
#{generate_texture_declarations}
|
|
42
|
+
|
|
43
|
+
fn rlsl_mod(x: f32, y: f32) -> f32 {
|
|
44
|
+
return x - y * floor(x / y);
|
|
45
|
+
}
|
|
34
46
|
|
|
35
47
|
#{helpers}
|
|
36
48
|
|
|
37
|
-
fn shader_fragment(
|
|
38
|
-
|
|
39
|
-
|
|
49
|
+
fn shader_fragment(_rlsl_frag_coord: vec2<f32>, _rlsl_resolution: vec2<f32>) -> vec3<f32> {
|
|
50
|
+
var frag_coord = _rlsl_frag_coord;
|
|
51
|
+
var resolution = _rlsl_resolution;
|
|
52
|
+
#{indent_source(fragment, 4)}
|
|
40
53
|
}
|
|
41
54
|
|
|
42
55
|
@compute @workgroup_size(8, 8)
|
|
@@ -72,6 +85,16 @@ module RLSL
|
|
|
72
85
|
end
|
|
73
86
|
fields.join("\n ")
|
|
74
87
|
end
|
|
88
|
+
|
|
89
|
+
def generate_texture_declarations
|
|
90
|
+
texture_uniforms.each_with_index.flat_map do |(name, _type), index|
|
|
91
|
+
binding = 2 + index * 2
|
|
92
|
+
[
|
|
93
|
+
"@group(0) @binding(#{binding}) var #{name}: texture_2d<f32>;",
|
|
94
|
+
"@group(0) @binding(#{binding + 1}) var #{name}_sampler: sampler;"
|
|
95
|
+
]
|
|
96
|
+
end.join("\n")
|
|
97
|
+
end
|
|
75
98
|
end
|
|
76
99
|
end
|
|
77
100
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RLSL
|
|
4
|
+
module WGSL
|
|
5
|
+
module UniformLayout
|
|
6
|
+
TYPE_INFO = {
|
|
7
|
+
float: [4, 4], int: [4, 4], bool: [4, 4],
|
|
8
|
+
vec2: [8, 8], vec3: [12, 16], vec4: [16, 16]
|
|
9
|
+
}.freeze
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
def build(fields)
|
|
13
|
+
offset = 0
|
|
14
|
+
result = {}
|
|
15
|
+
fields.each do |name, type|
|
|
16
|
+
size, alignment = TYPE_INFO.fetch(type.to_sym) { raise ArgumentError, "unsupported WGSL uniform type: #{type}" }
|
|
17
|
+
offset = (offset + alignment - 1) / alignment * alignment
|
|
18
|
+
result[name.to_sym] = { offset: offset, type: type.to_sym }
|
|
19
|
+
offset += size
|
|
20
|
+
end
|
|
21
|
+
{ fields: result, size: (offset + 15) / 16 * 16 }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/rlsl.rb
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "fileutils"
|
|
4
|
+
require "tmpdir"
|
|
4
5
|
|
|
5
6
|
require_relative "rlsl/version"
|
|
7
|
+
require_relative "rlsl/errors"
|
|
8
|
+
require_relative "rlsl/shader_name"
|
|
6
9
|
require_relative "rlsl/types"
|
|
7
10
|
require_relative "rlsl/uniform_context"
|
|
8
11
|
require_relative "rlsl/function_context"
|
|
@@ -14,12 +17,13 @@ require_relative "rlsl/msl/translator"
|
|
|
14
17
|
require_relative "rlsl/msl/uniform_buffer_packer"
|
|
15
18
|
require_relative "rlsl/msl/shader"
|
|
16
19
|
require_relative "rlsl/wgsl/translator"
|
|
20
|
+
require_relative "rlsl/wgsl/uniform_layout"
|
|
17
21
|
require_relative "rlsl/glsl/translator"
|
|
18
22
|
require_relative "rlsl/prism/transpiler"
|
|
19
23
|
require_relative "rlsl/shader_builder"
|
|
20
24
|
|
|
21
25
|
module RLSL
|
|
22
|
-
CACHE_DIR = File.
|
|
26
|
+
CACHE_DIR = File.join("rlsl", "compiled").freeze
|
|
23
27
|
|
|
24
28
|
class << self
|
|
25
29
|
def define(name, &block)
|
|
@@ -30,6 +34,10 @@ module RLSL
|
|
|
30
34
|
build_shader(name, &block).build_metal_shader
|
|
31
35
|
end
|
|
32
36
|
|
|
37
|
+
def to_msl(name, &block)
|
|
38
|
+
define_metal(name, &block).msl_source
|
|
39
|
+
end
|
|
40
|
+
|
|
33
41
|
def to_wgsl(name, &block)
|
|
34
42
|
build_shader(name, &block).build_wgsl_shader
|
|
35
43
|
end
|
|
@@ -40,13 +48,26 @@ module RLSL
|
|
|
40
48
|
|
|
41
49
|
def cache_dir
|
|
42
50
|
@cache_dir ||= begin
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
path = File.join(cache_root, CACHE_DIR)
|
|
52
|
+
FileUtils.mkdir_p(path)
|
|
53
|
+
path
|
|
45
54
|
end
|
|
46
55
|
end
|
|
47
56
|
|
|
48
57
|
private
|
|
49
58
|
|
|
59
|
+
def cache_root
|
|
60
|
+
xdg_cache_home = ENV["XDG_CACHE_HOME"]
|
|
61
|
+
return xdg_cache_home unless xdg_cache_home.to_s.empty?
|
|
62
|
+
|
|
63
|
+
home = Dir.home
|
|
64
|
+
return File.join(home, ".cache") unless home.to_s.empty?
|
|
65
|
+
|
|
66
|
+
Dir.tmpdir
|
|
67
|
+
rescue ArgumentError
|
|
68
|
+
Dir.tmpdir
|
|
69
|
+
end
|
|
70
|
+
|
|
50
71
|
def build_shader(name, &block)
|
|
51
72
|
builder = ShaderBuilder.new(name)
|
|
52
73
|
builder.instance_eval(&block)
|
metadata
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rlsl
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yudai Takada
|
|
8
|
+
autorequire:
|
|
8
9
|
bindir: bin
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
+
date: 2026-09-25 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: prism
|
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
|
15
16
|
requirements:
|
|
16
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
17
18
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '0'
|
|
19
|
+
version: '1.0'
|
|
19
20
|
type: :runtime
|
|
20
21
|
prerelease: false
|
|
21
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
23
|
requirements:
|
|
23
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
24
25
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '0'
|
|
26
|
+
version: '1.0'
|
|
26
27
|
description: RLSL is a Ruby DSL for writing shaders that can be transpiled to GLSL,
|
|
27
28
|
WGSL, and MSL
|
|
28
29
|
email:
|
|
@@ -31,6 +32,7 @@ executables: []
|
|
|
31
32
|
extensions: []
|
|
32
33
|
extra_rdoc_files: []
|
|
33
34
|
files:
|
|
35
|
+
- ".rubocop.yml"
|
|
34
36
|
- CHANGELOG.md
|
|
35
37
|
- LICENSE
|
|
36
38
|
- README.md
|
|
@@ -47,6 +49,7 @@ files:
|
|
|
47
49
|
- lib/rlsl/code_generator/template_context.rb
|
|
48
50
|
- lib/rlsl/code_generator/uniform_struct_generator.rb
|
|
49
51
|
- lib/rlsl/compiled_shader.rb
|
|
52
|
+
- lib/rlsl/errors.rb
|
|
50
53
|
- lib/rlsl/function_context.rb
|
|
51
54
|
- lib/rlsl/glsl/translator.rb
|
|
52
55
|
- lib/rlsl/msl/shader.rb
|
|
@@ -74,12 +77,17 @@ files:
|
|
|
74
77
|
- lib/rlsl/prism/emitters/target_emitter.rb
|
|
75
78
|
- lib/rlsl/prism/emitters/target_profile.rb
|
|
76
79
|
- lib/rlsl/prism/emitters/wgsl_emitter.rb
|
|
80
|
+
- lib/rlsl/prism/errors.rb
|
|
77
81
|
- lib/rlsl/prism/ir/control_flow.rb
|
|
78
82
|
- lib/rlsl/prism/ir/definitions.rb
|
|
79
83
|
- lib/rlsl/prism/ir/expressions.rb
|
|
80
84
|
- lib/rlsl/prism/ir/node.rb
|
|
81
85
|
- lib/rlsl/prism/ir/nodes.rb
|
|
82
86
|
- lib/rlsl/prism/ir/traversal.rb
|
|
87
|
+
- lib/rlsl/prism/mutation_analyzer.rb
|
|
88
|
+
- lib/rlsl/prism/node_traversal.rb
|
|
89
|
+
- lib/rlsl/prism/parameter_list.rb
|
|
90
|
+
- lib/rlsl/prism/return_flow_validator.rb
|
|
83
91
|
- lib/rlsl/prism/source_extractor.rb
|
|
84
92
|
- lib/rlsl/prism/source_extractor/block_locator.rb
|
|
85
93
|
- lib/rlsl/prism/source_unit.rb
|
|
@@ -104,6 +112,7 @@ files:
|
|
|
104
112
|
- lib/rlsl/shader_builder/native_extension_compiler.rb
|
|
105
113
|
- lib/rlsl/shader_builder/shader_definition.rb
|
|
106
114
|
- lib/rlsl/shader_builder/source_resolver.rb
|
|
115
|
+
- lib/rlsl/shader_name.rb
|
|
107
116
|
- lib/rlsl/types.rb
|
|
108
117
|
- lib/rlsl/types/catalog.rb
|
|
109
118
|
- lib/rlsl/types/target_resolver.rb
|
|
@@ -112,13 +121,15 @@ files:
|
|
|
112
121
|
- lib/rlsl/uniform_context.rb
|
|
113
122
|
- lib/rlsl/version.rb
|
|
114
123
|
- lib/rlsl/wgsl/translator.rb
|
|
115
|
-
|
|
124
|
+
- lib/rlsl/wgsl/uniform_layout.rb
|
|
125
|
+
homepage: https://rbgfx.github.io/rlsl/
|
|
116
126
|
licenses:
|
|
117
127
|
- MIT
|
|
118
128
|
metadata:
|
|
119
|
-
homepage_uri: https://github.
|
|
120
|
-
source_code_uri: https://github.com/
|
|
121
|
-
changelog_uri: https://github.com/
|
|
129
|
+
homepage_uri: https://rbgfx.github.io/rlsl/
|
|
130
|
+
source_code_uri: https://github.com/rbgfx/rlsl
|
|
131
|
+
changelog_uri: https://github.com/rbgfx/rlsl/blob/main/CHANGELOG.md
|
|
132
|
+
post_install_message:
|
|
122
133
|
rdoc_options: []
|
|
123
134
|
require_paths:
|
|
124
135
|
- lib
|
|
@@ -133,7 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
133
144
|
- !ruby/object:Gem::Version
|
|
134
145
|
version: '0'
|
|
135
146
|
requirements: []
|
|
136
|
-
rubygems_version: 4.
|
|
147
|
+
rubygems_version: 3.4.19
|
|
148
|
+
signing_key:
|
|
137
149
|
specification_version: 4
|
|
138
150
|
summary: Ruby Like Shading Language - A shader DSL for Ruby
|
|
139
151
|
test_files: []
|