17fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni/*
27fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Copyright (C) 2015 The Android Open Source Project
37fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni *
47fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
57fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * in compliance with the License. You may obtain a copy of the License at
67fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni *
77fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * http://www.apache.org/licenses/LICENSE-2.0
87fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni *
97fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Unless required by applicable law or agreed to in writing, software distributed under the License
107fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
117fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * or implied. See the License for the specific language governing permissions and limitations under
127fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * the License.
137fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni */
147fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
157fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Nipackage com.android.rs.test;
167fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
177fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.content.Context;
187fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.content.res.Resources;
197fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.renderscript.*;
207fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.util.Log;
217fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport java.lang.Thread;
227fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport java.util.HashMap;
237fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
247fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Nipublic class UT_script_group2_gatherscatter extends UnitTest {
257fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    private Resources mRes;
267fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
277fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    private static final int ARRAY_SIZE = 256;
287fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
297fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    private static final String TAG = "ScriptGroup2 (GatherScatter)";
307fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
317fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    int[] mArray;
327fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
337fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    protected UT_script_group2_gatherscatter(RSTestCore rstc, Resources res, Context ctx) {
347fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        super(rstc, TAG, ctx);
357fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        mRes = res;
367fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    }
377fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
387fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    public void initializeGlobals(RenderScript RS, ScriptC_addup s) {
397fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        mArray = new int[ARRAY_SIZE * 4];
407fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
417fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        for (int i = 0; i < ARRAY_SIZE; i++) {
427fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            mArray[i*4] = i * 7;
437fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            mArray[i*4 + 1] = i * 7 + 1;
447fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            mArray[i*4 + 2] = i * 7 + 2;
457fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            mArray[i*4 + 3] = i * 7 + 3;
467fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        }
477fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    }
487fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
497fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // This test tests ScriptGroup2 API for handling gather scatter operations
507fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // on global allocations that are passed across kernels in a script group.
517fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // The test sums up all elements in the input int4 array of size ARRAY_SIZE.
527fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // To do so, it adds up the second half of the array to its first half using
537fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // kernel function add() in addsup.rs, and then repeatedly applies the same
547fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // kernel function to the shrinking result arrays until the result is a
557fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // single int4 value.
567fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // These steps are created as a script group by repeatedly adding the
577fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // same kernel function, with the input of one kernel being the output of
587fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // the previous added kernel function.
597fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // Since the kernel function relies on rsGetElementAt to access the counterpart
607fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // of the current element in the second half of the array, the compiler cannot
617fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // fuse it with the other kernel that it dependes on.
627fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // This test verifies an ScriptGroup2 implementation correctly handles such
637fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    // a case.
647fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    public void run() {
657fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        RenderScript pRS = RenderScript.create(mCtx);
667fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        ScriptC_addup s = new ScriptC_addup(pRS);
677fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        pRS.setMessageHandler(mRsMessage);
687fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        initializeGlobals(pRS, s);
697fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
707fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        Allocation input = Allocation.createSized(pRS, Element.I32_4(pRS), ARRAY_SIZE);
717fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        input.copyFrom(mArray);
727fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
73bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(pRS);
747fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
75bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni        ScriptGroup.Input unbound = builder.addInput();
767fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
77bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni        ScriptGroup.Closure c = null;
78bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni        ScriptGroup.Future f = null;
797fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        int stride;
807fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        for (stride = ARRAY_SIZE / 2; stride >= 1; stride >>= 1) {
81bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni            ScriptGroup.Binding binding;
827fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            if (f == null) {
83bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni                binding = new ScriptGroup.Binding(s.getFieldID_a_in(), unbound);
847fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            } else {
85bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni                binding = new ScriptGroup.Binding(s.getFieldID_a_in(), f);
867fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            }
877fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            c = builder.addKernel(s.getKernelID_add(),
887fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni                                  Type.createX(pRS, Element.I32_4(pRS), stride),
89bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni                                  new ScriptGroup.Binding(s.getFieldID_reduction_stride(), stride),
908e607f39757174d088cbc9703ef051b378c6018fYang Ni                                  binding);
917fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            f = c.getReturn();
927fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        }
937fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
94bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni        ScriptGroup group = builder.create("Summation", c.getReturn());
957fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
967fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        if (c == null) {
977fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            return;
987fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        }
997fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
1007fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        int[] a = new int[4];
1017fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        ((Allocation)group.execute(input)[0]).copyTo(a);
1027fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
1037fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        pRS.finish();
1047fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        pRS.destroy();
1057fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni
1067fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        boolean failed = false;
1077fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        for (int i = 0; i < 4; i++) {
1087fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            if (failed == false &&
1097fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni                a[i] != ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2 + i * ARRAY_SIZE) {
1107fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni                Log.e(TAG, "a["+i+"]="+a[i]+", should be "+
1117fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni                      (ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2 + i * ARRAY_SIZE));
1127fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni                failed = true;
1137fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            }
1147fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        }
1157fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        if (failed) {
1167fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            failTest();
1177fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni            return;
1187fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        }
1197fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni        passTest();
1207fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni    }
1217fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni}
122