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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/CHANGELOG.md +3 -1
  4. data/README.md +101 -28
  5. data/Rakefile +7 -0
  6. data/lib/rlsl/base_translator/call_parser.rb +13 -2
  7. data/lib/rlsl/base_translator/code_scanner.rb +39 -1
  8. data/lib/rlsl/base_translator.rb +24 -2
  9. data/lib/rlsl/code_generator/math_prelude.rb +103 -10
  10. data/lib/rlsl/code_generator/ruby_wrapper_generator.rb +52 -12
  11. data/lib/rlsl/code_generator/template_context.rb +6 -3
  12. data/lib/rlsl/code_generator/uniform_struct_generator.rb +1 -1
  13. data/lib/rlsl/code_generator.rb +7 -4
  14. data/lib/rlsl/compiled_shader.rb +1 -1
  15. data/lib/rlsl/errors.rb +29 -0
  16. data/lib/rlsl/glsl/translator.rb +19 -6
  17. data/lib/rlsl/msl/shader.rb +27 -9
  18. data/lib/rlsl/msl/translator.rb +25 -4
  19. data/lib/rlsl/msl/uniform_buffer_packer.rb +11 -7
  20. data/lib/rlsl/prism/ast_visitor/control_flow_visiting.rb +59 -18
  21. data/lib/rlsl/prism/ast_visitor/definition_visiting.rb +22 -9
  22. data/lib/rlsl/prism/ast_visitor/expression_visiting.rb +18 -14
  23. data/lib/rlsl/prism/ast_visitor/scope_context.rb +4 -0
  24. data/lib/rlsl/prism/ast_visitor.rb +78 -20
  25. data/lib/rlsl/prism/builtins/function_registry.rb +41 -24
  26. data/lib/rlsl/prism/builtins/operator_rules.rb +24 -0
  27. data/lib/rlsl/prism/builtins/swizzle_rules.rb +10 -1
  28. data/lib/rlsl/prism/builtins.rb +8 -0
  29. data/lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb +51 -8
  30. data/lib/rlsl/prism/emitters/base_emitter/definition_emission.rb +42 -12
  31. data/lib/rlsl/prism/emitters/base_emitter/expression_emission.rb +20 -4
  32. data/lib/rlsl/prism/emitters/base_emitter/statement_emission.rb +7 -1
  33. data/lib/rlsl/prism/emitters/base_emitter.rb +66 -5
  34. data/lib/rlsl/prism/emitters/c_emitter.rb +103 -7
  35. data/lib/rlsl/prism/emitters/glsl_emitter.rb +48 -0
  36. data/lib/rlsl/prism/emitters/msl_emitter.rb +43 -1
  37. data/lib/rlsl/prism/emitters/target_emitter.rb +56 -9
  38. data/lib/rlsl/prism/emitters/wgsl_emitter.rb +173 -18
  39. data/lib/rlsl/prism/errors.rb +9 -0
  40. data/lib/rlsl/prism/ir/control_flow.rb +6 -4
  41. data/lib/rlsl/prism/ir/definitions.rb +17 -2
  42. data/lib/rlsl/prism/ir/expressions.rb +5 -1
  43. data/lib/rlsl/prism/ir/node.rb +1 -1
  44. data/lib/rlsl/prism/ir/traversal.rb +6 -2
  45. data/lib/rlsl/prism/mutation_analyzer.rb +30 -0
  46. data/lib/rlsl/prism/node_traversal.rb +41 -0
  47. data/lib/rlsl/prism/parameter_list.rb +46 -0
  48. data/lib/rlsl/prism/return_flow_validator.rb +73 -0
  49. data/lib/rlsl/prism/source_extractor/block_locator.rb +23 -25
  50. data/lib/rlsl/prism/source_extractor.rb +7 -6
  51. data/lib/rlsl/prism/source_unit/parser.rb +42 -32
  52. data/lib/rlsl/prism/source_unit.rb +10 -10
  53. data/lib/rlsl/prism/target_capability_validator.rb +27 -2
  54. data/lib/rlsl/prism/transpiler.rb +40 -3
  55. data/lib/rlsl/prism/type_inference/call_type_resolver.rb +28 -4
  56. data/lib/rlsl/prism/type_inference/call_validator.rb +5 -1
  57. data/lib/rlsl/prism/type_inference/collection_type_resolver.rb +45 -19
  58. data/lib/rlsl/prism/type_inference/control_flow_inferer.rb +88 -7
  59. data/lib/rlsl/prism/type_inference/definition_inferer.rb +16 -1
  60. data/lib/rlsl/prism/type_inference/expression_inferer.rb +4 -0
  61. data/lib/rlsl/prism/type_inference/field_type_resolver.rb +23 -2
  62. data/lib/rlsl/prism/type_inference/scope_stack.rb +1 -1
  63. data/lib/rlsl/prism/type_inference/type_shapes.rb +3 -3
  64. data/lib/rlsl/prism/type_inference.rb +10 -5
  65. data/lib/rlsl/shader_builder/build_service.rb +34 -7
  66. data/lib/rlsl/shader_builder/native_extension_compiler.rb +50 -24
  67. data/lib/rlsl/shader_builder/shader_definition.rb +3 -3
  68. data/lib/rlsl/shader_builder/source_resolver.rb +19 -1
  69. data/lib/rlsl/shader_builder.rb +50 -10
  70. data/lib/rlsl/shader_name.rb +18 -0
  71. data/lib/rlsl/types/type_spec.rb +3 -3
  72. data/lib/rlsl/types/value_normalizer.rb +16 -11
  73. data/lib/rlsl/types.rb +0 -4
  74. data/lib/rlsl/uniform_context.rb +18 -1
  75. data/lib/rlsl/version.rb +1 -1
  76. data/lib/rlsl/wgsl/translator.rb +29 -6
  77. data/lib/rlsl/wgsl/uniform_layout.rb +25 -0
  78. data/lib/rlsl.rb +24 -3
  79. metadata +23 -11
@@ -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
- // WGSL Shader generated by RLSL
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(frag_coord: vec2<f32>, resolution: vec2<f32>) -> vec3<f32> {
38
- let uv = frag_coord / resolution.y;
39
- #{fragment}
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.expand_path("~/.cache/rlsl/compiled")
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
- FileUtils.mkdir_p(CACHE_DIR)
44
- CACHE_DIR
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.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: 1980-01-02 00:00:00.000000000 Z
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
- homepage: https://github.com/ydah/rlsl
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.com/ydah/rlsl
120
- source_code_uri: https://github.com/ydah/rlsl
121
- changelog_uri: https://github.com/ydah/rlsl/blob/main/CHANGELOG.md
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.0.6
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: []