rlsl 0.1.1 → 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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/CHANGELOG.md +13 -2
  4. data/README.md +101 -26
  5. data/Rakefile +7 -0
  6. data/lib/rlsl/base_translator/call_parser.rb +79 -0
  7. data/lib/rlsl/base_translator/code_rewriter.rb +107 -0
  8. data/lib/rlsl/base_translator/code_scanner.rb +140 -0
  9. data/lib/rlsl/base_translator.rb +182 -64
  10. data/lib/rlsl/code_generator/math_prelude.rb +172 -0
  11. data/lib/rlsl/code_generator/ruby_wrapper_generator.rb +137 -0
  12. data/lib/rlsl/code_generator/shader_function_generator.rb +19 -0
  13. data/lib/rlsl/code_generator/template_context.rb +44 -0
  14. data/lib/rlsl/code_generator/uniform_struct_generator.rb +29 -0
  15. data/lib/rlsl/code_generator.rb +30 -202
  16. data/lib/rlsl/compiled_shader.rb +5 -13
  17. data/lib/rlsl/errors.rb +29 -0
  18. data/lib/rlsl/function_context.rb +31 -14
  19. data/lib/rlsl/glsl/translator.rb +35 -41
  20. data/lib/rlsl/msl/shader.rb +34 -46
  21. data/lib/rlsl/msl/translator.rb +38 -34
  22. data/lib/rlsl/msl/uniform_buffer_packer.rb +72 -0
  23. data/lib/rlsl/prism/ast_visitor/control_flow_visiting.rb +137 -0
  24. data/lib/rlsl/prism/ast_visitor/definition_visiting.rb +92 -0
  25. data/lib/rlsl/prism/ast_visitor/expression_visiting.rb +172 -0
  26. data/lib/rlsl/prism/ast_visitor/scope_context.rb +48 -0
  27. data/lib/rlsl/prism/ast_visitor/visitor_registry.rb +21 -0
  28. data/lib/rlsl/prism/ast_visitor.rb +100 -286
  29. data/lib/rlsl/prism/builtins/function_registry.rb +131 -0
  30. data/lib/rlsl/prism/builtins/operator_rules.rb +123 -0
  31. data/lib/rlsl/prism/builtins/swizzle_rules.rb +47 -0
  32. data/lib/rlsl/prism/builtins.rb +39 -148
  33. data/lib/rlsl/prism/compilation_unit.rb +7 -0
  34. data/lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb +126 -0
  35. data/lib/rlsl/prism/emitters/base_emitter/definition_emission.rb +134 -0
  36. data/lib/rlsl/prism/emitters/base_emitter/expression_emission.rb +108 -0
  37. data/lib/rlsl/prism/emitters/base_emitter/statement_emission.rb +95 -0
  38. data/lib/rlsl/prism/emitters/base_emitter.rb +120 -414
  39. data/lib/rlsl/prism/emitters/c_emitter.rb +165 -112
  40. data/lib/rlsl/prism/emitters/glsl_emitter.rb +63 -50
  41. data/lib/rlsl/prism/emitters/msl_emitter.rb +67 -52
  42. data/lib/rlsl/prism/emitters/target_emitter.rb +124 -0
  43. data/lib/rlsl/prism/emitters/target_profile.rb +34 -0
  44. data/lib/rlsl/prism/emitters/wgsl_emitter.rb +217 -58
  45. data/lib/rlsl/prism/errors.rb +9 -0
  46. data/lib/rlsl/prism/ir/control_flow.rb +85 -0
  47. data/lib/rlsl/prism/ir/definitions.rb +82 -0
  48. data/lib/rlsl/prism/ir/expressions.rb +201 -0
  49. data/lib/rlsl/prism/ir/node.rb +21 -0
  50. data/lib/rlsl/prism/ir/nodes.rb +4 -371
  51. data/lib/rlsl/prism/ir/traversal.rb +66 -0
  52. data/lib/rlsl/prism/mutation_analyzer.rb +30 -0
  53. data/lib/rlsl/prism/node_traversal.rb +41 -0
  54. data/lib/rlsl/prism/parameter_list.rb +46 -0
  55. data/lib/rlsl/prism/return_flow_validator.rb +73 -0
  56. data/lib/rlsl/prism/source_extractor/block_locator.rb +50 -0
  57. data/lib/rlsl/prism/source_extractor.rb +19 -137
  58. data/lib/rlsl/prism/source_unit/parser.rb +88 -0
  59. data/lib/rlsl/prism/source_unit.rb +42 -0
  60. data/lib/rlsl/prism/target_capability_validator.rb +110 -0
  61. data/lib/rlsl/prism/transpiler.rb +99 -59
  62. data/lib/rlsl/prism/type_inference/call_type_resolver.rb +59 -0
  63. data/lib/rlsl/prism/type_inference/call_validator.rb +75 -0
  64. data/lib/rlsl/prism/type_inference/collection_type_resolver.rb +106 -0
  65. data/lib/rlsl/prism/type_inference/control_flow_inferer.rb +147 -0
  66. data/lib/rlsl/prism/type_inference/definition_inferer.rb +56 -0
  67. data/lib/rlsl/prism/type_inference/expression_inferer.rb +96 -0
  68. data/lib/rlsl/prism/type_inference/field_type_resolver.rb +38 -0
  69. data/lib/rlsl/prism/type_inference/inferer_registry.rb +38 -0
  70. data/lib/rlsl/prism/type_inference/scope_stack.rb +47 -0
  71. data/lib/rlsl/prism/type_inference/type_environment.rb +112 -0
  72. data/lib/rlsl/prism/type_inference/type_shapes.rb +33 -0
  73. data/lib/rlsl/prism/type_inference.rb +120 -249
  74. data/lib/rlsl/runtime_shader.rb +47 -0
  75. data/lib/rlsl/shader_builder/build_service.rb +104 -0
  76. data/lib/rlsl/shader_builder/native_extension_compiler.rb +97 -0
  77. data/lib/rlsl/shader_builder/shader_definition.rb +68 -0
  78. data/lib/rlsl/shader_builder/source_resolver.rb +109 -0
  79. data/lib/rlsl/shader_builder.rb +60 -111
  80. data/lib/rlsl/shader_name.rb +18 -0
  81. data/lib/rlsl/types/catalog.rb +47 -0
  82. data/lib/rlsl/types/target_resolver.rb +15 -0
  83. data/lib/rlsl/types/type_spec.rb +167 -0
  84. data/lib/rlsl/types/value_normalizer.rb +86 -0
  85. data/lib/rlsl/types.rb +9 -31
  86. data/lib/rlsl/uniform_context.rb +22 -11
  87. data/lib/rlsl/version.rb +1 -1
  88. data/lib/rlsl/wgsl/translator.rb +46 -39
  89. data/lib/rlsl/wgsl/uniform_layout.rb +25 -0
  90. data/lib/rlsl.rb +38 -15
  91. metadata +76 -11
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RLSL
4
+ module UniformTypes
5
+ module ValueNormalizer
6
+ def normalize_values(uniform_types, uniforms, shader_name: nil)
7
+ uniform_types.each_with_object({}) do |(name, type), normalized|
8
+ unless uniforms.key?(name)
9
+ raise ArgumentError, missing_uniform_message(name, shader_name)
10
+ end
11
+
12
+ normalized[name] = normalize_value(type, uniforms[name], name: name, shader_name: shader_name)
13
+ end
14
+ end
15
+
16
+ def normalize_value(type, value, name:, shader_name: nil)
17
+ return value if type.nil?
18
+
19
+ spec = fetch(type)
20
+ raise UniformValueError, unsupported_runtime_type_message(type, shader_name) unless spec.runtime_supported?
21
+
22
+ case spec.wrapper_kind
23
+ when :float
24
+ Float(value)
25
+ when :int
26
+ normalize_int(value, name: name, shader_name: shader_name)
27
+ when :bool
28
+ normalize_bool(value, name: name, shader_name: shader_name)
29
+ when :vector
30
+ normalize_vector(value, spec.vector_size, name: name, shader_name: shader_name)
31
+ else
32
+ raise UniformValueError, unsupported_runtime_type_message(type, shader_name)
33
+ end
34
+ rescue UniformValueError
35
+ raise
36
+ rescue TypeError, ArgumentError, RangeError
37
+ raise UniformValueError, invalid_uniform_message(name, type, value, shader_name)
38
+ end
39
+
40
+ def normalize_bool(value, name:, shader_name: nil)
41
+ return value if value == true || value == false
42
+ return false if value == 0
43
+ return true if value == 1
44
+
45
+ raise UniformValueError, invalid_uniform_message(name, :bool, value, shader_name)
46
+ end
47
+
48
+ def normalize_int(value, name:, shader_name: nil)
49
+ integer = Integer(value)
50
+ return integer if (-2**31...2**31).cover?(integer)
51
+
52
+ raise UniformValueError, invalid_uniform_message(name, :int, value, shader_name)
53
+ end
54
+
55
+ def normalize_vector(value, vector_size, name:, shader_name: nil)
56
+ unless value.is_a?(Array) && value.length == vector_size
57
+ raise UniformValueError, invalid_vector_message(name, vector_size, value, shader_name)
58
+ end
59
+
60
+ value.map { |component| Float(component) }
61
+ end
62
+
63
+ private
64
+
65
+ def missing_uniform_message(name, shader_name)
66
+ "Missing uniform #{name.inspect}#{shader_suffix(shader_name)}"
67
+ end
68
+
69
+ def invalid_uniform_message(name, type, value, shader_name)
70
+ "Invalid value for uniform #{name.inspect}#{shader_suffix(shader_name)}: expected #{type}, got #{value.inspect}"
71
+ end
72
+
73
+ def invalid_vector_message(name, vector_size, value, shader_name)
74
+ "Invalid value for uniform #{name.inspect}#{shader_suffix(shader_name)}: expected vec#{vector_size}, got #{value.inspect}"
75
+ end
76
+
77
+ def unsupported_runtime_type_message(type, shader_name)
78
+ "Unsupported runtime uniform type #{type.inspect}#{shader_suffix(shader_name)}"
79
+ end
80
+
81
+ def shader_suffix(shader_name)
82
+ shader_name ? " in #{shader_name}" : ""
83
+ end
84
+ end
85
+ end
86
+ end
data/lib/rlsl/types.rb CHANGED
@@ -1,36 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module RLSL
4
- # C type definitions for the shader system
5
- C_TYPES = <<~C
6
- typedef struct { float x, y; } vec2;
7
- typedef struct { float x, y, z; } vec3;
8
- typedef struct { float x, y, z, w; } vec4;
9
- typedef struct { float m[4]; } mat2;
10
- typedef struct { float m[9]; } mat3;
11
- typedef struct { float m[16]; } mat4;
12
- typedef struct { void* data; int width; int height; } sampler2D;
13
-
14
- #define PI 3.14159265f
15
- #define TAU 6.28318530f
16
- C
3
+ require_relative "types/type_spec"
4
+ require_relative "types/catalog"
5
+ require_relative "types/target_resolver"
6
+ require_relative "types/value_normalizer"
17
7
 
