rlsl 0.1.0 → 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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -1
  3. data/README.md +18 -1
  4. data/lib/rlsl/base_translator/call_parser.rb +68 -0
  5. data/lib/rlsl/base_translator/code_rewriter.rb +107 -0
  6. data/lib/rlsl/base_translator/code_scanner.rb +102 -0
  7. data/lib/rlsl/base_translator.rb +159 -63
  8. data/lib/rlsl/code_generator/math_prelude.rb +79 -0
  9. data/lib/rlsl/code_generator/ruby_wrapper_generator.rb +97 -0
  10. data/lib/rlsl/code_generator/shader_function_generator.rb +19 -0
  11. data/lib/rlsl/code_generator/template_context.rb +41 -0
  12. data/lib/rlsl/code_generator/uniform_struct_generator.rb +29 -0
  13. data/lib/rlsl/code_generator.rb +26 -201
  14. data/lib/rlsl/compiled_shader.rb +4 -12
  15. data/lib/rlsl/function_context.rb +31 -14
  16. data/lib/rlsl/glsl/translator.rb +19 -38
  17. data/lib/rlsl/msl/shader.rb +8 -38
  18. data/lib/rlsl/msl/translator.rb +19 -36
  19. data/lib/rlsl/msl/uniform_buffer_packer.rb +68 -0
  20. data/lib/rlsl/prism/ast_visitor/control_flow_visiting.rb +96 -0
  21. data/lib/rlsl/prism/ast_visitor/definition_visiting.rb +79 -0
  22. data/lib/rlsl/prism/ast_visitor/expression_visiting.rb +168 -0
  23. data/lib/rlsl/prism/ast_visitor/scope_context.rb +44 -0
  24. data/lib/rlsl/prism/ast_visitor/visitor_registry.rb +21 -0
  25. data/lib/rlsl/prism/ast_visitor.rb +54 -298
  26. data/lib/rlsl/prism/builtins/function_registry.rb +114 -0
  27. data/lib/rlsl/prism/builtins/operator_rules.rb +99 -0
  28. data/lib/rlsl/prism/builtins/swizzle_rules.rb +38 -0
  29. data/lib/rlsl/prism/builtins.rb +31 -148
  30. data/lib/rlsl/prism/compilation_unit.rb +7 -0
  31. data/lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb +83 -0
  32. data/lib/rlsl/prism/emitters/base_emitter/definition_emission.rb +104 -0
  33. data/lib/rlsl/prism/emitters/base_emitter/expression_emission.rb +92 -0
  34. data/lib/rlsl/prism/emitters/base_emitter/statement_emission.rb +89 -0
  35. data/lib/rlsl/prism/emitters/base_emitter.rb +68 -423
  36. data/lib/rlsl/prism/emitters/c_emitter.rb +78 -121
  37. data/lib/rlsl/prism/emitters/glsl_emitter.rb +30 -65
  38. data/lib/rlsl/prism/emitters/msl_emitter.rb +35 -62
  39. data/lib/rlsl/prism/emitters/target_emitter.rb +77 -0
  40. data/lib/rlsl/prism/emitters/target_profile.rb +34 -0
  41. data/lib/rlsl/prism/emitters/wgsl_emitter.rb +65 -61
  42. data/lib/rlsl/prism/ir/control_flow.rb +83 -0
  43. data/lib/rlsl/prism/ir/definitions.rb +67 -0
  44. data/lib/rlsl/prism/ir/expressions.rb +197 -0
  45. data/lib/rlsl/prism/ir/node.rb +21 -0
  46. data/lib/rlsl/prism/ir/nodes.rb +4 -371
  47. data/lib/rlsl/prism/ir/traversal.rb +62 -0
  48. data/lib/rlsl/prism/source_extractor/block_locator.rb +52 -0
  49. data/lib/rlsl/prism/source_extractor.rb +14 -133
  50. data/lib/rlsl/prism/source_unit/parser.rb +78 -0
  51. data/lib/rlsl/prism/source_unit.rb +42 -0
  52. data/lib/rlsl/prism/target_capability_validator.rb +85 -0
  53. data/lib/rlsl/prism/transpiler.rb +63 -60
  54. data/lib/rlsl/prism/type_inference/call_type_resolver.rb +35 -0
  55. data/lib/rlsl/prism/type_inference/call_validator.rb +71 -0
  56. data/lib/rlsl/prism/type_inference/collection_type_resolver.rb +80 -0
  57. data/lib/rlsl/prism/type_inference/control_flow_inferer.rb +66 -0
  58. data/lib/rlsl/prism/type_inference/definition_inferer.rb +41 -0
  59. data/lib/rlsl/prism/type_inference/expression_inferer.rb +92 -0
  60. data/lib/rlsl/prism/type_inference/field_type_resolver.rb +17 -0
  61. data/lib/rlsl/prism/type_inference/inferer_registry.rb +38 -0
  62. data/lib/rlsl/prism/type_inference/scope_stack.rb +47 -0
  63. data/lib/rlsl/prism/type_inference/type_environment.rb +112 -0
  64. data/lib/rlsl/prism/type_inference/type_shapes.rb +33 -0
  65. data/lib/rlsl/prism/type_inference.rb +114 -248
  66. data/lib/rlsl/runtime_shader.rb +47 -0
  67. data/lib/rlsl/shader_builder/build_service.rb +77 -0
  68. data/lib/rlsl/shader_builder/native_extension_compiler.rb +71 -0
  69. data/lib/rlsl/shader_builder/shader_definition.rb +68 -0
  70. data/lib/rlsl/shader_builder/source_resolver.rb +91 -0
  71. data/lib/rlsl/shader_builder.rb +22 -113
  72. data/lib/rlsl/types/catalog.rb +47 -0
  73. data/lib/rlsl/types/target_resolver.rb +15 -0
  74. data/lib/rlsl/types/type_spec.rb +167 -0
  75. data/lib/rlsl/types/value_normalizer.rb +81 -0
  76. data/lib/rlsl/types.rb +11 -29
  77. data/lib/rlsl/uniform_context.rb +6 -12
  78. data/lib/rlsl/version.rb +1 -1
  79. data/lib/rlsl/wgsl/translator.rb +23 -39
  80. data/lib/rlsl.rb +14 -12
  81. metadata +55 -16
