2021-06-03 11:26:17 +00:00
|
|
|
{{- /*
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
Template file for use with tools/intrinsic-gen to generate the wgsl files in the
|
|
|
|
./gen/... subdirectories
|
|
|
|
|
|
|
|
See:
|
|
|
|
* tools/cmd/intrinsic-gen/gen for structures used by this template
|
|
|
|
* https://golang.org/pkg/text/template/ for documentation on the template syntax
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
*/ -}}
|
|
|
|
|
|
|
|
{{- /* For each permutation of each overload of each function... */ -}}
|
|
|
|
{{- range .Sem.Functions -}}
|
|
|
|
{{- range .Overloads -}}
|
|
|
|
{{- range Permute . -}}
|
|
|
|
{{- /* Generate a ./gen/<function>/<permuataion-hash>.wgsl file using
|
|
|
|
the Permutation macro defined below */ -}}
|
|
|
|
{{- $file := printf "./gen/%v/%v.wgsl" .Function.Name .Hash -}}
|
|
|
|
{{- $content := Eval "Permutation" . -}}
|
|
|
|
{{- WriteFile $file $content -}}
|
|
|
|
{{- end }}
|
|
|
|
{{- end }}
|
|
|
|
{{- end }}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "Permutation" -}}
|
|
|
|
{{- /* Emits the body of the intrinsic permuation .wgsl file */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- $function := .Function.Name -}}
|
|
|
|
{{- $permutation := printf "%v_%v" $function .Hash -}}
|
|
|
|
{{- $args := Map -}}
|
|
|
|
|
|
|
|
{{- /* Generate a storage buffer for runtime sized array parameters */ -}}
|
|
|
|
{{- if (Eval "HasStorageBufferArgs" .) -}}
|
|
|
|
[[block]]
|
|
|
|
struct SB {
|
|
|
|
{{- range $i, $p := .Parameters }}
|
|
|
|
{{- $class := Eval "StorageClass" $p.Type -}}
|
|
|
|
{{- if eq "STORAGE_BUFFER" $class }}
|
|
|
|
arg_{{$i}}: {{template "Type" $p.Type}};
|
|
|
|
{{ $args.Put $i (printf "sb.arg_%v" $i) -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
};
|
|
|
|
[[group(0), binding(0)]] var<storage> sb : [[access(read)]] SB;
|
|
|
|
{{ end -}}
|
|
|
|
|
|
|
|
{{- /* Generate module-scoped resource variables (textures, samplers, etc) */ -}}
|
|
|
|
{{- range $i, $p := .Parameters }}
|
|
|
|
{{- $class := Eval "StorageClass" $p.Type -}}
|
|
|
|
{{- if eq "RESOURCE" $class -}}
|
|
|
|
[[group(1), binding({{$i}})]] var arg_{{$i}}: {{template "Type" $p.Type}};
|
|
|
|
{{ $args.Put $i (printf "arg_%v" $i) -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
{{- /* Generate the function that calls the intrinsic */ -}}
|
|
|
|
fn {{$permutation}}() {
|
|
|
|
{{/* Build the parameters either as 'var' or inline values */ -}}
|
|
|
|
{{- range $i, $p := .Parameters -}}
|
|
|
|
{{- $class := Eval "StorageClass" $p.Type -}}
|
|
|
|
{{- if eq "PRIVATE" $class -}}
|
|
|
|
{{- if eq "ptr" $p.Type.Target.Name -}}
|
|
|
|
{{- /*indent*/}} var arg_{{$i}}: {{template "Type" index $p.Type.TemplateArguments 1}};
|
|
|
|
{{ $args.Put $i (printf "&arg_%v" $i) -}}
|
|
|
|
{{- else -}}
|
|
|
|
{{- $args.Put $i (Eval "ValueOf" $p.Type) -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
{{- /* Make the call to the intrinsic */ -}}
|
|
|
|
{{- /*indent*/}} {{/*indent*/ -}}
|
|
|
|
{{- if .ReturnType -}}
|
|
|
|
var res: {{template "Type" .ReturnType}} = {{/* preserve space after = */ -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{$function}}(
|
|
|
|
{{- range $i, $p := .Parameters -}}
|
|
|
|
{{- if $i -}}, {{end}}{{$args.Get $i -}}
|
|
|
|
{{- end -}}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
{{/*new line*/ -}}
|
|
|
|
|
|
|
|
{{- if .CanBeUsedInStage.Vertex }}
|
|
|
|
[[stage(vertex)]]
|
2021-06-04 17:31:48 +00:00
|
|
|
fn vertex_main() -> [[builtin(position)]] vec4<f32> {
|
2021-06-03 11:26:17 +00:00
|
|
|
{{$permutation}}();
|
2021-06-04 17:31:48 +00:00
|
|
|
return vec4<f32>();
|
2021-06-03 11:26:17 +00:00
|
|
|
}
|
|
|
|
{{ end -}}
|
|
|
|
|
|
|
|
{{- if .CanBeUsedInStage.Fragment }}
|
|
|
|
[[stage(fragment)]]
|
|
|
|
fn fragment_main() {
|
|
|
|
{{$permutation}}();
|
|
|
|
}
|
|
|
|
{{ end -}}
|
|
|
|
|
|
|
|
{{- if .CanBeUsedInStage.Compute }}
|
|
|
|
[[stage(compute)]]
|
|
|
|
fn compute_main() {
|
|
|
|
{{$permutation}}();
|
|
|
|
}
|
|
|
|
{{ end -}}
|
|
|
|
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "HasStorageBufferArgs" -}}
|
|
|
|
{{- /* Returns a non-empty string if the given overload has parameters */ -}}
|
|
|
|
{{- /* that are in the STORAGE_BUFFER storage class */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- range $i, $p := .Parameters }}
|
|
|
|
{{- $class := Eval "StorageClass" $p.Type -}}
|
|
|
|
{{- if eq "STORAGE_BUFFER" $class -}}1
|
|
|
|
{{ end -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "StorageClass" -}}
|
|
|
|
{{- /* Returns the storage classs STORAGE_BUFFER, RESOURCE, or PRIVATE */ -}}
|
|
|
|
{{- /* for the given Fully Qualified Name */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- $name := .Target.Name -}}
|
|
|
|
{{- if eq $name "array" -}}STORAGE_BUFFER
|
|
|
|
{{- else if HasPrefix $name "texture" -}}RESOURCE
|
|
|
|
{{- else if HasPrefix $name "sampler" -}}RESOURCE
|
|
|
|
{{- else -}}PRIVATE
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "ValueOf" -}}
|
|
|
|
{{- /* Returns a value of the given Fully Qualified Name argument */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- if eq .Target.Name "i32" -}}1
|
|
|
|
{{- else if eq .Target.Name "u32" -}}1u
|
|
|
|
{{- else if eq .Target.Name "f32" -}}1.0
|
|
|
|
{{- else -}}{{template "Type" .}}()
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "Type" -}}
|
|
|
|
{{- /* Emits the WGSL for the Fully Qualified Name argument */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- if IsType .Target -}}
|
|
|
|
{{- if eq .Target.Name "vec" -}}vec{{index .TemplateArguments 0}}<{{template "Type" index .TemplateArguments 1}}>
|
|
|
|
{{- else if eq .Target.Name "mat" -}}mat{{index .TemplateArguments 0}}x{{index .TemplateArguments 1}}<{{template "Type" index .TemplateArguments 2}}>
|
|
|
|
{{- else -}}{{.Target.Name}}{{template "TemplateArguments" .TemplateArguments}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- else if IsEnumEntry .Target -}}{{.Target.Name}}
|
|
|
|
{{- else if IsEnumMatcher .Target -}}{{(index .Target.Options 0).Name}}
|
|
|
|
{{- else -}}<unhandled-fully-qualified-name-target={{- printf "%T" .Target -}}>
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
|
|
|
|
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- define "TemplateArguments" -}}
|
|
|
|
{{- /* Emits the WGSL for the template argument list */ -}}
|
|
|
|
{{- /* ------------------------------------------------------------------ */ -}}
|
|
|
|
{{- if . -}}
|
|
|
|
<
|
|
|
|
{{- range $i, $a := . -}}
|
|
|
|
{{- if $i -}}, {{ end -}}
|
|
|
|
{{- if IsInt $a -}}{{- . -}}
|
|
|
|
{{- else -}}{{- template "Type" $a -}}
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|
|
|
|
>
|
|
|
|
{{- end -}}
|
|
|
|
{{- end -}}
|