1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#pragma version(1) 2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#pragma rs java_package_name(com.android.rs.test_compat) 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 35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int iposinf = 0x7f800000; 36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int ineginf = 0xff800000; 37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 38de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline const float posinf() { 39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams float f = *((float*)&iposinf); 40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return f; 41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 43de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline const float neginf() { 44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams float f = *((float*)&ineginf); 45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return f; 46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 48de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isposinf(float f) { 49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int i = *((int*)(void*)&f); 50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return (i == iposinf); 51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 53de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isneginf(float f) { 54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int i = *((int*)(void*)&f); 55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return (i == ineginf); 56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 58de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isnan(float f) { 59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int i = *((int*)(void*)&f); 60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff)); 61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 63de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isposzero(float f) { 64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int i = *((int*)(void*)&f); 65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return (i == 0x00000000); 66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 68de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool isnegzero(float f) { 69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int i = *((int*)(void*)&f); 70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return (i == 0x80000000); 71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 73de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool iszero(float f) { 74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return isposzero(f) || isnegzero(f); 75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Absolute epsilon used for floats. Value is similar to float.h. */ 78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#ifndef FLT_EPSILON 79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#define FLT_EPSILON 1.19e7f 80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#endif 81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Max ULPs while still being considered "equal". Only used when this number 82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams of ULPs is of a greater size than FLT_EPSILON. */ 83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#define FLT_MAX_ULP 1 84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Calculate the difference in ULPs between the two values. (Return zero on 86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams perfect equality.) */ 87de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline int float_dist(float f1, float f2) { 88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return *((int *)(&f1)) - *((int *)(&f2)); 89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* Check if two floats are essentially equal. Will fail with some values 92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams due to design. (Validate using FLT_EPSILON or similar if necessary.) */ 93de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouilletstatic inline bool float_almost_equal(float f1, float f2) { 94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int *i1 = (int*)(&f1); 95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int *i2 = (int*)(&f2); 96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams // Check for sign equality 98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) { 99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams // Handle signed zeroes 100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (f1 == f2) 101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return true; 102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return false; 103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams // Check with ULP distance 106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (float_dist(f1, f2) > FLT_MAX_ULP) 107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return false; 108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return true; 109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* These constants must match those in UnitTest.java */ 112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int RS_MSG_TEST_PASSED = 100; 113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic const int RS_MSG_TEST_FAILED = 101; 114