#!/usr/bin/perl -w # Generate trivial test cases to exercise input types. use strict; # deliberately non-exhaustive my @basicTypes = ("half", "float", # "double", "char", "short", # "int", "long", "uchar", "ushort", # "uint", "ulong", "bool", "rs_matrix2x2", # "rs_matrix3x3", "rs_matrix4x4", "MyStruct"); # 1 signifies non-vector # 3 is not supported for exported types my @vecLengths = (1, 2, 4); sub isVectorEligible { my ($type) = @_; # There are no bool vectors or struct vectors return 0 if ($type eq "bool") || ($type eq "MyStruct"); # There are no matrix or object vectors return 0 if (substr($type, 0, 3) eq "rs_"); # Else ok return 1; } print "// -Wall -Werror\n"; print "#pragma version(1)\n"; print "#pragma rs java_package_name(inputs)\n\n"; print "// This test case was created by $0.\n"; print "// It exercises various legal combinations of inputs and special parameters,\n"; print "// so that we can ensure\n"; print "// (a) We do not choke when compiling them\n"; print "// (b) We reflect them correctly\n\n"; print "// One example struct type\n"; print "typedef struct MyStruct { float f; double d; } MyStruct;\n\n"; print "// Trivial combiner shared by all test cases\n"; print "static void combiner(int *accum, const int *other) { }\n"; foreach my $basicTypeA (@basicTypes) { foreach my $vecLenA (@vecLengths) { next if ($vecLenA > 1) && !isVectorEligible($basicTypeA); my $eltNameA = $basicTypeA; $eltNameA .= $vecLenA if ($vecLenA > 1); foreach my $basicTypeB (@basicTypes) { foreach my $vecLenB (@vecLengths) { next if ($vecLenB > 1) && !isVectorEligible($basicTypeB); my $eltNameB = $basicTypeB; $eltNameB .= $vecLenB if ($vecLenB > 1); for (my $hasSpecial = 0; $hasSpecial <= 1; ++$hasSpecial) { my $reduceName = "my_${eltNameA}_${eltNameB}_${hasSpecial}"; my $accumName = "${reduceName}_accum"; print "\n"; print "#pragma rs reduce(${reduceName}) accumulator(${accumName}) combiner(combiner)\n"; print "static void ${accumName}(int *accum, ${eltNameA} a, ${eltNameB} b"; print ", rs_kernel_context context" if ($hasSpecial); print ") { }\n"; } } } } }