Home | History | Annotate | Download | only in librscpptest
      1 /*
      2  * Copyright (C) 2013 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_setelementat.h"
     31 
     32 using namespace android::RSC;
     33 
     34 static void createTypedHelper (sp<RS> mRS, sp<const Element> e) {
     35     Type::Builder typeBuilder(mRS, e);
     36     for (int mips = 0; mips <= 1; mips ++) {
     37         bool useMips = (mips == 1);
     38 
     39         for (int faces = 0; faces <= 1; faces++) {
     40             bool useFaces = (faces == 1);
     41 
     42             for (uint32_t x = 1; x < 8; x ++) {
     43                 for (uint32_t y = 1; y < 8; y ++) {
     44                     typeBuilder.setMipmaps(useMips);
     45                     typeBuilder.setFaces(useFaces);
     46                     typeBuilder.setX(x);
     47                     typeBuilder.setY(y);
     48                     Allocation::createTyped(mRS, typeBuilder.create());
     49                 }
     50             }
     51         }
     52     }
     53 
     54 }
     55 
     56 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_typedTest(JNIEnv * env,
     57                                                                                         jclass obj,
     58                                                                                         jstring pathObj)
     59 {
     60     const char * path = env->GetStringUTFChars(pathObj, NULL);
     61     sp<RS> mRS = new RS();
     62     mRS->init(path);
     63     env->ReleaseStringUTFChars(pathObj, path);
     64 
     65     createTypedHelper(mRS, Element::A_8(mRS));
     66     createTypedHelper(mRS, Element::RGBA_4444(mRS));
     67     createTypedHelper(mRS, Element::RGBA_5551(mRS));
     68     createTypedHelper(mRS, Element::RGB_565(mRS));
     69     createTypedHelper(mRS, Element::RGB_888(mRS));
     70     createTypedHelper(mRS, Element::RGBA_8888(mRS));
     71     createTypedHelper(mRS, Element::F32(mRS));
     72     createTypedHelper(mRS, Element::F32_2(mRS));
     73     createTypedHelper(mRS, Element::F32_3(mRS));
     74     createTypedHelper(mRS, Element::F32_4(mRS));
     75     createTypedHelper(mRS, Element::F64(mRS));
     76     createTypedHelper(mRS, Element::F64_2(mRS));
     77     createTypedHelper(mRS, Element::F64_3(mRS));
     78     createTypedHelper(mRS, Element::F64_4(mRS));
     79     createTypedHelper(mRS, Element::I8(mRS));
     80     createTypedHelper(mRS, Element::I8_2(mRS));
     81     createTypedHelper(mRS, Element::I8_3(mRS));
     82     createTypedHelper(mRS, Element::I8_4(mRS));
     83     createTypedHelper(mRS, Element::I16(mRS));
     84     createTypedHelper(mRS, Element::I16_2(mRS));
     85     createTypedHelper(mRS, Element::I16_3(mRS));
     86     createTypedHelper(mRS, Element::I16_4(mRS));
     87     createTypedHelper(mRS, Element::I32(mRS));
     88     createTypedHelper(mRS, Element::I32_2(mRS));
     89     createTypedHelper(mRS, Element::I32_3(mRS));
     90     createTypedHelper(mRS, Element::I32_4(mRS));
     91     createTypedHelper(mRS, Element::I64(mRS));
     92     createTypedHelper(mRS, Element::I64_2(mRS));
     93     createTypedHelper(mRS, Element::I64_3(mRS));
     94     createTypedHelper(mRS, Element::I64_4(mRS));
     95     createTypedHelper(mRS, Element::U8(mRS));
     96     createTypedHelper(mRS, Element::U8_2(mRS));
     97     createTypedHelper(mRS, Element::U8_3(mRS));
     98     createTypedHelper(mRS, Element::U8_4(mRS));
     99     createTypedHelper(mRS, Element::U16(mRS));
    100     createTypedHelper(mRS, Element::U16_2(mRS));
    101     createTypedHelper(mRS, Element::U16_3(mRS));
    102     createTypedHelper(mRS, Element::U16_4(mRS));
    103     createTypedHelper(mRS, Element::U32(mRS));
    104     createTypedHelper(mRS, Element::U32_2(mRS));
    105     createTypedHelper(mRS, Element::U32_3(mRS));
    106     createTypedHelper(mRS, Element::U32_4(mRS));
    107     createTypedHelper(mRS, Element::U64(mRS));
    108     createTypedHelper(mRS, Element::U64_2(mRS));
    109     createTypedHelper(mRS, Element::U64_3(mRS));
    110     createTypedHelper(mRS, Element::U64_4(mRS));
    111     createTypedHelper(mRS, Element::MATRIX_2X2(mRS));
    112     createTypedHelper(mRS, Element::MATRIX_3X3(mRS));
    113     createTypedHelper(mRS, Element::MATRIX_4X4(mRS));
    114     createTypedHelper(mRS, Element::SAMPLER(mRS));
    115     createTypedHelper(mRS, Element::SCRIPT(mRS));
    116     createTypedHelper(mRS, Element::TYPE(mRS));
    117     createTypedHelper(mRS, Element::BOOLEAN(mRS));
    118     createTypedHelper(mRS, Element::ELEMENT(mRS));
    119     createTypedHelper(mRS, Element::ALLOCATION(mRS));
    120 
    121     mRS->finish();
    122     return true;
    123 }
    124 
    125 static bool helperFloatCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
    126     bool passed = true;
    127     sp<Allocation> A = Allocation::createSized(mRS, Element::F32(mRS), nElems);
    128 
    129     float *src, *dst;
    130     src = new float[nElems];
    131     dst = new float[nElems];
    132 
    133     for (int i = 0; i < count; i++) {
    134         src[i] = (float)i;
    135         dst[offset + i] = -1.0f;
    136     }
    137 
    138     switch (copyMode) {
    139     case 0: A->copy1DFrom(src); break;
    140     case 1: A->copy1DRangeFrom(offset, count, src); break;
    141     }
    142     A->copy1DTo(dst);
    143 
    144     for (int i = 0; i < count; i++) {
    145         if (dst[offset + i] != src[i]) {
    146             passed = false;
    147             break;
    148         }
    149     }
    150 
    151     delete[] src;
    152     delete[] dst;
    153     return passed;
    154 }
    155 
    156 static bool helperCharCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
    157     bool passed = true;
    158     sp<Allocation> A = Allocation::createSized(mRS, Element::I8(mRS), nElems);
    159 
    160     char *src, *dst;
    161     src = new char[nElems];
    162     dst = new char[nElems];
    163 
    164     for (int i = 0; i < count; i++) {
    165         src[i] = (char)i;
    166         dst[offset + i] = -1;
    167     }
    168 
    169     switch (copyMode) {
    170     case 0: A->copy1DFrom(src); break;
    171     case 1: A->copy1DRangeFrom(offset, count, src); break;
    172     }
    173     A->copy1DTo(dst);
    174 
    175     for (int i = 0; i < count; i++) {
    176         if (dst[offset + i] != src[i]) {
    177             passed = false;
    178             break;
    179         }
    180     }
    181 
    182     delete[] src;
    183     delete[] dst;
    184     return passed;
    185 }
    186 
    187 static bool helperShortCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
    188     bool passed = true;
    189     sp<Allocation> A = Allocation::createSized(mRS, Element::I16(mRS), nElems);
    190 
    191     short *src, *dst;
    192     src = new short[nElems];
    193     dst = new short[nElems];
    194 
    195     for (int i = 0; i < count; i++) {
    196         src[i] = (short)i;
    197         dst[offset + i] = -1;
    198     }
    199 
    200     switch (copyMode) {
    201     case 0: A->copy1DFrom(src); break;
    202     case 1: A->copy1DRangeFrom(offset, count, src); break;
    203     }
    204     A->copy1DTo(dst);
    205 
    206     for (int i = 0; i < count; i++) {
    207         if (dst[offset + i] != src[i]) {
    208             passed = false;
    209             break;
    210         }
    211     }
    212 
    213     delete[] src;
    214     delete[] dst;
    215     return passed;
    216 }
    217 
    218 static bool helperIntCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
    219     bool passed = true;
    220     sp<Allocation> A = Allocation::createSized(mRS, Element::I32(mRS), nElems);
    221 
    222     int *src, *dst;
    223     src = new int[nElems];
    224     dst = new int[nElems];
    225 
    226     for (int i = 0; i < count; i++) {
    227         src[i] = (int)i;
    228         dst[offset + i] = -1;
    229     }
    230 
    231     switch (copyMode) {
    232     case 0: A->copy1DFrom(src); break;
    233     case 1: A->copy1DRangeFrom(offset, count, src); break;
    234     }
    235     A->copy1DTo(dst);
    236 
    237     for (int i = 0; i < count; i++) {
    238         if (dst[offset + i] != src[i]) {
    239             passed = false;
    240             break;
    241         }
    242     }
    243 
    244     delete[] src;
    245     delete[] dst;
    246     return passed;
    247 }
    248 
    249 static bool helperDoubleCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
    250     bool passed = true;
    251     sp<Allocation> A = Allocation::createSized(mRS, Element::F64(mRS), nElems);
    252 
    253     double *src, *dst;
    254     src = new double[nElems];
    255     dst = new double[nElems];
    256 
    257     for (int i = 0; i < count; i++) {
    258         src[i] = (double)i;
    259         dst[offset + i] = -1;
    260     }
    261 
    262     switch (copyMode) {
    263     case 0: A->copy1DFrom(src); break;
    264     case 1: A->copy1DRangeFrom(offset, count, src); break;
    265     }
    266     A->copy1DTo(dst);
    267 
    268     for (int i = 0; i < count; i++) {
    269         if (dst[offset + i] != src[i]) {
    270             passed = false;
    271             break;
    272         }
    273     }
    274 
    275     delete[] src;
    276     delete[] dst;
    277     return passed;
    278 }
    279 
    280 static bool helperFloatAllocationCopy(sp<RS> mRS, int nElems, int offset, int count) {
    281 
    282     bool passed = true;
    283     sp<Allocation> srcA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
    284     sp<Allocation> dstA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
    285 
    286     float *src, *dst;
    287     src = new float[nElems];
    288     dst = new float[nElems];
    289     for (int i = 0; i < nElems; i++) {
    290         src[i] = (float)i;
    291         dst[i] = -1.0f;
    292     }
    293 
    294     // First populate the source allocation
    295     srcA->copy1DFrom(src);
    296     // Now test allocation to allocation copy
    297     dstA->copy1DRangeFrom(offset, count, srcA, offset);
    298     dstA->copy1DTo(dst);
    299 
    300     for (int i = 0; i < count; i++) {
    301         if (dst[offset + i] != src[offset + i]) {
    302             passed = false;
    303             break;
    304         }
    305     }
    306 
    307     delete[] src;
    308     delete[] dst;
    309     return passed;
    310 }
    311 
    312 static int elemsToTest = 20;
    313 
    314 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
    315                                                                                          jclass obj,
    316                                                                                          jstring pathObj)
    317 {
    318     const char * path = env->GetStringUTFChars(pathObj, NULL);
    319     sp<RS> mRS = new RS();
    320     mRS->init(path);
    321     env->ReleaseStringUTFChars(pathObj, path);
    322     bool passed = true;
    323 
    324     for (int s = 8; s <= elemsToTest; s += 2) {
    325         for (int mode = 0; mode < 1; mode ++) {
    326             passed &= helperFloatCopy(mRS, s, 0, s, mode);
    327             passed &= helperCharCopy(mRS, s, 0, s, mode);
    328             passed &= helperShortCopy(mRS, s, 0, s, mode);
    329             passed &= helperIntCopy(mRS, s, 0, s, mode);
    330             //helperBaseObjCopy(mRS, s, 0, s, mode);
    331         }
    332 
    333         // now test copy range
    334         for (int mode = 1; mode < 2; mode ++) {
    335             for (int off = 0; off < s; off ++) {
    336                 for (int count = 1; count <= s - off; count ++) {
    337                     passed &= helperFloatCopy(mRS, s, off, count, mode);
    338                     passed &= helperCharCopy(mRS, s, off, count, mode);
    339                     passed &= helperShortCopy(mRS, s, off, count, mode);
    340                     passed &= helperIntCopy(mRS, s, off, count, mode);
    341                     //helperBaseObjCopy(mRS, s, off, count, mode);
    342                 }
    343             }
    344         }
    345 
    346         for (int off = 0; off < s; off ++) {
    347             for (int count = 1; count <= s - off; count ++) {
    348                 passed &= helperFloatAllocationCopy(mRS, s, off, count);
    349                 //helperByteAllocationCopy(mRS, s, off, count);
    350             }
    351         }
    352     }
    353     return passed;
    354 }
    355 
    356 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_testSetElementAt(JNIEnv * env,
    357                                                                                                jclass obj,
    358                                                                                                jstring pathObj)
    359 {
    360     const char * path = env->GetStringUTFChars(pathObj, NULL);
    361     sp<RS> mRS = new RS();
    362     mRS->init(path);
    363     env->ReleaseStringUTFChars(pathObj, path);
    364 
    365     bool passed = true;
    366 
    367     Type::Builder b(mRS, Element::I32(mRS));
    368     b.setX(48);
    369     sp<Allocation> largeArray = Allocation::createTyped(mRS, b.create());
    370     b.setX(1);
    371     sp<Allocation> singleElement = Allocation::createTyped(mRS, b.create());
    372 
    373     sp<ScriptC_setelementat> script = new ScriptC_setelementat(mRS);
    374 
    375     script->set_memset_toValue(1);
    376     script->forEach_memset(singleElement);
    377 
    378     script->set_dimX(48);
    379     script->set_array(largeArray);
    380 
    381     script->forEach_setLargeArray(singleElement);
    382 
    383     int result = 0;
    384 
    385     script->set_compare_value(10);
    386     script->forEach_compare(largeArray);
    387     script->forEach_getCompareResult(singleElement);
    388     singleElement->copy1DTo(&result);
    389     if (result != 2) {
    390         passed = false;
    391     }
    392 
    393     return passed;
    394 }
    395