14546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond/*
24546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * Copyright (C) 2016 The Android Open Source Project
34546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond *
44546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * Licensed under the Apache License, Version 2.0 (the "License");
54546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * you may not use this file except in compliance with the License.
64546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * You may obtain a copy of the License at
74546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond *
84546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond *      http://www.apache.org/licenses/LICENSE-2.0
94546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond *
104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * Unless required by applicable law or agreed to in writing, software
114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * distributed under the License is distributed on an "AS IS" BASIS,
124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * See the License for the specific language governing permissions and
144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * limitations under the License.
154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond */
164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond/* This application is a simple scheduler for testing the lldb debugger
184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * implementation for general reduction kernels.
194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond *
204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond * It launches one of two simple reductions in a loop
214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond */
224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondpackage com.android.rs.lldbreductiontest;
244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.app.Activity;
264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.content.Context;
274546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.content.res.Resources;
284546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.os.Handler;
294546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.os.Bundle;
304546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.util.Log;
314546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport android.renderscript.*;
324546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
334546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport java.lang.Float;
344546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport java.lang.Math;
354546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport java.util.ArrayList;
364546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport java.util.Arrays;
374546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport java.util.Random;
384546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
394546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondpublic class MainActivity extends Activity {
404546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  static private int idxOffset = 10;
414546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  static private int mX = 128;
424546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  static private int mY = 2;
434546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  static private int mZ = 2;
444546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  static private float mMultiplier = 2.f;
454546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private RenderScript mRS;
464546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private ScriptC_reduce mScript;
474546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private ScriptC_reduce_auto_comb mScript_auto_comb;
484546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
494546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  @Override
504546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  protected void onCreate(Bundle savedInstanceState) {
514546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    super.onCreate(savedInstanceState);
524546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    initRS();
534546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
544546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    int loopDelayMillis = 1000;
554546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    Handler loopHandler = new Handler();
564546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    loopHandler.postDelayed(new Runnable() {
574546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      @Override
584546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      public void run() {
594546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        runRS();
604546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        loopHandler.postDelayed(this, loopDelayMillis);
614546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      }
624546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    }, loopDelayMillis);
634546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
644546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
654546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private float findMinUserTypeAutoComb(
664546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      RenderScript rs, ScriptC_reduce_auto_comb s, Allocation alloc) {
674546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_a_startval(mX);
684546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_b_startval(mY);
694546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_multiplier(mMultiplier);
704546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
714546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    return s.reduce_find_min_user_type_auto_comb(alloc).get();
724546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
734546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
744546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private float findMinUserType(RenderScript rs, ScriptC_reduce s, Allocation alloc) {
754546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_a_startval(mX);
764546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_b_startval(mY);
774546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    s.set_multiplier(mMultiplier);
784546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
794546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    return s.reduce_find_min_user_type(alloc).get();
804546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
814546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
824546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private float findMinUserType1DAutoComb(RenderScript rs, ScriptC_reduce_auto_comb s, int xCount) {
834546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    ScriptField_MinUserType minUserType = new ScriptField_MinUserType(rs, xCount);
844546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    for (int i = 0; i < xCount; i++) {
854546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      ScriptField_MinUserType.Item val = new ScriptField_MinUserType.Item();
864546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      val.a = i + idxOffset;
874546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      val.b = i + idxOffset;
884546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      minUserType.set(val, i, true);
894546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    }
904546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
914546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    Allocation alloc = minUserType.getAllocation();
924546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
934546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    return findMinUserTypeAutoComb(rs, s, alloc);
944546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
954546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
964546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  private float findMinUserType1D(RenderScript rs, ScriptC_reduce s, int xCount) {
974546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    ScriptField_MinUserType minUserType = new ScriptField_MinUserType(rs, xCount);
984546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    for (int i = 0; i < xCount; i++) {
994546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      ScriptField_MinUserType.Item val = new ScriptField_MinUserType.Item();
1004546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      val.a = i + idxOffset;
1014546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      val.b = i + idxOffset;
1024546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond      minUserType.set(val, i, true);
1034546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    }
1044546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1054546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    Allocation alloc = minUserType.getAllocation();
1064546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1074546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    return findMinUserType(rs, s, alloc);
1084546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
1094546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  public void initRS() {
1114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    mRS = RenderScript.create(this, RenderScript.ContextType.NORMAL,
1124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        RenderScript.CREATE_FLAG_LOW_LATENCY | RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
1134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    mScript = new ScriptC_reduce(mRS);
1144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    mScript_auto_comb = new ScriptC_reduce_auto_comb(mRS);
1154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
1164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  public void runRS() {
1184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    findMinUserType1D(mRS, mScript, mX);
1194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    findMinUserType1DAutoComb(mRS, mScript_auto_comb, mX);
1204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
1214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  public void onDestroy() {
1234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    mRS.finish();
1244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    mRS.destroy();
1254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond  }
1264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond}
127