Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RenderScript code not working without rsDebug

I'm completely new to RenderScript. I was trying to get a simple example shown by Romain Guy in http://www.youtube.com/watch?v=5jz0kSuR2j4 working.

First off, here's the code.

MainActivity.java

    package com.example.rsgray;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.renderscript.Allocation;
    import android.renderscript.RenderScript;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;
    import android.widget.ImageView.ScaleType;

    public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    ImageView iv = new ImageView(this);
    iv.setScaleType(ScaleType.CENTER_CROP);
    setContentView(iv);

    drawGrayScale(iv, R.drawable.tulips);
}

private void drawGrayScale(ImageView iv, int image) {
    Bitmap in = BitmapFactory.decodeResource(getResources(), image);
    Bitmap out = Bitmap.createBitmap(in.getWidth(), in.getHeight(), in.getConfig());

    RenderScript rs = RenderScript.create(MainActivity.this);
    Allocation inAlloc = Allocation.createFromBitmap(rs, in);
    Allocation outAlloc = Allocation.createTyped(rs, inAlloc.getType());

    ScriptC_gray script = new ScriptC_gray(rs, getResources(), R.raw.gray);
    script.set_in(inAlloc);
    script.set_out(outAlloc);
    script.set_script(script);

    script.invoke_filter();

    outAlloc.copyTo(out);
    iv.setImageBitmap(out);
}

}

gray.rs

    #pragma version(1)
    #pragma rs java_package_name(com.example.rsgray)
    #pragma rs_fp_relaxed

    rs_allocation in;
    rs_allocation out;
    rs_script script;

    const static float3 gray = { 0.3f, 0.6f, 0.1f };

    void root(const uchar4* v_in, uchar4* v_out, const void* usrData, uint32_t x, uint32_t y) {
        rsDebug("gray.rs", rsUptimeMillis());
        float4 inPixel = rsUnpackColor8888(*v_in);
        float3 result = dot(inPixel.rgb, gray);
        *v_out = rsPackColorTo8888(result);
    }


    void filter() {
        rsForEach(script, in, out);
    }

and finally, AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.rsgray"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.rsgray.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

res/drawable-nodpi contains tulips.jpg. You won't find the rsDebug() statement that I've added in gray.rs in Romain Guy's code.

Anyway, the code compiles, with or without rsDebug(). However, the problem starts when I try to run the app on a device.

I tried to run the app on my Nexus 4 running Android 4.4. With the code as shown, it works fine and I get a greyscale image. However, if I comment out the rsDebug() line, the app does not work. I just get a black screen.

