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:
Ben Clayton
2021-06-18 18:56:13 +00:00
committed by Ben Clayton
parent adbbd0ba66
commit 433b4ec60d
168 changed files with 5545 additions and 118 deletions

View File

@@ -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

View File

@@ -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
}
}