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