@@ -3,30 +3,24 @@
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
+ )
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?
23
-
24
- result.gsub!(/\bstatic\s+/, "")
25
- result.gsub!(/\binline\s+/, "")
26
- result.gsub!(/\bfloat\b/, "f32")
27
- result
28
- end
29
-
30
24
  def generate_shader(helpers, fragment)
31
25
  <<~WGSL
32
26
  // WGSL Shader generated by RLSL
@@ -64,29 +58,19 @@ module RLSL
64
58
 
65
59
  private
66
60
 
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 ")
61
+ def profile
62
+ PROFILE
74
63
  end
75
64
 
76
65
  def target_float_type
77
- "f32"
66
+ UniformTypes.target_type(:float, uniform_target)
78
67
  end
79
68
 
80
- def target_vec2_type
81
- "vec2<f32>"
82
- end
83
-
84
- def target_vec3_type
85
- "vec3<f32>"
86
- end
87
-
88
- def target_vec4_type
89
- "vec4<f32>"
69
+ def generate_uniform_struct
70
+ fields = uniform_lines(resolution_line: "resolution: #{target_vec2_type},") do |name, wgsl_type|
71
+ "#{name}: #{wgsl_type},"
72
+ end
73
+ fields.join("\n ")
90
74
  end
91
75
  end
92
76
  end
data/lib/rlsl.rb CHANGED
@@ -7,9 +7,11 @@ require_relative "rlsl/types"
7
7
  require_relative "rlsl/uniform_context"
8
8
  require_relative "rlsl/function_context"
9
9
  require_relative "rlsl/code_generator"
10
+ require_relative "rlsl/runtime_shader"
10
11
  require_relative "rlsl/compiled_shader"
