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.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -0
- data/CHANGELOG.md +13 -2
- data/README.md +101 -26
- data/Rakefile +7 -0
- data/lib/rlsl/base_translator/call_parser.rb +79 -0
- data/lib/rlsl/base_translator/code_rewriter.rb +107 -0
- data/lib/rlsl/base_translator/code_scanner.rb +140 -0
- data/lib/rlsl/base_translator.rb +182 -64
- data/lib/rlsl/code_generator/math_prelude.rb +172 -0
- data/lib/rlsl/code_generator/ruby_wrapper_generator.rb +137 -0
- data/lib/rlsl/code_generator/shader_function_generator.rb +19 -0
- data/lib/rlsl/code_generator/template_context.rb +44 -0
- data/lib/rlsl/code_generator/uniform_struct_generator.rb +29 -0
- data/lib/rlsl/code_generator.rb +30 -202
- data/lib/rlsl/compiled_shader.rb +5 -13
- data/lib/rlsl/errors.rb +29 -0
- data/lib/rlsl/function_context.rb +31 -14
- data/lib/rlsl/glsl/translator.rb +35 -41
- data/lib/rlsl/msl/shader.rb +34 -46
- data/lib/rlsl/msl/translator.rb +38 -34
- data/lib/rlsl/msl/uniform_buffer_packer.rb +72 -0
- data/lib/rlsl/prism/ast_visitor/control_flow_visiting.rb +137 -0
- data/lib/rlsl/prism/ast_visitor/definition_visiting.rb +92 -0
- data/lib/rlsl/prism/ast_visitor/expression_visiting.rb +172 -0
- data/lib/rlsl/prism/ast_visitor/scope_context.rb +48 -0
- data/lib/rlsl/prism/ast_visitor/visitor_registry.rb +21 -0
- data/lib/rlsl/prism/ast_visitor.rb +100 -286
- data/lib/rlsl/prism/builtins/function_registry.rb +131 -0
- data/lib/rlsl/prism/builtins/operator_rules.rb +123 -0
- data/lib/rlsl/prism/builtins/swizzle_rules.rb +47 -0
- data/lib/rlsl/prism/builtins.rb +39 -148
- data/lib/rlsl/prism/compilation_unit.rb +7 -0
- data/lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb +126 -0
- data/lib/rlsl/prism/emitters/base_emitter/definition_emission.rb +134 -0
- data/lib/rlsl/prism/emitters/base_emitter/expression_emission.rb +108 -0
- data/lib/rlsl/prism/emitters/base_emitter/statement_emission.rb +95 -0
- data/lib/rlsl/prism/emitters/base_emitter.rb +120 -414
- data/lib/rlsl/prism/emitters/c_emitter.rb +165 -112
- data/lib/rlsl/prism/emitters/glsl_emitter.rb +63 -50
- data/lib/rlsl/prism/emitters/msl_emitter.rb +67 -52
- data/lib/rlsl/prism/emitters/target_emitter.rb +124 -0
- data/lib/rlsl/prism/emitters/target_profile.rb +34 -0
- data/lib/rlsl/prism/emitters/wgsl_emitter.rb +217 -58
- data/lib/rlsl/prism/errors.rb +9 -0
- data/lib/rlsl/prism/ir/control_flow.rb +85 -0
- data/lib/rlsl/prism/ir/definitions.rb +82 -0
- data/lib/rlsl/prism/ir/expressions.rb +201 -0
- data/lib/rlsl/prism/ir/node.rb +21 -0
- data/lib/rlsl/prism/ir/nodes.rb +4 -371
- data/lib/rlsl/prism/ir/traversal.rb +66 -0
- 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 +50 -0
- data/lib/rlsl/prism/source_extractor.rb +19 -137
- data/lib/rlsl/prism/source_unit/parser.rb +88 -0
- data/lib/rlsl/prism/source_unit.rb +42 -0
- data/lib/rlsl/prism/target_capability_validator.rb +110 -0
- data/lib/rlsl/prism/transpiler.rb +99 -59
- data/lib/rlsl/prism/type_inference/call_type_resolver.rb +59 -0
- data/lib/rlsl/prism/type_inference/call_validator.rb +75 -0
- data/lib/rlsl/prism/type_inference/collection_type_resolver.rb +106 -0
- data/lib/rlsl/prism/type_inference/control_flow_inferer.rb +147 -0
- data/lib/rlsl/prism/type_inference/definition_inferer.rb +56 -0
- data/lib/rlsl/prism/type_inference/expression_inferer.rb +96 -0
- data/lib/rlsl/prism/type_inference/field_type_resolver.rb +38 -0
- data/lib/rlsl/prism/type_inference/inferer_registry.rb +38 -0
- data/lib/rlsl/prism/type_inference/scope_stack.rb +47 -0
- data/lib/rlsl/prism/type_inference/type_environment.rb +112 -0
- data/lib/rlsl/prism/type_inference/type_shapes.rb +33 -0
- data/lib/rlsl/prism/type_inference.rb +120 -249
- data/lib/rlsl/runtime_shader.rb +47 -0
- data/lib/rlsl/shader_builder/build_service.rb +104 -0
- data/lib/rlsl/shader_builder/native_extension_compiler.rb +97 -0
- data/lib/rlsl/shader_builder/shader_definition.rb +68 -0
- data/lib/rlsl/shader_builder/source_resolver.rb +109 -0
- data/lib/rlsl/shader_builder.rb +60 -111
- data/lib/rlsl/shader_name.rb +18 -0
- data/lib/rlsl/types/catalog.rb +47 -0
- data/lib/rlsl/types/target_resolver.rb +15 -0
- data/lib/rlsl/types/type_spec.rb +167 -0
- data/lib/rlsl/types/value_normalizer.rb +86 -0
- data/lib/rlsl/types.rb +9 -31
- data/lib/rlsl/uniform_context.rb +22 -11
- data/lib/rlsl/version.rb +1 -1
- data/lib/rlsl/wgsl/translator.rb +46 -39
- data/lib/rlsl/wgsl/uniform_layout.rb +25 -0
- data/lib/rlsl.rb +38 -15
- 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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
data/lib/rlsl/uniform_context.rb
CHANGED
|
@@ -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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@uniforms
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
@uniforms[name] = :vec3
|
|
30
|
+
@uniforms[normalized_name] = type
|
|
22
31
|
end
|
|
23
32
|
|
|
24
|
-
|
|
25
|
-
|
|
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
data/lib/rlsl/wgsl/translator.rb
CHANGED
|
@@ -3,46 +3,53 @@
|
|
|
3
3
|
module RLSL
|
|
4
4
|
module WGSL
|
|
5
5
|
class Translator < BaseTranslator
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
21
|
-
|
|
22
|
-
return result if result.empty?
|
|
24
|
+
def validate_source_format!(source)
|
|
25
|
+
return if source.target_code?
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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(
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
68
|
-
|
|
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
|
-
|
|
79
|
+
UniformTypes.target_type(:float, uniform_target)
|
|
78
80
|
end
|
|
79
81
|
|
|
80
|
-
def
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
89
|
-
|
|
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.
|
|
26
|
+
CACHE_DIR = File.join("rlsl", "compiled").freeze
|
|
21
27
|
|
|
22
28
|
class << self
|
|
23
29
|
def define(name, &block)
|
|
24
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
|
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,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
|
-
|
|
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.
|
|
67
|
-
source_code_uri: https://github.com/
|
|
68
|
-
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:
|
|
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.
|
|
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: []
|