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