问题
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.
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
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!
回答1:
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.
来源:https://stackoverflow.com/questions/20216172/renderscript-code-not-working-without-rsdebug