Код RenderScript не работает без rsDebug
Я совершенно новичок в RenderScript. Я пытался получить простой пример, показанный Романом Гаем в http://www.youtube.com/watch?v=5jz0kSuR2j4 работе.
Во-первых, вот код.
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);
}
и, наконец, 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 содержит tulips.jpg. Вы не найдете оператора rsDebug(), который я добавил в grey.rs в коде Ромена Гая.
В любом случае, код компилируется с или без rsDebug(). Однако проблема начинается, когда я пытаюсь запустить приложение на устройстве.
Я попытался запустить приложение на моем Nexus 4 под управлением Android 4.4. С кодом, как показано, он работает нормально, и я получаю изображение в оттенках серого. Однако, если я закомментирую строку rsDebug(), приложение не будет работать. У меня просто черный экран.
Вот вывод logcat.
С помощью 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
Без 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
Я не могу понять, как оператор отладки может повлиять на работу приложения. Любая помощь в том, почему я сталкиваюсь с этой проблемой, будет высоко ценится.
Так что это первая часть моей проблемы.
Вторая часть: когда я пытаюсь запустить точно такой же код на Galaxy Note 10.1 N8013 под управлением Android 4.1.2 и на другом оборудовании с APQ8064, также под управлением Android 4.1.2, приложение не работает.
Вот вывод logcat с моим оборудованием:
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)
И, наконец, вот вывод logcat с планшетом Samsung:
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)
Вот и все. Если кто-нибудь знает, как это интерпретировать, пожалуйста, дайте мне знать.
Спасибо!
1 ответ
Я только что столкнулся с той же проблемой. Кажется, это исправлено, когда rsDebug находится где-то в той же функции. Это исправило это для меня:
if(x > 0) {
if(x < 0) {
rsDebug("Workaround for renderscript bug", 0.0f);
}
/* Code */
}
Используя это, rsDebug фактически никогда не вызывается, поэтому он ничего не выводит.
Обратите внимание, это не работает:
if(0) {
rsDebug("Workaround for renderscript bug", 0.0f);
}
Это, вероятно, оптимизировано.