11
12
  require_relative "rlsl/base_translator"
12
13
  require_relative "rlsl/msl/translator"
14
+ require_relative "rlsl/msl/uniform_buffer_packer"
13
15
  require_relative "rlsl/msl/shader"
14
16
  require_relative "rlsl/wgsl/translator"
15
17
  require_relative "rlsl/glsl/translator"
@@ -21,27 +23,19 @@ module RLSL
21
23
 
22
24
  class << self
23
25
  def define(name, &block)
24
- builder = ShaderBuilder.new(name)
25
- builder.instance_eval(&block)
26
- builder.compile_and_load
26
+ build_shader(name, &block).compile_and_load
27
27
  end
28
28
 
29
29
  def define_metal(name, &block)
30
- builder = ShaderBuilder.new(name)
31
- builder.instance_eval(&block)
32
- builder.build_metal_shader
30
+ build_shader(name, &block).build_metal_shader
33
31
  end
34
32
 
35
33
  def to_wgsl(name, &block)
36
- builder = ShaderBuilder.new(name)
37
- builder.instance_eval(&block)
38
- builder.build_wgsl_shader
34
+ build_shader(name, &block).build_wgsl_shader
39
35
  end
40
36
 
41
37
  def to_glsl(name, version: "450", &block)
42
- builder = ShaderBuilder.new(name)
43
- builder.instance_eval(&block)
44
- builder.build_glsl_shader(version: version)
38
+ build_shader(name, &block).build_glsl_shader(version: version)
45
39
  end
46
40
 
47
41
  def cache_dir
@@ -50,6 +44,14 @@ module RLSL
50
44
  CACHE_DIR
51
45
  end
52
46
  end
47
+
48
+ private
49
+
50
+ def build_shader(name, &block)
51
+ builder = ShaderBuilder.new(name)
52
+ builder.instance_eval(&block)
53
+ builder
54
+ end
53
55
  end
54
56
 
55
57
  module CompiledShaders
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rlsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yudai Takada
@@ -23,20 +23,6 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '0'
26
- - !ruby/object:Gem::Dependency
27
- name: metaco
28
- requirement: !ruby/object:Gem::Requirement
29
- requirements:
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0'
40
26
  description: RLSL is a Ruby DSL for writing shaders that can be transpiled to GLSL,
41
27
  WGSL, and MSL
42
28
  email:
@@ -51,25 +37,78 @@ files:
51
37
  - Rakefile
52
38
  - lib/rlsl.rb
53
39
  - lib/rlsl/base_translator.rb
40
+ - lib/rlsl/base_translator/call_parser.rb
41
+ - lib/rlsl/base_translator/code_rewriter.rb
42
+ - lib/rlsl/base_translator/code_scanner.rb
54
43
  - lib/rlsl/code_generator.rb
44
+ - lib/rlsl/code_generator/math_prelude.rb
45
+ - lib/rlsl/code_generator/ruby_wrapper_generator.rb
46
+ - lib/rlsl/code_generator/shader_function_generator.rb
47
+ - lib/rlsl/code_generator/template_context.rb
48
+ - lib/rlsl/code_generator/uniform_struct_generator.rb
55
49
  - lib/rlsl/compiled_shader.rb
56
50
  - lib/rlsl/function_context.rb
57
51
  - lib/rlsl/glsl/translator.rb
58
52
  - lib/rlsl/msl/shader.rb
59
53
  - lib/rlsl/msl/translator.rb
54
+ - lib/rlsl/msl/uniform_buffer_packer.rb
60
55
  - lib/rlsl/prism/ast_visitor.rb
56
+ - lib/rlsl/prism/ast_visitor/control_flow_visiting.rb
57
+ - lib/rlsl/prism/ast_visitor/definition_visiting.rb
58
+ - lib/rlsl/prism/ast_visitor/expression_visiting.rb
59
+ - lib/rlsl/prism/ast_visitor/scope_context.rb
60
+ - lib/rlsl/prism/ast_visitor/visitor_registry.rb
61
61
  - lib/rlsl/prism/builtins.rb
