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