1648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#pragma version(1)
2648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
3648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#pragma rs java_package_name(com.android.rs.test_compatlegacy)
4648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
5648a1c137663ef7207684d0d7009dd5518942111Stephen Hinestypedef struct TestResult_s {
6648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    rs_allocation name;
7648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    bool pass;
8648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    float score;
9648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int64_t time;
10648a1c137663ef7207684d0d7009dd5518942111Stephen Hines} TestResult;
11648a1c137663ef7207684d0d7009dd5518942111Stephen Hines//TestResult *g_results;
12648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
13648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic int64_t g_time;
14648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
15648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline void start(void) {
16648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    g_time = rsUptimeMillis();
17648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
18648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
19648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline float end(uint32_t idx) {
20648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int64_t t = rsUptimeMillis() - g_time;
21648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    //g_results[idx].time = t;
22648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    //rsDebug("test time", (int)t);
23648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return ((float)t) / 1000.f;
24648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
25648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
26648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#define _RS_ASSERT(b) \
27648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesdo { \
28648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    if (!(b)) { \
29648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        failed = true; \
30648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        rsDebug(#b " FAILED", 0); \
31648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    } \
32648a1c137663ef7207684d0d7009dd5518942111Stephen Hines\
33648a1c137663ef7207684d0d7009dd5518942111Stephen Hines} while (0)
34648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
35648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic const int iposinf = 0x7f800000;
36648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic const int ineginf = 0xff800000;
37648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
38648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline const float posinf() {
39648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    float f = *((float*)&iposinf);
40648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return f;
41648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
42648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
43648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline const float neginf() {
44648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    float f = *((float*)&ineginf);
45648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return f;
46648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
47648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
48648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool isposinf(float f) {
49648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int i = *((int*)(void*)&f);
50648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return (i == iposinf);
51648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
52648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
53648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool isneginf(float f) {
54648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int i = *((int*)(void*)&f);
55648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return (i == ineginf);
56648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
57648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
58648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool isnan(float f) {
59648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int i = *((int*)(void*)&f);
60648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
61648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
62648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
63648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool isposzero(float f) {
64648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int i = *((int*)(void*)&f);
65648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return (i == 0x00000000);
66648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
67648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
68648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool isnegzero(float f) {
69648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int i = *((int*)(void*)&f);
70648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return (i == 0x80000000);
71648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
72648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
73648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool iszero(float f) {
74648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return isposzero(f) || isnegzero(f);
75648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
76648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
77648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/* Absolute epsilon used for floats.  Value is similar to float.h. */
78648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#ifndef FLT_EPSILON
79648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#define FLT_EPSILON 1.19e7f
80648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#endif
81648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/* Max ULPs while still being considered "equal".  Only used when this number
82648a1c137663ef7207684d0d7009dd5518942111Stephen Hines   of ULPs is of a greater size than FLT_EPSILON. */
83648a1c137663ef7207684d0d7009dd5518942111Stephen Hines#define FLT_MAX_ULP 1
84648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
85648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/* Calculate the difference in ULPs between the two values.  (Return zero on
86648a1c137663ef7207684d0d7009dd5518942111Stephen Hines   perfect equality.) */
87648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline int float_dist(float f1, float f2) {
88648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return *((int *)(&f1)) - *((int *)(&f2));
89648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
90648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
91648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/* Check if two floats are essentially equal.  Will fail with some values
92648a1c137663ef7207684d0d7009dd5518942111Stephen Hines   due to design.  (Validate using FLT_EPSILON or similar if necessary.) */
93648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic inline bool float_almost_equal(float f1, float f2) {
94648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int *i1 = (int*)(&f1);
95648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    int *i2 = (int*)(&f2);
96648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
97648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    // Check for sign equality
98648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) {
99648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        // Handle signed zeroes
100648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (f1 == f2)
101648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            return true;
102648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        return false;
103648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
104648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
105648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    // Check with ULP distance
106648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    if (float_dist(f1, f2) > FLT_MAX_ULP)
107648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        return false;
108648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    return true;
109648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
110648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
111648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/* These constants must match those in UnitTest.java */
112648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic const int RS_MSG_TEST_PASSED = 100;
113648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesstatic const int RS_MSG_TEST_FAILED = 101;
114