Here is the logcat output.

  1. With rsDebug() :

    11-26 16:22:41.563: D/dalvikvm(21523): GC_FOR_ALLOC freed 69K, 2% free 9046K/9148K, paused 16ms, total 16ms
    11-26 16:22:41.573: I/dalvikvm-heap(21523): Grow heap (frag case) to 11.862MB for 3145744-byte allocation
    11-26 16:22:41.603: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 12118K/12224K, paused 30ms, total 30ms
    11-26 16:22:41.683: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 12117K/12224K, paused 11ms, total 11ms
    11-26 16:22:41.693: I/dalvikvm-heap(21523): Grow heap (frag case) to 14.862MB for 3145744-byte allocation
    11-26 16:22:41.703: D/dalvikvm(21523): GC_FOR_ALLOC freed 0K, 1% free 15189K/15300K, paused 14ms, total 14ms
    11-26 16:22:41.753: V/RenderScript(21523): 0x74ed5020 Launching thread(s), CPUs 4
    11-26 16:22:41.753: W/Adreno-RS(21523): <rsdVendorAllocationDestroyQCOM:194>: rsdVendorAllocationDestroy: No context!
    11-26 16:22:41.753: E/RenderScript(21523): Successfully loaded runtime: libRSDriver_adreno.so
    11-26 16:22:41.783: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 15201K/15300K, paused 11ms, total 11ms
    11-26 16:22:41.803: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 15202K/15300K, paused 11ms, total 12ms
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdCompileBitcode:289>: Header check (bitcode_SHA1) failed for /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray-adreno.meta
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdDumpCompileLog:499>: Build log for gray: RS code uses long(i64) data type
    11-26 16:22:41.813: W/Adreno-RS(21523): RS bitcode does not contain an invokable compute root
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdVendorScriptInitQCOM:610>: ERROR: __BuildProgram returned -11
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906  0x114d6ba
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906  0x114d6ba
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906  0x114d6ba
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906  0x114d6ba
    .
    . a million more such lines
    .
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771  0x114e1eb
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771  0x114e1eb
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771  0x114e1eb
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771  0x114e1eb
    11-26 16:22:44.717: I/Adreno-EGL(21523): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM build:  (CL3776187)
    11-26 16:22:44.717: I/Adreno-EGL(21523): OpenGL ES Shader Compiler Version: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Build Date: 10/15/13 Tue
    11-26 16:22:44.717: I/Adreno-EGL(21523): Local Branch: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Remote Branch: partner/upstream
    11-26 16:22:44.717: I/Adreno-EGL(21523): Local Patches: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Reconstruct Branch: 
    11-26 16:22:44.747: D/OpenGLRenderer(21523): Enabling debug mode 0
    
  2. Without rsDebug() :

    11-26 16:23:41.327: D/dalvikvm(21902): GC_FOR_ALLOC freed 56K, 1% free 9046K/9136K, paused 18ms, total 18ms
    11-26 16:23:41.337: I/dalvikvm-heap(21902): Grow heap (frag case) to 11.862MB for 3145744-byte allocation
    11-26 16:23:41.367: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 12118K/12212K, paused 27ms, total 27ms
    11-26 16:23:41.427: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 12117K/12212K, paused 11ms, total 11ms
    11-26 16:23:41.437: I/dalvikvm-heap(21902): Grow heap (frag case) to 14.862MB for 3145744-byte allocation
    11-26 16:23:41.447: D/dalvikvm(21902): GC_FOR_ALLOC freed 0K, 1% free 15189K/15288K, paused 12ms, total 12ms
    11-26 16:23:41.477: V/RenderScript(21902): 0x74ed4f18 Launching thread(s), CPUs 4
    11-26 16:23:41.477: W/Adreno-RS(21902): <rsdVendorAllocationDestroyQCOM:194>: rsdVendorAllocationDestroy: No context!
    11-26 16:23:41.477: E/RenderScript(21902): Successfully loaded runtime: libRSDriver_adreno.so
    11-26 16:23:41.507: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 15201K/15288K, paused 12ms, total 13ms
    11-26 16:23:41.527: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 15202K/15288K, paused 12ms, total 12ms
    11-26 16:23:41.537: D/bcc(21902): Cache /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray.o.info is dirty due to the source it dependends on has been changed:
    11-26 16:23:43.419: I/Adreno-EGL(21902): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM build:  (CL3776187)
    11-26 16:23:43.419: I/Adreno-EGL(21902): OpenGL ES Shader Compiler Version: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Build Date: 10/15/13 Tue
    11-26 16:23:43.419: I/Adreno-EGL(21902): Local Branch: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Remote Branch: partner/upstream
    11-26 16:23:43.419: I/Adreno-EGL(21902): Local Patches: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Reconstruct Branch: 
    11-26 16:23:43.449: D/OpenGLRenderer(21902): Enabling debug mode 0
    

I can not understand how a debug statement can affect the way in which the app runs. Any help on why I'm facing this problem would be much appreciated.

So that's the first part of my problem.

The second part : When I try to run the exact same code on the Galaxy Note 10.1 N8013 running Android 4.1.2 and on another piece of hardware with the APQ8064, also running Android 4.1.2, the app does not work.

