1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
#include "test_static.isph"
struct S {
uint a;
};
struct S operator&(struct S rr, struct S rv) {
struct S c;
c.a = rr.a & rv.a;
return c;
}
struct S operator|(struct S rr, struct S rv) {
struct S c;
c.a = rr.a | rv.a;
return c;
}
struct S operator&&(struct S rr, struct S rv) {
struct S c;
c.a = rr.a && rv.a;
return c;
}
struct S operator||(struct S rr, struct S rv) {
struct S c;
c.a = rr.a || rv.a;
return c;
}
struct S operator^(struct S rr, struct S rv) {
struct S c;
c.a = rr.a ^ rv.a;
return c;
}
struct S operator&(struct S &rr, struct S rv) {
struct S c;
c.a = (rr.a & rv.a) + 1; // Add 1 to distinguish reference version
return c;
}
struct S operator|(struct S rr, struct S &rv) {
struct S c;
c.a = (rr.a | rv.a) + 1; // Add 1 to distinguish reference version
return c;
}
struct S operator&&(struct S &rr, struct S &rv) {
struct S c;
c.a = (uint)(rr.a && rv.a) + 1; // Add 1 to distinguish reference version
return c;
}
struct S operator||(struct S &rr, struct S &rv) {
struct S c;
c.a = (uint)(rr.a || rv.a) + 1; // Add 1 to distinguish reference version
return c;
}
struct S operator^(struct S &rr, struct S &rv) {
struct S c;
c.a = (rr.a ^ rv.a) + 1; // Add 1 to distinguish reference version
return c;
}
task void f_f(uniform float RET[], uniform float aFOO[]) {
struct S a;
struct S b;
struct S c;
a.a = aFOO[programIndex];
b.a = aFOO[programIndex] + 1;
c.a = aFOO[programIndex] + 2;
struct S d;
if (programIndex < 3)
d = (a && b) & b | c ^ a;
else
d = a || b;
RET[programIndex] = reduce_add(d.a);
// Create references
struct S &refA = a;
struct S &refB = b;
struct S &refC = c;
if (programIndex < 3)
d = (refA && refB) & b | refC ^ refA; // Mix of references and values
else
d = refA || refB;
RET[programIndex] += reduce_add(d.a);
}
task void result(uniform float RET[16]) {
RET[programIndex] = 23 + programCount*3;
}
|