18
- # Uniform type symbols
19
- UNIFORM_TYPES = %i[float vec2 vec3 vec4 int bool mat2 mat3 mat4 sampler2D].freeze
20
-
21
- # Type mapping helper
22
- module TypeMapping
23
- C_UNIFORM_TYPES = {
24
- float: "float",
25
- int: "int",
26
- bool: "int",
27
- vec2: "vec2",
28
- vec3: "vec3",
29
- vec4: "vec4",
30
- mat2: "mat2",
31
- mat3: "mat3",
32
- mat4: "mat4",
33
- sampler2D: "sampler2D"
34
- }.freeze
8
+ module RLSL
9
+ module UniformTypes
10
+ extend Catalog
11
+ extend TargetResolver
12
+ extend ValueNormalizer
35
13
  end
36
14
  end
@@ -3,26 +3,37 @@
3
3
  module RLSL
4
4
  # DSL context for defining uniform variables
5
5
  class UniformContext
6
+ RESERVED_NAMES = %i[resolution u frag_coord].freeze
7
+
6
8
  attr_reader :uniforms
7
9
 
8
10
  def initialize
9
11
  @uniforms = {}
10
12
  end
11
13
 
12
- def float(name)
13
- @uniforms[name] = :float
14
- end
15
-
16
- def vec2(name)
17
- @uniforms[name] = :vec2
18
- end
14
+ def define_uniform(name, type)
15
+ normalized_name = RLSL.validate_identifier!(name, context: "uniform name").to_sym
16
+ if RESERVED_NAMES.include?(normalized_name)
17
+ raise ArgumentError, "Uniform name #{normalized_name.inspect} is reserved by RLSL"
18
+ end
19
+ if @uniforms.key?(normalized_name)
20
+ raise ArgumentError, "Uniform #{normalized_name.inspect} is already defined"
21
+ end
22
+ generated_sampler_names = @uniforms.filter_map do |uniform_name, uniform_type|
23
+ :"#{uniform_name}_sampler" if uniform_type == :sampler2D
24
+ end
25
+ if generated_sampler_names.include?(normalized_name) ||
26
+ (type == :sampler2D && @uniforms.key?(:"#{normalized_name}_sampler"))
27
+ raise ArgumentError, "Uniform #{normalized_name.inspect} conflicts with a generated sampler name"
28
+ end
19
29
 
