shared.rsh revision 648a1c137663ef7207684d0d7009dd5518942111
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#pragma version(1)
261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#pragma rs java_package_name(com.android.rs.test_compatlegacy)
461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastentypedef struct TestResult_s {
661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    rs_allocation name;
761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    bool pass;
861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    float score;
961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    int64_t time;
1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} TestResult;
1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten//TestResult *g_results;
1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic int64_t g_time;
1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic inline void start(void) {
1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    g_time = rsUptimeMillis();
1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic inline float end(uint32_t idx) {
2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    int64_t t = rsUptimeMillis() - g_time;
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    //g_results[idx].time = t;
2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    //rsDebug("test time", (int)t);
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return ((float)t) / 1000.f;
2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#define _RS_ASSERT(b) \
27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastendo { \
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(b)) { \
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        failed = true; \
30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        rsDebug(#b " FAILED", 0); \
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } \
32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten\
33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten} while (0)
34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic const int iposinf = 0x7f800000;
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic const int ineginf = 0xff800000;
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline const float posinf() {
3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    float f = *((float*)&iposinf);
4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return f;
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic inline const float neginf() {
4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    float f = *((float*)&ineginf);
45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return f;
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline bool isposinf(float f) {
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int i = *((int*)(void*)&f);
50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    return (i == iposinf);
51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten}
52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten
53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kastenstatic inline bool isneginf(float f) {
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    int i = *((int*)(void*)&f);
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    return (i == ineginf);
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic inline bool isnan(float f) {
5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    int i = *((int*)(void*)&f);
6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic inline bool isposzero(float f) {
6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    int i = *((int*)(void*)&f);
6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return (i == 0x00000000);
6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic inline bool isnegzero(float f) {
69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    int i = *((int*)(void*)&f);
70bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    return (i == 0x80000000);
71bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten}
7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
73static inline bool iszero(float f) {
74    return isposzero(f) || isnegzero(f);
75}
76
77/* Absolute epsilon used for floats.  Value is similar to float.h. */
78#ifndef FLT_EPSILON
79#define FLT_EPSILON 1.19e7f
80#endif
81/* Max ULPs while still being considered "equal".  Only used when this number
82   of ULPs is of a greater size than FLT_EPSILON. */
83#define FLT_MAX_ULP 1
84
85/* Calculate the difference in ULPs between the two values.  (Return zero on
86   perfect equality.) */
87static inline int float_dist(float f1, float f2) {
88    return *((int *)(&f1)) - *((int *)(&f2));
89}
90
91/* Check if two floats are essentially equal.  Will fail with some values
92   due to design.  (Validate using FLT_EPSILON or similar if necessary.) */
93static inline bool float_almost_equal(float f1, float f2) {
94    int *i1 = (int*)(&f1);
95    int *i2 = (int*)(&f2);
96
97    // Check for sign equality
98    if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) {
99        // Handle signed zeroes
100        if (f1 == f2)
101            return true;
102        return false;
103    }
104
105    // Check with ULP distance
106    if (float_dist(f1, f2) > FLT_MAX_ULP)
107        return false;
108    return true;
109}
110
111/* These constants must match those in UnitTest.java */
112static const int RS_MSG_TEST_PASSED = 100;
113static const int RS_MSG_TEST_FAILED = 101;
114