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