20
- def vec3(name)
21
- @uniforms[name] = :vec3
30
+ @uniforms[normalized_name] = type
22
31
  end
23
32
 
24
- def vec4(name)
25
- @uniforms[name] = :vec4
33
+ RLSL::UNIFORM_TYPES.each do |type|
34
+ define_method(type) do |name|
35
+ define_uniform(name, type)
36
+ end
26
37
  end
27
38
  end
28
39
  end
data/lib/rlsl/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RLSL
4
- VERSION = "0.1.1"
4
+ VERSION = "1.0.1"
5
5
  end
@@ -3,46 +3,53 @@
3
3
  module RLSL
4
4
  module WGSL
5
5
  class Translator < BaseTranslator
6
- TYPE_MAP = {
7
- "vec2" => "vec2<f32>",
8
- "vec3" => "vec3<f32>",
9
- "vec4" => "vec4<f32>"
10
- }.freeze
11
-
12
- FUNC_REPLACEMENTS = BaseTranslator.common_func_replacements(
13
- target_vec2: "vec2<f32>",
14
- target_vec3: "vec3<f32>",
15
- target_vec4: "vec4<f32>"
16
- ).freeze
6
+ PROFILE = BaseTranslator.build_profile(
7
+ uniform_target: :wgsl,
8
+ identifier_replacements: {
9
+ "float" => "f32",
10
+ "int" => "i32",
11
+ "vec2" => "vec2<f32>",
12
+ "vec3" => "vec3<f32>",
13
+ "vec4" => "vec4<f32>"
14
+ },
15
+ call_rewrites: BaseTranslator.common_call_rewrites(
16
+ target_vec2: "vec2<f32>",
17
+ target_vec3: "vec3<f32>",
18
+ target_vec4: "vec4<f32>"
19
+ ).merge("fmodf" => BaseTranslator.infix_call("%"))
20
+ )
17
21
 
