Home | History | Annotate | Download | only in functional
      1 /*
      2  * Copyright (C) 2017 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 "VtsHalRenderscriptV1_0TargetTest.h"
     18 
     19 /*
     20  * Create a Blur intrinsic with scriptIntrinsicCreate, and call
     21  * scriptSetTimeZone to make sure it is not crashing.
     22  *
     23  * Calls: elementCreate, scriptIntrinsicCreate, scriptSetTimeZone
     24  */
     25 TEST_F(RenderscriptHidlTest, IntrinsicTest) {
     26     // uint8
     27     Element element = context->elementCreate(DataType::UNSIGNED_8, DataKind::USER, false, 1);
     28     EXPECT_NE(Element(0), element);
     29 
     30     Script script = context->scriptIntrinsicCreate(ScriptIntrinsicID::ID_BLUR, element);
     31     EXPECT_NE(Script(0), script);
     32 
     33     context->scriptSetTimeZone(script, "UTF-8");
     34 }
     35 
     36 /*
     37  * Create a user script struct_test, and verified the setters and getters work
     38  * for the global variables.
     39  *
     40  * Calls: scriptCCreate, scriptGetVarV, scriptSetVarI, scriptSetVarJ,
     41  * scriptSetVarF, scriptSetVarD, elementCreate, typeCreate,
     42  * allocationCreateTyped, scriptSetVarObj, scriptSetVarV, scriptSetVarVE
     43  */
     44 TEST_F(RenderscriptHidlTest, ScriptVarTest) {
     45     hidl_vec<uint8_t> bitcode;
     46     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
     47     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
     48     ASSERT_NE(Script(0), script);
     49 
     50     // arg tests
     51     context->scriptSetVarI(script, mExportVarIdx_var_int, 100);
     52     int resultI = 0;
     53     context->scriptGetVarV(script, mExportVarIdx_var_int, sizeof(int),
     54                            [&](const hidl_vec<uint8_t>& _data){ resultI = *((int*)_data.data()); });
     55     EXPECT_EQ(100, resultI);
     56 
     57     context->scriptSetVarJ(script, mExportVarIdx_var_long, 101l);
     58     int resultJ = 0;
     59     context->scriptGetVarV(script, mExportVarIdx_var_long, sizeof(long),
     60                            [&](const hidl_vec<uint8_t>& _data){
     61                                resultJ = *((long*)_data.data()); });
     62     EXPECT_EQ(101l, resultJ);
     63 
     64     context->scriptSetVarF(script, mExportVarIdx_var_float, 102.0f);
     65     int resultF = 0.0f;
     66     context->scriptGetVarV(script, mExportVarIdx_var_float, sizeof(float),
     67                            [&](const hidl_vec<uint8_t>& _data){
     68                                resultF = *((float*)_data.data()); });
     69     EXPECT_EQ(102.0f, resultF);
     70 
     71     context->scriptSetVarD(script, mExportVarIdx_var_double, 103.0);
     72     int resultD = 0.0;
     73     context->scriptGetVarV(script, mExportVarIdx_var_double, sizeof(double),
     74                            [&](const hidl_vec<uint8_t>& _data){
     75                                resultD = *((double*)_data.data()); });
     76     EXPECT_EQ(103.0, resultD);
     77 
     78     // float1
     79     Element element = context->elementCreate(DataType::FLOAT_32, DataKind::USER, false, 1);
     80     ASSERT_NE(Element(0), element);
     81 
     82     // 128 x float1
     83     Type type = context->typeCreate(element, 128, 0, 0, false, false, YuvFormat::YUV_NONE);
     84     ASSERT_NE(Type(0), type);
     85 
     86     // 128 x float1
     87     Allocation allocationIn = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
     88                                                              (int)AllocationUsageType::SCRIPT,
     89                                                              (Ptr)nullptr);
     90     ASSERT_NE(Allocation(0), allocationIn);
     91 
     92     Allocation allocationOut = Allocation(0);
     93     context->scriptSetVarObj(script, mExportVarIdx_var_allocation, (ObjectBase)allocationIn);
     94     context->scriptGetVarV(script, mExportVarIdx_var_allocation, sizeof(ObjectBase),
     95                            [&](const hidl_vec<uint8_t>& _data){
     96                                allocationOut = (Allocation) *((ObjectBase*)_data.data()); });
     97     EXPECT_EQ(allocationOut, allocationIn);
     98 
     99     uint32_t valueV = 104u;
    100     hidl_vec<uint8_t> _dataV;
    101     _dataV.setToExternal((uint8_t*)&valueV, sizeof(uint32_t));
    102     context->scriptSetVarV(script, mExportVarIdx_var_uint32_t, _dataV);
    103     uint32_t resultV = 0u;
    104     context->scriptGetVarV(script, mExportVarIdx_var_uint32_t, sizeof(uint32_t),
    105                            [&](const hidl_vec<uint8_t>& _data){
    106                                resultV = *((uint32_t*)_data.data()); });
    107     EXPECT_EQ(104u, resultV);
    108 
    109     std::vector<int> dataVE = {1000, 1001};
    110     std::vector<uint32_t> dimsVE = {1};
    111     std::vector<int> outVE(2);
    112     hidl_vec<uint8_t> _dataVE;
    113     hidl_vec<uint32_t> _dimsVE;
    114     _dataVE.setToExternal((uint8_t*)dataVE.data(), dataVE.size()*sizeof(int));
    115     _dimsVE.setToExternal((uint32_t*)dimsVE.data(), dimsVE.size());
    116     // intx2 to represent point2 which is {int, int}
    117     Element elementVE = context->elementCreate(DataType::SIGNED_32, DataKind::USER, false, 2);
    118     ASSERT_NE(Element(0), elementVE);
    119 
    120     context->scriptSetVarVE(script, mExportVarIdx_var_point2, _dataVE, elementVE, _dimsVE);
    121     context->scriptGetVarV(script, mExportVarIdx_var_point2, 2*sizeof(int),
    122                            [&](const hidl_vec<uint8_t>& _data){
    123                                outVE = std::vector<int>(
    124                                    (int*)_data.data(), (int*)_data.data() + 2); });
    125     EXPECT_EQ(1000, outVE[0]);
    126     EXPECT_EQ(1001, outVE[1]);
    127 }
    128 
    129 /*
    130  * Create a user script struct_test, and input and output Allocations.
    131  * Verified the foreach launch correctly for the invoke kernel.
    132  *
    133  * Calls: scriptCCreate, scriptInvoke, scriptGetVarV, scriptInvokeV
    134  */
    135 TEST_F(RenderscriptHidlTest, ScriptInvokeTest) {
    136     hidl_vec<uint8_t> bitcode;
    137     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    138     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    139     ASSERT_NE(Script(0), script);
    140 
    141     // invoke test
    142     int resultI = 0;
    143     long resultJ = 0l;
    144     float resultF = 0.0f;
    145     double resultD = 0.0;
    146     uint32_t resultV = 0u;
    147     std::vector<int> resultVE(2);
    148     context->scriptInvoke(script, mExportFuncIdx_function);
    149     context->scriptGetVarV(script, mExportVarIdx_var_int, sizeof(int),
    150                            [&](const hidl_vec<uint8_t>& _data){ resultI = *((int*)_data.data()); });
    151     context->scriptGetVarV(script, mExportVarIdx_var_long, sizeof(long),
    152                            [&](const hidl_vec<uint8_t>& _data){
    153                                resultJ = *((long*)_data.data()); });
    154     context->scriptGetVarV(script, mExportVarIdx_var_float, sizeof(float),
    155                            [&](const hidl_vec<uint8_t>& _data){
    156                                resultF = *((float*)_data.data()); });
    157     context->scriptGetVarV(script, mExportVarIdx_var_double, sizeof(double),
    158                            [&](const hidl_vec<uint8_t>& _data){
    159                                resultD = *((double*)_data.data()); });
    160     context->scriptGetVarV(script, mExportVarIdx_var_uint32_t, sizeof(uint32_t),
    161                            [&](const hidl_vec<uint8_t>& _data){
    162                                resultV = *((uint32_t*)_data.data()); });
    163     context->scriptGetVarV(script, mExportVarIdx_var_point2, 2*sizeof(int),
    164                            [&](const hidl_vec<uint8_t>& _data){
    165                                resultVE = std::vector<int>(
    166                                    (int*)_data.data(), (int*)_data.data() + 2); });
    167     EXPECT_EQ(1, resultI);
    168     EXPECT_EQ(2l, resultJ);
    169     EXPECT_EQ(3.0f, resultF);
    170     EXPECT_EQ(4.0, resultD);
    171     EXPECT_EQ(5u, resultV);
    172     EXPECT_EQ(6, resultVE[0]);
    173     EXPECT_EQ(7, resultVE[1]);
    174 
    175     // invokeV test
    176     int functionV_arg = 5;
    177     int functionV_res = 0;
    178     hidl_vec<uint8_t> functionV_data;
    179     functionV_data.setToExternal((uint8_t*)&functionV_arg, sizeof(int));
    180     context->scriptInvokeV(script, mExportFuncIdx_functionV, functionV_data);
    181     context->scriptGetVarV(script, mExportVarIdx_var_int, sizeof(int),
    182                            [&](const hidl_vec<uint8_t>& _data){
    183                                functionV_res = *((int*)_data.data()); });
    184     EXPECT_EQ(5, functionV_res);
    185 }
    186 
    187 /*
    188  * Create a user script struct_test, and input and output Allocations.
    189  * Verified the foreach launch correctly for the foreach kernel.
    190  *
    191  * Calls: scriptCCreate, elementCreate, typeCreate, allocationCreateTyped,
    192  * allocation1DWrite, scriptForEach, allocationRead
    193  */
    194 TEST_F(RenderscriptHidlTest, ScriptForEachTest) {
    195     hidl_vec<uint8_t> bitcode;
    196     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    197     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    198     ASSERT_NE(Script(0), script);
    199 
    200     // uint8_t
    201     Element element = context->elementCreate(DataType::UNSIGNED_8, DataKind::USER, false, 1);
    202     ASSERT_NE(Element(0), element);
    203 
    204     // 64 x uint8_t
    205     Type type = context->typeCreate(element, 64, 0, 0, false, false, YuvFormat::YUV_NONE);
    206     ASSERT_NE(Type(0), type);
    207 
    208     std::vector<uint8_t> dataIn(64), dataOut(64), expected(64);
    209     std::generate(dataIn.begin(), dataIn.end(), [](){ static uint8_t val = 0; return val++; });
    210     std::generate(expected.begin(), expected.end(), [](){ static uint8_t val = 1; return val++; });
    211     hidl_vec<uint8_t> _data;
    212     _data.setToExternal((uint8_t*)dataIn.data(), dataIn.size());
    213     // 64 x float1
    214     Allocation allocation = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    215                                                            (int)AllocationUsageType::SCRIPT,
    216                                                            (Ptr)nullptr);
    217     ASSERT_NE(Allocation(0), allocation);
    218 
    219     Allocation vout = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    220                                                      (int)AllocationUsageType::SCRIPT,
    221                                                      (Ptr)nullptr);
    222     ASSERT_NE(Allocation(0), vout);
    223 
    224     context->allocation1DWrite(allocation, 0, 0, (Size)dataIn.size(), _data);
    225     hidl_vec<Allocation> vains;
    226     vains.setToExternal(&allocation, 1);
    227     hidl_vec<uint8_t> params;
    228     context->scriptForEach(script, mExportForEachIdx_increment, vains, vout, params, nullptr);
    229     context->allocationRead(vout, (Ptr)dataOut.data(), (Size)dataOut.size()*sizeof(uint8_t));
    230     EXPECT_EQ(expected, dataOut);
    231 }
    232 
    233 /*
    234  * Create a user script struct_test, and input and output Allocations.
    235  * Verified the foreach launch correctly for the reduction kernel.
    236  *
    237  * Calls: scriptCCreate, elementCreate, typeCreate, allocationCreateTyped,
    238  * allocation1DWrite, scriptReduce, contextFinish, allocationRead
    239  */
    240 TEST_F(RenderscriptHidlTest, ScriptReduceTest) {
    241     hidl_vec<uint8_t> bitcode;
    242     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    243     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    244     ASSERT_NE(Script(0), script);
    245 
    246     // uint8_t
    247     Element element = context->elementCreate(DataType::SIGNED_32, DataKind::USER, false, 1);
    248     ASSERT_NE(Element(0), element);
    249 
    250     // 64 x uint8_t
    251     Type type = context->typeCreate(element, 64, 0, 0, false, false, YuvFormat::YUV_NONE);
    252     ASSERT_NE(Type(0), type);
    253 
    254     Type type2 = context->typeCreate(element, 1, 0, 0, false, false, YuvFormat::YUV_NONE);
    255     ASSERT_NE(Type(0), type2);
    256 
    257     std::vector<int> dataIn(64), dataOut(1);
    258     std::generate(dataIn.begin(), dataIn.end(), [](){ static int val = 0; return val++; });
    259     hidl_vec<uint8_t> _data;
    260     _data.setToExternal((uint8_t*)dataIn.data(), dataIn.size()*sizeof(int));
    261     // 64 x float1
    262     Allocation allocation = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    263                                                            (int)AllocationUsageType::SCRIPT,
    264                                                            (Ptr)nullptr);
    265     ASSERT_NE(Allocation(0), allocation);
    266 
    267     Allocation vaout = context->allocationCreateTyped(type2, AllocationMipmapControl::NONE,
    268                                                       (int)AllocationUsageType::SCRIPT,
    269                                                       (Ptr)nullptr);
    270     ASSERT_NE(Allocation(0), vaout);
    271 
    272     context->allocation1DWrite(allocation, 0, 0, (Size)dataIn.size(), _data);
    273     hidl_vec<Allocation> vains;
    274     vains.setToExternal(&allocation, 1);
    275     context->scriptReduce(script, mExportReduceIdx_summation, vains, vaout, nullptr);
    276     context->contextFinish();
    277     context->allocationRead(vaout, (Ptr)dataOut.data(), (Size)dataOut.size()*sizeof(int));
    278     // sum of 0, 1, 2, ..., 62, 63
    279     int sum = 63*64/2;
    280     EXPECT_EQ(sum, dataOut[0]);
    281 }
    282 
    283 /*
    284  * This test creates an allocation and binds it to a data segment in the
    285  * RenderScript script, represented in the bitcode.
    286  *
    287  * Calls: scriptCCreate, elementCreate, typeCreate, allocationCreateTyped,
    288  * allocation1DWrite, scriptBindAllocation, scriptSetVarV, scriptBindAllocation,
    289  * allocationRead, scriptInvokeV, allocationRead
    290  */
    291 TEST_F(RenderscriptHidlTest, ScriptBindTest) {
    292     hidl_vec<uint8_t> bitcode;
    293     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    294     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    295     ASSERT_NE(Script(0), script);
    296 
    297     // in32
    298     Element element = context->elementCreate(DataType::SIGNED_32, DataKind::USER, false, 1);
    299     ASSERT_NE(Element(0), element);
    300 
    301     // 64 x int32
    302     Type type = context->typeCreate(element, 64, 0, 0, false, false, YuvFormat::YUV_NONE);
    303     ASSERT_NE(Type(0), type);
    304 
    305     // 64 x int32
    306     Allocation allocation = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    307                                                            (int)AllocationUsageType::SCRIPT,
    308                                                            (Ptr)nullptr);
    309     ASSERT_NE(Allocation(0), allocation);
    310 
    311     std::vector<int> dataIn(64), dataOut(64), expected(64, 5);
    312     hidl_vec<uint8_t> _data;
    313     _data.setToExternal((uint8_t*)dataIn.data(), dataIn.size()*sizeof(int));
    314     context->allocation1DWrite(allocation, 0, 0, (Size)dataIn.size(), _data);
    315     context->scriptBindAllocation(script, allocation, mExportVarIdx_var_int_ptr);
    316     int dim = 64;
    317     hidl_vec<uint8_t> _dim;
    318     _dim.setToExternal((uint8_t*)&dim, sizeof(int));
    319     context->scriptInvokeV(script, mExportFuncIdx_setBuffer, _dim);
    320     context->allocationRead(allocation, (Ptr)dataOut.data(), (Size)dataOut.size()*sizeof(int));
    321     EXPECT_EQ(expected, dataOut);
    322 }
    323 
    324 /*
    325  * This test groups together two RenderScript intrinsic kernels to run one after
    326  * the other asynchronously with respect to the client. The test configures
    327  * Blend and Blur, and links them together such that Blur will execute after
    328  * Blend and use its result. The test checks the data returned to make sure it
    329  * was changed after passing through the entire ScriptGroup.
    330  *
    331  * Calls: elementCreate, typeCreate, allocationCreateTyped, allocation2DWrite,
    332  * scriptIntrinsicCreate, scriptKernelIDCreate, scriptFieldIDCreate,
    333  * scriptGroupCreate, scriptGroupSetInput, scriptGroupSetOutput,
    334  * scriptGroupExecute, contextFinish, allocation2DRead
    335  */
    336 TEST_F(RenderscriptHidlTest, ScriptGroupTest) {
    337     std::vector<uint8_t> dataIn(256 * 256 * 4, 128), dataOut(256 * 256 * 4, 0),
    338         zeros(256 * 256 * 4, 0);
    339     hidl_vec<uint8_t> _dataIn, _dataOut;
    340     _dataIn.setToExternal(dataIn.data(), dataIn.size());
    341     _dataOut.setToExternal(dataOut.data(), dataOut.size());
    342 
    343     // 256 x 256 YUV pixels
    344     Element element1 = context->elementCreate(DataType::UNSIGNED_8,
    345                                               DataKind::PIXEL_RGBA, true, 4);
    346     ASSERT_NE(Element(0), element1);
    347 
    348     Type type1 = context->typeCreate(element1, 256, 256, 0, false, false,
    349                                      YuvFormat::YUV_NONE);
    350     ASSERT_NE(Type(0), type1);
    351 
    352     Allocation allocation1 = context->allocationCreateTyped(type1, AllocationMipmapControl::NONE,
    353                                                            (int)AllocationUsageType::SCRIPT,
    354                                                            (Ptr)nullptr);
    355     ASSERT_NE(Allocation(0), allocation1);
    356 
    357     context->allocation2DWrite(allocation1, 0, 0, 0, AllocationCubemapFace::POSITIVE_X, 256, 256,
    358                                _dataIn, 0);
    359 
    360     // 256 x 256 RGBA pixels
    361     Element element2 = context->elementCreate(DataType::UNSIGNED_8, DataKind::PIXEL_RGBA, true, 4);
    362     ASSERT_NE(Element(0), element2);
    363 
    364     Type type2 = context->typeCreate(element2, 256, 256, 0, false, false, YuvFormat::YUV_NONE);
    365     ASSERT_NE(Type(0), type2);
    366 
    367     Allocation allocation2 = context->allocationCreateTyped(type2, AllocationMipmapControl::NONE,
    368                                                            (int)AllocationUsageType::SCRIPT,
    369                                                            (Ptr)nullptr);
    370     ASSERT_NE(Allocation(0), allocation2);
    371 
    372     context->allocation2DWrite(allocation2, 0, 0, 0, AllocationCubemapFace::POSITIVE_X, 256, 256,
    373                                _dataOut, 0);
    374 
    375     // create scripts
    376     Script blend =
    377         context->scriptIntrinsicCreate(ScriptIntrinsicID::ID_BLEND, element1);
    378     ASSERT_NE(Script(0), blend);
    379 
    380     ScriptKernelID blendKID = context->scriptKernelIDCreate(blend, 1, 3);
    381     ASSERT_NE(ScriptKernelID(0), blendKID);
    382 
    383     Script blur = context->scriptIntrinsicCreate(ScriptIntrinsicID::ID_BLUR, element2);
    384     ASSERT_NE(Script(0), blur);
    385 
    386     ScriptKernelID blurKID = context->scriptKernelIDCreate(blur, 0, 2);
    387     ASSERT_NE(ScriptKernelID(0), blurKID);
    388 
    389     ScriptFieldID blurFID = context->scriptFieldIDCreate(blur, 1);
    390     ASSERT_NE(ScriptFieldID(0), blurFID);
    391 
    392     // ScriptGroup
    393     hidl_vec<ScriptKernelID> kernels = {blendKID, blurKID};
    394     hidl_vec<ScriptKernelID> srcK = {blendKID};
    395     hidl_vec<ScriptKernelID> dstK = {ScriptKernelID(0)};
    396     hidl_vec<ScriptFieldID> dstF = {blurFID};
    397     hidl_vec<Type> types = {type2};
    398     ScriptGroup scriptGroup = context->scriptGroupCreate(kernels, srcK, dstK, dstF, types);
    399     ASSERT_NE(ScriptGroup(0), scriptGroup);
    400 
    401     context->scriptGroupSetInput(scriptGroup, blendKID, allocation1);
    402     context->scriptGroupSetOutput(scriptGroup, blurKID, allocation2);
    403     context->scriptGroupExecute(scriptGroup);
    404     context->contextFinish();
    405 
    406     // verify contents were changed
    407     context->allocation2DRead(allocation2, 0, 0, 0, AllocationCubemapFace::POSITIVE_X, 256, 256,
    408                               (Ptr)dataOut.data(), (Size)dataOut.size(), 0);
    409     EXPECT_NE(zeros, dataOut);
    410 }
    411 
    412 /*
    413  * Similar to the ScriptGroup test, this test verifies the execution flow of
    414  * RenderScript kernels and invokables.
    415  *
    416  * Calls: scriptCCreate, elementCreate, typeCreate, allocationCreateTyped,
    417  * allocation1DWrite, scriptFieldIDCreate, scriptInvokeIDCreate,
    418  * invokeClosureCreate, closureCreate, closureSetGlobal, scriptGroup2Create,
    419  * scriptGroupExecute, allocationRead
    420  */
    421 TEST_F(RenderscriptHidlTest, ScriptGroup2Test) {
    422     hidl_vec<uint8_t> bitcode;
    423     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    424     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    425     ASSERT_NE(Script(0), script);
    426 
    427     std::vector<uint8_t> dataIn(128, 128), dataOut(128, 0), expected(128, 7+1);
    428     hidl_vec<uint8_t> _dataIn, _dataOut;
    429     _dataIn.setToExternal(dataIn.data(), dataIn.size());
    430 
    431     // 256 x 256 YUV pixels
    432     Element element = context->elementCreate(DataType::UNSIGNED_8, DataKind::USER, false, 1);
    433     ASSERT_NE(Element(0), element);
    434 
    435     Type type = context->typeCreate(element, 128, 0, 0, false, false, YuvFormat::YUV_NONE);
    436     ASSERT_NE(Type(0), type);
    437 
    438     Allocation allocation = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    439                                                            (int)AllocationUsageType::SCRIPT,
    440                                                            (Ptr)nullptr);
    441     ASSERT_NE(Allocation(0), allocation);
    442 
    443     context->allocation1DWrite(allocation, 0, 0, (Size)_dataIn.size(), _dataIn);
    444 
    445     ScriptFieldID fieldID = context->scriptFieldIDCreate(script, mExportVarIdx_var_allocation);
    446     ASSERT_NE(ScriptFieldID(0), fieldID);
    447 
    448     // invoke
    449     ScriptInvokeID invokeID = context->scriptInvokeIDCreate(script, mExportFuncIdx_setAllocation);
    450     ASSERT_NE(ScriptInvokeID(0), invokeID);
    451 
    452     int dim = 128;
    453     hidl_vec<uint8_t> params;
    454     params.setToExternal((uint8_t*)&dim, sizeof(dim));
    455     hidl_vec<ScriptFieldID> fieldIDS1 = {fieldID};
    456     hidl_vec<int64_t> values1 = {int64_t(0)};
    457     hidl_vec<int32_t> sizes1 = {int32_t(0)};
    458     Closure closure1 = context->invokeClosureCreate(invokeID, params, fieldIDS1, values1, sizes1);
    459     ASSERT_NE(Closure(0), closure1);
    460 
    461     // kernel
    462     ScriptKernelID kernelID = context->scriptKernelIDCreate(script, mExportForEachIdx_increment, 3);
    463     ASSERT_NE(ScriptKernelID(0), kernelID);
    464 
    465     hidl_vec<ScriptFieldID> fieldIDS2 = {ScriptFieldID(0)};
    466     hidl_vec<int64_t> values2 = {(int64_t)(intptr_t)allocation};
    467     hidl_vec<int32_t> sizes2 = {-1 /* allocation */};
    468     hidl_vec<Closure> depClosures2 = {closure1};
    469     hidl_vec<ScriptFieldID> depFieldIDS2 = {fieldID};
    470     Closure closure2 = context->closureCreate(kernelID, allocation /* returnValue */, fieldIDS2,
    471                                               values2, sizes2, depClosures2, depFieldIDS2);
    472     ASSERT_NE(Closure(0), closure2);
    473 
    474     // set argument
    475     context->closureSetGlobal(closure1, fieldID, (int64_t)(intptr_t)allocation,
    476                               -1 /* allocation */);
    477 
    478     // execute
    479     hidl_string name = "script_group_2_test";
    480     hidl_string cacheDir = "/data/local/tmp";
    481     hidl_vec<Closure> closures = {closure1, closure2};
    482     ScriptGroup2 scriptGroup2 = context->scriptGroup2Create(name, cacheDir, closures);
    483     ASSERT_NE(ScriptGroup2(0), scriptGroup2);
    484 
    485     context->scriptGroupExecute(scriptGroup2);
    486     context->allocationRead(allocation, (Ptr)dataOut.data(), (Size)dataOut.size()*sizeof(uint8_t));
    487     EXPECT_EQ(expected, dataOut);
    488 }
    489 
    490 /*
    491  * Similar to the ScriptGroup test, this test verifies a single kernel can be
    492  * called by ScriptGroup with an unbound allocation specified before launch
    493  *
    494  * Calls: scriptCCreate, elementCreate, typeCreate, allocationCreateTyped,
    495  * allocation1DWrite, scriptKernelIDCreate, closureCreate, closureSetArg,
    496  * scriptGroup2Create, scriptGroupExecute, allocationRead
    497  */
    498 TEST_F(RenderscriptHidlTest, ScriptGroup2KernelTest) {
    499     hidl_vec<uint8_t> bitcode;
    500     bitcode.setToExternal((uint8_t*)bitCode, bitCodeLength);
    501     Script script = context->scriptCCreate("struct_test", "/data/local/tmp/", bitcode);
    502     ASSERT_NE(Script(0), script);
    503 
    504     std::vector<uint8_t> dataIn(128, 128), dataOut(128, 0), expected(128, 128 + 1);
    505     hidl_vec<uint8_t> _dataIn, _dataOut;
    506     _dataIn.setToExternal(dataIn.data(), dataIn.size());
    507 
    508     // 256 x 256 YUV pixels
    509     Element element = context->elementCreate(DataType::UNSIGNED_8, DataKind::USER, false, 1);
    510     ASSERT_NE(Element(0), element);
    511 
    512     Type type = context->typeCreate(element, 128, 0, 0, false, false, YuvFormat::YUV_NONE);
    513     ASSERT_NE(Type(0), type);
    514 
    515     Allocation allocation = context->allocationCreateTyped(type, AllocationMipmapControl::NONE,
    516                                                            (int)AllocationUsageType::SCRIPT,
    517                                                            (Ptr)nullptr);
    518     ASSERT_NE(Allocation(0), allocation);
    519 
    520     context->allocation1DWrite(allocation, 0, 0, (Size)_dataIn.size(), _dataIn);
    521 
    522     // kernel
    523     ScriptKernelID kernelID = context->scriptKernelIDCreate(script, mExportForEachIdx_increment, 3);
    524     ASSERT_NE(ScriptKernelID(0), kernelID);
    525 
    526     hidl_vec<ScriptFieldID> fieldIDS = {ScriptFieldID(0)};
    527     hidl_vec<int64_t> values = {int64_t(0)};
    528     hidl_vec<int32_t> sizes = {int32_t(0)};
    529     hidl_vec<Closure> depClosures = {Closure(0)};
    530     hidl_vec<ScriptFieldID> depFieldIDS = {ScriptFieldID(0)};
    531     Closure closure = context->closureCreate(kernelID, allocation /* returnValue */, fieldIDS,
    532                                               values, sizes, depClosures, depFieldIDS);
    533     ASSERT_NE(Closure(0), closure);
    534 
    535     // set argument
    536     context->closureSetArg(closure, 0 /* first argument */, (Ptr)allocation, -1);
    537 
    538     // execute
    539     hidl_string name = "script_group_2_test";
    540     hidl_string cacheDir = "/data/local/tmp";
    541     hidl_vec<Closure> closures = {closure};
    542     ScriptGroup2 scriptGroup2 = context->scriptGroup2Create(name, cacheDir, closures);
    543     ASSERT_NE(ScriptGroup2(0), scriptGroup2);
    544 
    545     context->scriptGroupExecute(scriptGroup2);
    546     context->allocationRead(allocation, (Ptr)dataOut.data(), (Size)dataOut.size()*sizeof(uint8_t));
    547     EXPECT_EQ(expected, dataOut);
    548 }
    549