Here's the logcat output with my hardware :

    01-02 00:00:51.043: E/Trace(1684): error opening trace file: No such file or directory (2)
    01-02 00:00:51.043: D/ActivityThread(1684): setTargetHeapUtilization:0.25
    01-02 00:00:51.043: D/ActivityThread(1684): setTargetHeapIdealFree:8388608
    01-02 00:00:51.053: D/ActivityThread(1684): setTargetHeapConcurrentStart:2097152
    01-02 00:00:51.183: V/RenderScript(1684): rsContextCreate dev=0x7276fdd0
    01-02 00:00:51.183: V/RenderScript(1684): 0x616350e0 Launching thread(s), CPUs 4
    01-02 00:00:51.203: V/ScriptC(1684): Create script for resource = gray
    01-02 00:00:51.203: E/bcc(1684): CPU is krait2
    01-02 00:00:51.274: W/bcc(1684): Unable to open /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray.o in read mode.  (reason: No such file or directory)
    01-02 00:00:51.404: A/libc(1684): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1701 (.example.rsgray)

And finally, here's the logcat output with the Samsung tablet :

    01-02 10:34:47.470: D/dalvikvm(19022): GC_FOR_ALLOC freed 48K, 11% free 7046K/7875K, paused 13ms, total 13ms
    01-02 10:34:47.475: I/dalvikvm-heap(19022): Grow heap (frag case) to 10.495MB for 3145744-byte allocation
    01-02 10:34:47.495: D/dalvikvm(19022): GC_CONCURRENT freed <1K, 9% free 10117K/11015K, paused 11ms+1ms, total 18ms
    01-02 10:34:47.585: D/dalvikvm(19022): GC_FOR_ALLOC freed <1K, 9% free 10117K/11015K, paused 10ms, total 10ms
    01-02 10:34:47.590: I/dalvikvm-heap(19022): Grow heap (frag case) to 13.494MB for 3145744-byte allocation
    01-02 10:34:47.610: D/dalvikvm(19022): GC_CONCURRENT freed <1K, 7% free 13189K/14151K, paused 11ms+3ms, total 23ms
    01-02 10:34:47.610: D/dalvikvm(19022): WAIT_FOR_CONCURRENT_GC blocked 12ms
    01-02 10:34:47.610: V/RenderScript(19022): rsContextCreate dev=0x40e3b288
    01-02 10:34:47.615: V/RenderScript(19022): 0x411e3008 Launching thread(s), CPUs 3
    01-02 10:34:47.625: V/ScriptC(19022): Create script for resource = gray
    01-02 10:34:47.625: I/bcc(19022): LIBBCC build time: 2013/01/09 23:19:52
    01-02 10:34:47.625: I/bcc(19022): LIBBCC build revision: Unknown (not git)
    01-02 10:34:47.645: D/StopWatch(19022): StopWatch calcFileSHA1 time (us): 17719 
    01-02 10:34:47.650: D/StopWatch(19022): StopWatch calcFileSHA1 time (us): 3031 
    01-02 10:34:47.650: W/bcc(19022): Unable to open file in read mode.  (reason: No such file or directory)
    01-02 10:34:47.750: A/libc(19022): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19053 (.example.rsgray)

That's about it. If anyone has any idea how to interpret this, please do let me know.

Thanks!

like image 716
Akshay Avatar asked Nov 01 '22 10:11

Akshay


1 Answers

I've just encountered the same issue. It seems to be fixed when rsDebug is somewhere in the same function. This fixed it for me:

if(x > 0) {
    if(x < 0) {
        rsDebug("Workaround for renderscript bug", 0.0f);
    }

    /* Code */
}

Using this, rsDebug is never actually called, so it will not output anything.

Note this does not work:

if(0) {
    rsDebug("Workaround for renderscript bug", 0.0f);
}

This is probably optimized out.

like image 112
Bart Avatar answered Nov 09 '22 23:11

Bart