18
22
  protected
19
23
 
20
- def translate_code(c_code)
21
- result = super(c_code)
22
- return result if result.empty?
24
+ def validate_source_format!(source)
25
+ return if source.target_code?
23
26
 
24
- result.gsub!(/\bstatic\s+/, "")
25
- result.gsub!(/\binline\s+/, "")
26
- result.gsub!(/\bfloat\b/, "f32")
27
- result
27
+ raise RLSL::TranslationError,
28
+ "WGSL generation only supports Ruby shader source; legacy C source cannot be translated to WGSL"
28
29
  end
29
30
 
30
31
  def generate_shader(helpers, fragment)
31
32
  <<~WGSL
32
- // WGSL Shader generated by RLSL
33
+ #{generated_by_comment("WGSL")}
33
34
 
34
35
  struct Uniforms {
35
36
  #{generate_uniform_struct}
36
- };
37
+ }
37
38
 
38
39
  @group(0) @binding(0) var<uniform> u: Uniforms;
39
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
+ }
40
46
 
41
47
  #{helpers}
42
48
 
43
- fn shader_fragment(frag_coord: vec2<f32>, resolution: vec2<f32>) -> vec3<f32> {
44
- let uv = frag_coord / resolution.y;
45
- #{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)}
46
53
  }
47
54
 
