Add support for scan operations across program instances (add, and, or).
This commit is contained in:
12
tests/exclusive-scan-add-1.ispc
Normal file
12
tests/exclusive-scan-add-1.ispc
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = exclusive_scan_add(programIndex);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 0, 1, 3, 6, 10, 15, 21, 28,
|
||||
36, 45, 55, 66, 78, 91, 105, 120 };
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
20
tests/exclusive-scan-add-10.ispc
Normal file
20
tests/exclusive-scan-add-10.ispc
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
unsigned int64 a = aFOO[programIndex];
|
||||
if (programIndex & 1) {
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[16] = { 0, 0, 0, 2, 0, 6, 0, 12,
|
||||
0, 20, 0, 30, 0, 42, 0, 56 };
|
||||
if (programIndex & 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
else
|
||||
RET[programIndex] = -1;
|
||||
}
|
||||
12
tests/exclusive-scan-add-2.ispc
Normal file
12
tests/exclusive-scan-add-2.ispc
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = exclusive_scan_add(aFOO[programIndex]);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 6, 10, 15, 21, 28,
|
||||
36, 45, 55, 66, 78, 91, 105, 120, 136 };
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
17
tests/exclusive-scan-add-3.ispc
Normal file
17
tests/exclusive-scan-add-3.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
float a = aFOO[programIndex];
|
||||
if (a <= 2)
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
RET[programIndex] = -1;
|
||||
if (programIndex <= 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
17
tests/exclusive-scan-add-4.ispc
Normal file
17
tests/exclusive-scan-add-4.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
float a = aFOO[programIndex];
|
||||
if (a <= 2)
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
RET[programIndex] = -1;
|
||||
if (programIndex <= 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
20
tests/exclusive-scan-add-5.ispc
Normal file
20
tests/exclusive-scan-add-5.ispc
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
float a = aFOO[programIndex];
|
||||
if (programIndex & 1) {
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[16] = { 0, 0, 0, 2, 0, 6, 0, 12,
|
||||
0, 20, 0, 30, 0, 42, 0, 56 };
|
||||
if (programIndex & 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
else
|
||||
RET[programIndex] = -1;
|
||||
}
|
||||
12
tests/exclusive-scan-add-6.ispc
Normal file
12
tests/exclusive-scan-add-6.ispc
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = exclusive_scan_add((float)programIndex);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 0, 1, 3, 6, 10, 15, 21, 28,
|
||||
36, 45, 55, 66, 78, 91, 105, 120 };
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
12
tests/exclusive-scan-add-7.ispc
Normal file
12
tests/exclusive-scan-add-7.ispc
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = exclusive_scan_add((double)aFOO[programIndex]);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 6, 10, 15, 21, 28,
|
||||
36, 45, 55, 66, 78, 91, 105, 120, 136 };
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
17
tests/exclusive-scan-add-8.ispc
Normal file
17
tests/exclusive-scan-add-8.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
int64 a = aFOO[programIndex];
|
||||
if (a <= 2)
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
RET[programIndex] = -1;
|
||||
if (programIndex <= 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
17
tests/exclusive-scan-add-9.ispc
Normal file
17
tests/exclusive-scan-add-9.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
unsigned int64 a = aFOO[programIndex];
|
||||
if (a <= 2)
|
||||
RET[programIndex] = exclusive_scan_add(a);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int result[] = { 0, 1, 3, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
RET[programIndex] = -1;
|
||||
if (programIndex <= 1)
|
||||
RET[programIndex] = result[programIndex];
|
||||
}
|
||||
22
tests/exclusive-scan-and-1.ispc
Normal file
22
tests/exclusive-scan-and-1.ispc
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
int32 a = (programIndex & 1) ? 0xff : 0;
|
||||
if (programIndex & 1) {
|
||||
RET[programIndex] = exclusive_scan_and(a);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
if (programIndex & 1) {
|
||||
if (programIndex == 1)
|
||||
RET[programIndex] = -1; // 0xffffffff, made float
|
||||
else
|
||||
RET[programIndex] = 0xff;
|
||||
}
|
||||
else
|
||||
RET[programIndex] = -1;
|
||||
}
|
||||
21
tests/exclusive-scan-and-2.ispc
Normal file
21
tests/exclusive-scan-and-2.ispc
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
int32 a = ~(1 << programIndex);
|
||||
if ((programIndex & 1) == 0) {
|
||||
RET[programIndex] = exclusive_scan_and(a);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = -1;
|
||||
if ((programIndex & 1) == 0 && programIndex > 0) {
|
||||
int val = 0xffffffff;
|
||||
for (int i = 0; i < programIndex-1; i += 2)
|
||||
val &= ~(1<<i);
|
||||
RET[programIndex] = val;
|
||||
}
|
||||
}
|
||||
13
tests/exclusive-scan-or-1.ispc
Normal file
13
tests/exclusive-scan-or-1.ispc
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
RET[programIndex] = -1;
|
||||
int32 a = (1 << programIndex);
|
||||
RET[programIndex] = exclusive_scan_or(a);
|
||||
}
|
||||
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = (1 << programIndex) - 1;
|
||||
}
|
||||
Reference in New Issue
Block a user