1#!/usr/bin/perl -w
2
3# Generate trivial test cases to exercise input types.
4
5use strict;
6
7# deliberately non-exhaustive
8my @basicTypes = ("half", "float", # "double",
9                  "char", "short", # "int", "long",
10                  "uchar", "ushort", # "uint", "ulong",
11                  "bool",
12                  "rs_matrix2x2", # "rs_matrix3x3", "rs_matrix4x4",
13                  "MyStruct");
14
15# 1 signifies non-vector
16# 3 is not supported for exported types
17my @vecLengths = (1, 2, 4);
18
19sub isVectorEligible {
20  my ($type) = @_;
21
22  # There are no bool vectors or struct vectors
23  return 0 if ($type eq "bool") || ($type eq "MyStruct");
24
25  # There are no matrix or object vectors
26  return 0 if (substr($type, 0, 3) eq "rs_");
27
28  # Else ok
29  return 1;
30}
31
32print "// -Wall -Werror\n";
33print "#pragma version(1)\n";
34print "#pragma rs java_package_name(inputs)\n\n";
35print "// This test case was created by $0.\n";
36print "// It exercises various legal combinations of inputs and special parameters,\n";
37print "// so that we can ensure\n";
38print "// (a) We do not choke when compiling them\n";
39print "// (b) We reflect them correctly\n\n";
40print "// One example struct type\n";
41print "typedef struct MyStruct { float f; double d; } MyStruct;\n\n";
42print "// Trivial combiner shared by all test cases\n";
43print "static void combiner(int *accum, const int *other) { }\n";
44
45foreach my $basicTypeA (@basicTypes) {
46  foreach my $vecLenA (@vecLengths) {
47    next if ($vecLenA > 1) && !isVectorEligible($basicTypeA);
48
49    my $eltNameA = $basicTypeA;
50    $eltNameA .= $vecLenA if ($vecLenA > 1);
51
52    foreach my $basicTypeB (@basicTypes) {
53      foreach my $vecLenB (@vecLengths) {
54        next if ($vecLenB > 1) && !isVectorEligible($basicTypeB);
55
56        my $eltNameB = $basicTypeB;
57        $eltNameB .= $vecLenB if ($vecLenB > 1);
58
59        for (my $hasSpecial = 0; $hasSpecial <= 1; ++$hasSpecial) {
60          my $reduceName = "my_${eltNameA}_${eltNameB}_${hasSpecial}";
61          my $accumName = "${reduceName}_accum";
62          print "\n";
63          print "#pragma rs reduce(${reduceName}) accumulator(${accumName}) combiner(combiner)\n";
64          print "static void ${accumName}(int *accum, ${eltNameA} a, ${eltNameB} b";
65          print ", rs_kernel_context context" if ($hasSpecial);
66          print ") { }\n";
67        }
68      }
69    }
70  }
71}
72