48
55
  @compute @workgroup_size(8, 8)
@@ -64,29 +71,29 @@ module RLSL
64
71
 
65
72
  private
66
73
 
67
- def generate_uniform_struct
68
- fields = ["resolution: vec2<f32>,"]
69
- @uniforms.each do |name, type|
70
- wgsl_type = uniform_type_to_target(type)
71
- fields << "#{name}: #{wgsl_type},"
72
- end
73
- fields.join("\n ")
74
+ def profile
75
+ PROFILE
74
76
  end
75
77
 
76
78
  def target_float_type
77
- "f32"
79
+ UniformTypes.target_type(:float, uniform_target)
78
80
  end
79
81
 
80
- def target_vec2_type
81
- "vec2<f32>"
82
- end
83
-
84
- def target_vec3_type
85
- "vec3<f32>"
82
+ def generate_uniform_struct
83
+ fields = uniform_lines(resolution_line: "resolution: #{target_vec2_type},") do |name, wgsl_type|
84
+ "#{name}: #{wgsl_type},"
85
+ end
86
+ fields.join("\n ")
86
87
  end
87
88
 
88
- def target_vec4_type
89
- "vec4<f32>"
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")
90
97
  end
91
98
  end
92
99
  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,55 +1,78 @@
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"
9
12
  require_relative "rlsl/code_generator"
13
+ require_relative "rlsl/runtime_shader"
10
14
  require_relative "rlsl/compiled_shader"
11
15
  require_relative "rlsl/base_translator"
12
16
  require_relative "rlsl/msl/translator"
17
+ require_relative "rlsl/msl/uniform_buffer_packer"
13
18
  require_relative "rlsl/msl/shader"
14
19
  require_relative "rlsl/wgsl/translator"
20
+ require_relative "rlsl/wgsl/uniform_layout"
15
21
  require_relative "rlsl/glsl/translator"
16
22
  require_relative "rlsl/prism/transpiler"
17
23
  require_relative "rlsl/shader_builder"
18
24
 
19
25
  module RLSL
20
- CACHE_DIR = File.expand_path("~/.cache/rlsl/compiled")
26
+ CACHE_DIR = File.join("rlsl", "compiled").freeze
21
27
 
22
28
  class << self
23
29
  def define(name, &block)
24
- builder = ShaderBuilder.new(name)
25
- builder.instance_eval(&block)
26
- builder.compile_and_load
30
+ build_shader(name, &block).compile_and_load
27
31
  end
28
32
 
29
33
  def define_metal(name, &block)
