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