62
+ - lib/rlsl/prism/builtins/function_registry.rb
63
+ - lib/rlsl/prism/builtins/operator_rules.rb
64
+ - lib/rlsl/prism/builtins/swizzle_rules.rb
65
+ - lib/rlsl/prism/compilation_unit.rb
62
66
  - lib/rlsl/prism/emitters/base_emitter.rb
67
+ - lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb
68
+ - lib/rlsl/prism/emitters/base_emitter/definition_emission.rb
69
+ - lib/rlsl/prism/emitters/base_emitter/expression_emission.rb
70
+ - lib/rlsl/prism/emitters/base_emitter/statement_emission.rb
63
71
  - lib/rlsl/prism/emitters/c_emitter.rb
64
72
  - lib/rlsl/prism/emitters/glsl_emitter.rb
65
73
  - lib/rlsl/prism/emitters/msl_emitter.rb
74
+ - lib/rlsl/prism/emitters/target_emitter.rb
75
+ - lib/rlsl/prism/emitters/target_profile.rb
66
76
  - lib/rlsl/prism/emitters/wgsl_emitter.rb
77
+ - lib/rlsl/prism/ir/control_flow.rb
78
+ - lib/rlsl/prism/ir/definitions.rb
79
+ - lib/rlsl/prism/ir/expressions.rb
80
+ - lib/rlsl/prism/ir/node.rb
67
81
  - lib/rlsl/prism/ir/nodes.rb
82
+ - lib/rlsl/prism/ir/traversal.rb
68
83
  - lib/rlsl/prism/source_extractor.rb
84
+ - lib/rlsl/prism/source_extractor/block_locator.rb
85
+ - lib/rlsl/prism/source_unit.rb
86
+ - lib/rlsl/prism/source_unit/parser.rb
87
+ - lib/rlsl/prism/target_capability_validator.rb
69
88
  - lib/rlsl/prism/transpiler.rb
70
89
  - lib/rlsl/prism/type_inference.rb
90
+ - lib/rlsl/prism/type_inference/call_type_resolver.rb
91
+ - lib/rlsl/prism/type_inference/call_validator.rb
92
+ - lib/rlsl/prism/type_inference/collection_type_resolver.rb
93
+ - lib/rlsl/prism/type_inference/control_flow_inferer.rb
94
+ - lib/rlsl/prism/type_inference/definition_inferer.rb
95
+ - lib/rlsl/prism/type_inference/expression_inferer.rb
96
+ - lib/rlsl/prism/type_inference/field_type_resolver.rb
97
+ - lib/rlsl/prism/type_inference/inferer_registry.rb
98
+ - lib/rlsl/prism/type_inference/scope_stack.rb
99
+ - lib/rlsl/prism/type_inference/type_environment.rb
100
+ - lib/rlsl/prism/type_inference/type_shapes.rb
101
+ - lib/rlsl/runtime_shader.rb
71
102
  - lib/rlsl/shader_builder.rb
103
+ - lib/rlsl/shader_builder/build_service.rb
104
+ - lib/rlsl/shader_builder/native_extension_compiler.rb
105
+ - lib/rlsl/shader_builder/shader_definition.rb
106
+ - lib/rlsl/shader_builder/source_resolver.rb
72
107
  - lib/rlsl/types.rb
108
+ - lib/rlsl/types/catalog.rb
109
+ - lib/rlsl/types/target_resolver.rb
110
+ - lib/rlsl/types/type_spec.rb
111
+ - lib/rlsl/types/value_normalizer.rb
73
112
  - lib/rlsl/uniform_context.rb
74
113
  - lib/rlsl/version.rb
75
114
  - lib/rlsl/wgsl/translator.rb
@@ -94,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
133
  - !ruby/object:Gem::Version
95
134
  version: '0'
96
135
  requirements: []
97
- rubygems_version: 4.0.3
136
+ rubygems_version: 4.0.6
98
137
  specification_version: 4
99
138
  summary: Ruby Like Shading Language - A shader DSL for Ruby
100
139
  test_files: []