30
- builder = ShaderBuilder.new(name)
31
- builder.instance_eval(&block)
32
- builder.build_metal_shader
34
+ build_shader(name, &block).build_metal_shader
35
+ end
36
+
37
+ def to_msl(name, &block)
38
+ define_metal(name, &block).msl_source
33
39
  end
34
40
 
35
41
  def to_wgsl(name, &block)
36
- builder = ShaderBuilder.new(name)
37
- builder.instance_eval(&block)
38
- builder.build_wgsl_shader
42
+ build_shader(name, &block).build_wgsl_shader
39
43
  end
40
44
 
41
45
  def to_glsl(name, version: "450", &block)
42
- builder = ShaderBuilder.new(name)
43
- builder.instance_eval(&block)
44
- builder.build_glsl_shader(version: version)
46
+ build_shader(name, &block).build_glsl_shader(version: version)
45
47
  end
46
48
 
47
49
  def cache_dir
48
50
  @cache_dir ||= begin
49
- FileUtils.mkdir_p(CACHE_DIR)
50
- CACHE_DIR
51
+ path = File.join(cache_root, CACHE_DIR)
52
+ FileUtils.mkdir_p(path)
53
+ path
51
54
  end
52
55
  end
56
+
57
+ private
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
+
71
+ def build_shader(name, &block)
72
+ builder = ShaderBuilder.new(name)
73
+ builder.instance_eval(&block)
74
+ builder
75
+ end
53
76
  end
54
77
 
55
78
  module CompiledShaders
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: 0.1.1
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,41 +32,104 @@ 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
37
39
  - Rakefile
38
40
  - lib/rlsl.rb
39
41
  - lib/rlsl/base_translator.rb
42
+ - lib/rlsl/base_translator/call_parser.rb
43
+ - lib/rlsl/base_translator/code_rewriter.rb
44
+ - lib/rlsl/base_translator/code_scanner.rb
40
45
  - lib/rlsl/code_generator.rb
46
+ - lib/rlsl/code_generator/math_prelude.rb
47
+ - lib/rlsl/code_generator/ruby_wrapper_generator.rb
48
+ - lib/rlsl/code_generator/shader_function_generator.rb
49
+ - lib/rlsl/code_generator/template_context.rb
50
+ - lib/rlsl/code_generator/uniform_struct_generator.rb
41
51
  - lib/rlsl/compiled_shader.rb
52
+ - lib/rlsl/errors.rb
42
53
  - lib/rlsl/function_context.rb
43
54
  - lib/rlsl/glsl/translator.rb
44
55
  - lib/rlsl/msl/shader.rb
45
56
  - lib/rlsl/msl/translator.rb
57
+ - lib/rlsl/msl/uniform_buffer_packer.rb
46
58
  - lib/rlsl/prism/ast_visitor.rb
59
+ - lib/rlsl/prism/ast_visitor/control_flow_visiting.rb
60
+ - lib/rlsl/prism/ast_visitor/definition_visiting.rb
61
+ - lib/rlsl/prism/ast_visitor/expression_visiting.rb
62
+ - lib/rlsl/prism/ast_visitor/scope_context.rb
63
+ - lib/rlsl/prism/ast_visitor/visitor_registry.rb
47
64
  - lib/rlsl/prism/builtins.rb
65
+ - lib/rlsl/prism/builtins/function_registry.rb
66
+ - lib/rlsl/prism/builtins/operator_rules.rb
67
+ - lib/rlsl/prism/builtins/swizzle_rules.rb
68
+ - lib/rlsl/prism/compilation_unit.rb
48
69
  - lib/rlsl/prism/emitters/base_emitter.rb
70
+ - lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb
71
+ - lib/rlsl/prism/emitters/base_emitter/definition_emission.rb
72
+ - lib/rlsl/prism/emitters/base_emitter/expression_emission.rb
73
+ - lib/rlsl/prism/emitters/base_emitter/statement_emission.rb
49
74
  - lib/rlsl/prism/emitters/c_emitter.rb
