Home | History | Annotate | Download | only in librscpptest
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <jni.h>
     18 #include <android/log.h>
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <math.h>
     23 
     24 #include <RenderScript.h>
     25 
     26 #define  LOG_TAG    "rscpptest"
     27 #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
     28 #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
     29 
     30 #include <ScriptC_primitives.h>
     31 #include <ScriptC_instance.h>
     32 #include <ScriptC_vector.h>
     33 
     34 using namespace android::RSC;
     35 
     36 #define RS_MSG_TEST_PASSED 100
     37 #define RS_MSG_TEST_FAILED 101
     38 
     39 static int result = 0;
     40 static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) {
     41     if (result == 0) {
     42         result = msgNum;
     43     }
     44 }
     45 
     46 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testSet(JNIEnv * env,
     47                                                                                   jclass obj,
     48                                                                                   jstring pathObj)
     49 {
     50     const char * path = env->GetStringUTFChars(pathObj, nullptr);
     51     sp<RS> mRS = new RS();
     52     mRS->init(path);
     53     env->ReleaseStringUTFChars(pathObj, path);
     54     MessageHandlerFunc_t mHandler = rsMsgHandler;
     55     mRS->setMessageHandler(mHandler);
     56 
     57     bool passed = true;
     58 
     59     sp<const Type> t = Type::create(mRS, Element::I32(mRS), 8, 0, 0);
     60     sp<Allocation> alloc = Allocation::createTyped(mRS, t);
     61 
     62     sp<ScriptC_primitives> script = new ScriptC_primitives(mRS);
     63     script->set_floatTest(2.99f);  // floatTest
     64     script->set_doubleTest(3.05);  // doubleTest
     65     script->set_charTest(-16);  // charTest
     66     script->set_shortTest(-32);  // shortTest
     67     script->set_intTest(-64);  // intTest
     68     script->set_longTest(17179869185l);  // longTest
     69     script->set_longlongTest(68719476735L); //longlongTest
     70     script->set_ulongTest(4611686018427387903L);  // boolTest
     71     script->set_uint64_tTest(117179869185l); //uint64_tTest
     72     script->set_allocationTest(alloc);  // allocationTest
     73 
     74     script->invoke_test_primitive_types();
     75     mRS->finish();
     76     if (result == RS_MSG_TEST_FAILED) {
     77         passed = false;
     78     }
     79 
     80     return passed;
     81 }
     82 
     83 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testInstance(JNIEnv * env,
     84                                                                                        jclass obj,
     85                                                                                        jstring pathObj)
     86 {
     87     /**
     88      * Test script instancing.
     89      */
     90     const char * path = env->GetStringUTFChars(pathObj, nullptr);
     91     sp<RS> mRS = new RS();
     92     mRS->init(path);
     93     env->ReleaseStringUTFChars(pathObj, path);
     94     MessageHandlerFunc_t mHandler = rsMsgHandler;
     95     mRS->setMessageHandler(mHandler);
     96 
     97     bool passed = true;
     98 
     99     sp<const Type> t = Type::create(mRS, Element::I32(mRS), 1, 0, 0);
    100     sp<Allocation> ai1 = Allocation::createTyped(mRS, t);
    101     sp<Allocation> ai2 = Allocation::createTyped(mRS, t);
    102     sp<ScriptC_instance> instance_1 = new ScriptC_instance(mRS);
    103     sp<ScriptC_instance> instance_2 = new ScriptC_instance(mRS);
    104 
    105     instance_1->set_i(1);
    106     instance_2->set_i(2);
    107     instance_1->set_ai(ai1);
    108     instance_2->set_ai(ai2);
    109 
    110     // We now check to ensure that the global is not being shared across
    111     // our separate script instances. Our invoke here merely sets the
    112     // instanced allocation with the instanced global variable's value.
    113     // If globals are being shared (i.e. not instancing scripts), then
    114     // both instanced allocations will have the same resulting value
    115     // (depending on the order in which the invokes complete).
    116     instance_1->invoke_instance_test();
    117     instance_2->invoke_instance_test();
    118 
    119     int i1[1];
    120     int i2[1];
    121 
    122     ai1->copy1DTo(i1);
    123     ai2->copy1DTo(i2);
    124 
    125     // 3-step check ensures that a fortunate race condition wouldn't let us
    126     // pass accidentally.
    127     passed &= (2 == i2[0]);
    128     passed &= (1 == i1[0]);
    129     passed &= (2 == i2[0]);
    130     mRS->finish();
    131     if (result == RS_MSG_TEST_FAILED) {
    132         passed = false;
    133     }
    134 
    135     return passed;
    136 }
    137 
    138 // Define some reasonable types for use with the vector invoke testing.
    139 typedef unsigned char uchar;
    140 typedef unsigned short ushort;
    141 typedef unsigned int uint;
    142 typedef unsigned long ulong;
    143 
    144 #define TEST_VECTOR_INVOKE(L, U) \
    145 L temp_##L = 0; \
    146 vector->invoke_vector_test_##L(temp_##L); \
    147 U##2 temp_##L##2; \
    148 vector->invoke_vector_test_##L##2(temp_##L##2); \
    149 U##3 temp_##L##3; \
    150 vector->invoke_vector_test_##L##3(temp_##L##3); \
    151 U##4 temp_##L##4; \
    152 vector->invoke_vector_test_##L##4(temp_##L##4);
    153 
    154 
    155 /*
    156  * Test that vector invoke C++ reflection is working/present.
    157  */
    158 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testVector(JNIEnv * env,
    159                                                                                      jclass obj,
    160                                                                                      jstring pathObj)
    161 {
    162     const char * path = env->GetStringUTFChars(pathObj, nullptr);
    163     sp<RS> mRS = new RS();
    164     mRS->init(path);
    165     env->ReleaseStringUTFChars(pathObj, path);
    166     MessageHandlerFunc_t mHandler = rsMsgHandler;
    167     mRS->setMessageHandler(mHandler);
    168 
    169     bool passed = true;
    170     sp<ScriptC_vector> vector = new ScriptC_vector(mRS);
    171 
    172     TEST_VECTOR_INVOKE(float, Float)
    173     TEST_VECTOR_INVOKE(double, Double)
    174     TEST_VECTOR_INVOKE(char, Byte)
    175     TEST_VECTOR_INVOKE(uchar, UByte)
    176     TEST_VECTOR_INVOKE(short, Short)
    177     TEST_VECTOR_INVOKE(ushort, UShort)
    178     TEST_VECTOR_INVOKE(int, Int)
    179     TEST_VECTOR_INVOKE(uint, UInt)
    180     TEST_VECTOR_INVOKE(long, Long)
    181     TEST_VECTOR_INVOKE(ulong, ULong)
    182 
    183     return passed;
    184 }
    185