10d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// This file is automatically generated from
20d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py
30d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/*
40d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Copyright (C) 2017 The Android Open Source Project
50d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
60d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License");
70d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * you may not use this file except in compliance with the License.
80d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * You may obtain a copy of the License at
90d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *      http://www.apache.org/licenses/LICENSE-2.0
110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Unless required by applicable law or agreed to in writing, software
130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS,
140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * See the License for the specific language governing permissions and
160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * limitations under the License.
170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks */
180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#pragma version(1)
200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#pragma rs java_package_name(com.android.rs.unittest)
220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankstypedef struct TestResult_s {
240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    rs_allocation name;
250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    bool pass;
260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    float score;
270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int64_t time;
280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks} TestResult;
290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks//TestResult *g_results;
300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic int64_t g_time;
320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline void start(void) {
340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    g_time = rsUptimeMillis();
350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline float end(uint32_t idx) {
380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int64_t t = rsUptimeMillis() - g_time;
390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    //g_results[idx].time = t;
400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    //rsDebug("test time", (int)t);
410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return ((float)t) / 1000.f;
420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#define _RS_ASSERT(b) \
450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksdo { \
460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    if (!(b)) { \
470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        failed = true; \
480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        rsDebug(#b " FAILED", 0); \
490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    } \
500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks\
510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks} while (0)
520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#define _RS_ASSERT_EQU(e1, e2) \
540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks  (((e1) != (e2)) ? (failed = true, rsDebug(#e1 " != " #e2, (e1), (e2)), false) : true)
550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic const int iposinf = 0x7f800000;
570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic const int ineginf = 0xff800000;
580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline const float posinf() {
600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    float f = *((float*)&iposinf);
610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return f;
620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline const float neginf() {
650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    float f = *((float*)&ineginf);
660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return f;
670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool isposinf(float f) {
700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int i = *((int*)(void*)&f);
710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return (i == iposinf);
720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool isneginf(float f) {
750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int i = *((int*)(void*)&f);
760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return (i == ineginf);
770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool isnan(float f) {
800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int i = *((int*)(void*)&f);
810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool isposzero(float f) {
850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int i = *((int*)(void*)&f);
860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return (i == 0x00000000);
870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool isnegzero(float f) {
900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int i = *((int*)(void*)&f);
910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return (i == 0x80000000);
920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool iszero(float f) {
950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return isposzero(f) || isnegzero(f);
960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* Absolute epsilon used for floats.  Value is similar to float.h. */
990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#ifndef FLT_EPSILON
1000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#define FLT_EPSILON 1.19e7f
1010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#endif
1020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* Max ULPs while still being considered "equal".  Only used when this number
1030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks   of ULPs is of a greater size than FLT_EPSILON. */
1040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#define FLT_MAX_ULP 1
1050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* Calculate the difference in ULPs between the two values.  (Return zero on
1070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks   perfect equality.) */
1080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline int float_dist(float f1, float f2) {
1090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return *((int *)(&f1)) - *((int *)(&f2));
1100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
1110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* Check if two floats are essentially equal.  Will fail with some values
1130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks   due to design.  (Validate using FLT_EPSILON or similar if necessary.) */
1140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic inline bool float_almost_equal(float f1, float f2) {
1150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int *i1 = (int*)(&f1);
1160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    int *i2 = (int*)(&f2);
1170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    // Check for sign equality
1190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) {
1200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // Handle signed zeroes
1210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        if (f1 == f2)
1220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            return true;
1230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return false;
1240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    // Check with ULP distance
1270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    if (float_dist(f1, f2) > FLT_MAX_ULP)
1280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return false;
1290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    return true;
1300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
1310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* These constants must match those in UnitTest.java */
1330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic const int RS_MSG_TEST_PASSED = 100;
1340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksstatic const int RS_MSG_TEST_FAILED = 101;
1350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks#define RSTEST_COMPAT
137