50
75
  - lib/rlsl/prism/emitters/glsl_emitter.rb
51
76
  - lib/rlsl/prism/emitters/msl_emitter.rb
77
+ - lib/rlsl/prism/emitters/target_emitter.rb
78
+ - lib/rlsl/prism/emitters/target_profile.rb
52
79
  - lib/rlsl/prism/emitters/wgsl_emitter.rb
80
+ - lib/rlsl/prism/errors.rb
81
+ - lib/rlsl/prism/ir/control_flow.rb
82
+ - lib/rlsl/prism/ir/definitions.rb
83
+ - lib/rlsl/prism/ir/expressions.rb
84
+ - lib/rlsl/prism/ir/node.rb
53
85
  - lib/rlsl/prism/ir/nodes.rb
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
54
91
  - lib/rlsl/prism/source_extractor.rb
92
+ - lib/rlsl/prism/source_extractor/block_locator.rb
93
+ - lib/rlsl/prism/source_unit.rb
94
+ - lib/rlsl/prism/source_unit/parser.rb
95
+ - lib/rlsl/prism/target_capability_validator.rb
55
96
  - lib/rlsl/prism/transpiler.rb
56
97
  - lib/rlsl/prism/type_inference.rb
98
+ - lib/rlsl/prism/type_inference/call_type_resolver.rb
99
+ - lib/rlsl/prism/type_inference/call_validator.rb
100
+ - lib/rlsl/prism/type_inference/collection_type_resolver.rb
101
+ - lib/rlsl/prism/type_inference/control_flow_inferer.rb
102
+ - lib/rlsl/prism/type_inference/definition_inferer.rb
103
+ - lib/rlsl/prism/type_inference/expression_inferer.rb
104
+ - lib/rlsl/prism/type_inference/field_type_resolver.rb
105
+ - lib/rlsl/prism/type_inference/inferer_registry.rb
106
+ - lib/rlsl/prism/type_inference/scope_stack.rb
107
+ - lib/rlsl/prism/type_inference/type_environment.rb
108
+ - lib/rlsl/prism/type_inference/type_shapes.rb
109
+ - lib/rlsl/runtime_shader.rb
57
110
  - lib/rlsl/shader_builder.rb
111
+ - lib/rlsl/shader_builder/build_service.rb
112
+ - lib/rlsl/shader_builder/native_extension_compiler.rb
113
+ - lib/rlsl/shader_builder/shader_definition.rb
114
+ - lib/rlsl/shader_builder/source_resolver.rb
115
+ - lib/rlsl/shader_name.rb
58
116
  - lib/rlsl/types.rb
117
+ - lib/rlsl/types/catalog.rb
118
+ - lib/rlsl/types/target_resolver.rb
119
+ - lib/rlsl/types/type_spec.rb
120
+ - lib/rlsl/types/value_normalizer.rb
59
121
  - lib/rlsl/uniform_context.rb
60
122
  - lib/rlsl/version.rb
61
123
  - lib/rlsl/wgsl/translator.rb
62
- homepage: https://github.com/ydah/rlsl
124
+ - lib/rlsl/wgsl/uniform_layout.rb
125
+ homepage: https://rbgfx.github.io/rlsl/
63
126
  licenses:
64
127
  - MIT
65
128
  metadata:
66
- homepage_uri: https://github.com/ydah/rlsl
67
- source_code_uri: https://github.com/ydah/rlsl
68
- 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:
69
133
  rdoc_options: []
70
134
  require_paths:
71
135
  - lib
@@ -80,7 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
144
  - !ruby/object:Gem::Version
81
145
  version: '0'
82
146
  requirements: []
83
- rubygems_version: 4.0.3
147
+ rubygems_version: 3.4.19
148
+ signing_key:
84
149
  specification_version: 4
85
150
  summary: Ruby Like Shading Language - A shader DSL for Ruby
86
151
  test_files: []