1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#pragma version(1)
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#pragma rs java_package_name(com.android.rs.test)
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samstypedef struct TestResult_s {
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    rs_allocation name;
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    bool pass;
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float score;
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int64_t time;
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} TestResult;
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams//TestResult *g_results;
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic int64_t g_time;
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
15de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline void start(void) {
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    g_time = rsUptimeMillis();
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline float end(uint32_t idx) {
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int64_t t = rsUptimeMillis() - g_time;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    //g_results[idx].time = t;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    //rsDebug("test time", (int)t);
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return ((float)t) / 1000.f;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#define _RS_ASSERT(b) \
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsdo { \
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    if (!(b)) { \
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        failed = true; \
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        rsDebug(#b " FAILED", 0); \
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    } \
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams\
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} while (0)
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
35dced5c96bc53c45a1aac782ea9bd738b0d50fd09David Gross#define _RS_ASSERT_EQU(e1, e2) \
36dced5c96bc53c45a1aac782ea9bd738b0d50fd09David Gross  (((e1) != (e2)) ? (failed = true, rsDebug(#e1 " != " #e2, (e1), (e2)), false) : true)
37dced5c96bc53c45a1aac782ea9bd738b0d50fd09David Gross
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int iposinf = 0x7f800000;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int ineginf = 0xff800000;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
41de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline const float posinf() {
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float f = *((float*)&iposinf);
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return f;
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
46de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline const float neginf() {
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float f = *((float*)&ineginf);
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return f;
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
51de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isposinf(float f) {
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int i = *((int*)(void*)&f);
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return (i == iposinf);
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
56de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isneginf(float f) {
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int i = *((int*)(void*)&f);
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return (i == ineginf);
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
61de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isnan(float f) {
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int i = *((int*)(void*)&f);
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
66de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isposzero(float f) {
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int i = *((int*)(void*)&f);
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return (i == 0x00000000);
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
71de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isnegzero(float f) {
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int i = *((int*)(void*)&f);
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return (i == 0x80000000);
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
76de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool iszero(float f) {
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return isposzero(f) || isnegzero(f);
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Absolute epsilon used for floats.  Value is similar to float.h. */
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#ifndef FLT_EPSILON
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#define FLT_EPSILON 1.19e7f
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#endif
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Max ULPs while still being considered "equal".  Only used when this number
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams   of ULPs is of a greater size than FLT_EPSILON. */
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#define FLT_MAX_ULP 1
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Calculate the difference in ULPs between the two values.  (Return zero on
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams   perfect equality.) */
90de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline int float_dist(float f1, float f2) {
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return *((int *)(&f1)) - *((int *)(&f2));
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Check if two floats are essentially equal.  Will fail with some values
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams   due to design.  (Validate using FLT_EPSILON or similar if necessary.) */
96de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool float_almost_equal(float f1, float f2) {
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int *i1 = (int*)(&f1);
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    int *i2 = (int*)(&f2);
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // Check for sign equality
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) {
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Handle signed zeroes
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (f1 == f2)
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return true;
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return false;
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // Check with ULP distance
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    if (float_dist(f1, f2) > FLT_MAX_ULP)
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return false;
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    return true;
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* These constants must match those in UnitTest.java */
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int RS_MSG_TEST_PASSED = 100;
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int RS_MSG_TEST_FAILED = 101;
117