mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-09 13:38:00 +00:00
test: Generate more permutations for pointers
Instead of just generating pointers to functions, generate pointers to all permuted storage types and accesses. Change-Id: I930b20150d823877eaf72dd7cac850078fe22f35 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/54656 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: James Price <jrprice@google.com> Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
@@ -85,13 +85,32 @@ func (g *generator) generate(tmpl string, w io.Writer, writeFile WriteFile) erro
|
||||
|
||||
// eval executes the sub-template with the given name and argument, returning
|
||||
// the generated output
|
||||
func (g *generator) eval(template string, arg interface{}) (string, error) {
|
||||
func (g *generator) eval(template string, args ...interface{}) (string, error) {
|
||||
target := g.t.Lookup(template)
|
||||
if target == nil {
|
||||
return "", fmt.Errorf("template '%v' not found", template)
|
||||
}
|
||||
sb := strings.Builder{}
|
||||
if err := target.Execute(&sb, arg); err != nil {
|
||||
|
||||
var err error
|
||||
if len(args) == 1 {
|
||||
err = target.Execute(&sb, args[0])
|
||||
} else {
|
||||
m := newMap()
|
||||
if len(args)%2 != 0 {
|
||||
return "", fmt.Errorf("Eval expects a single argument or list name-value pairs")
|
||||
}
|
||||
for i := 0; i < len(args); i += 2 {
|
||||
name, ok := args[i].(string)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("Eval argument %v is not a string", i)
|
||||
}
|
||||
m.Put(name, args[i+1])
|
||||
}
|
||||
err = target.Execute(&sb, m)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("while evaluating '%v': %v", template, err)
|
||||
}
|
||||
return sb.String(), nil
|
||||
|
||||
@@ -79,7 +79,7 @@ func (p *Permuter) Permute(overload *sem.Overload) ([]Permutation, error) {
|
||||
}
|
||||
for i, p := range overload.Parameters {
|
||||
ty := state.parameters[i]
|
||||
if !validate(ty) {
|
||||
if !validate(ty, &o.CanBeUsedInStage) {
|
||||
return nil
|
||||
}
|
||||
o.Parameters = append(o.Parameters, sem.Parameter{
|
||||
@@ -321,7 +321,7 @@ func (s *permutationState) permutateFQN(in sem.FullyQualifiedName) ([]sem.FullyQ
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func validate(fqn sem.FullyQualifiedName) bool {
|
||||
func validate(fqn sem.FullyQualifiedName, uses *sem.StageUses) bool {
|
||||
switch fqn.Target.GetName() {
|
||||
case "array":
|
||||
elTy := fqn.TemplateArguments[0].(sem.FullyQualifiedName)
|
||||
@@ -333,13 +333,40 @@ func validate(fqn sem.FullyQualifiedName) bool {
|
||||
return false // Not storable
|
||||
}
|
||||
case "ptr":
|
||||
storage := fqn.TemplateArguments[0].(sem.FullyQualifiedName).Target.(*sem.EnumEntry)
|
||||
return storage.Name == "function"
|
||||
// https://gpuweb.github.io/gpuweb/wgsl/#storage-class
|
||||
access := fqn.TemplateArguments[2].(sem.FullyQualifiedName).Target.(*sem.EnumEntry).Name
|
||||
storageClass := fqn.TemplateArguments[0].(sem.FullyQualifiedName).Target.(*sem.EnumEntry).Name
|
||||
switch storageClass {
|
||||
case "function", "private":
|
||||
if access != "read_write" {
|
||||
return false
|
||||
}
|
||||
case "workgroup":
|
||||
uses.Vertex = false
|
||||
uses.Fragment = false
|
||||
if access != "read_write" {
|
||||
return false
|
||||
}
|
||||
case "uniform":
|
||||
if access != "read" {
|
||||
return false
|
||||
}
|
||||
case "storage":
|
||||
if access != "read_write" && access != "read" {
|
||||
return false
|
||||
}
|
||||
case "handle":
|
||||
if access != "read" {
|
||||
return false
|
||||
}
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
for _, arg := range fqn.TemplateArguments {
|
||||
if argFQN, ok := arg.(sem.FullyQualifiedName); ok {
|
||||
if !validate(argFQN) {
|
||||
if !validate(argFQN, uses) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user