2

我正在开发一个简单的 Renderscript 应用程序来进行基本的图像处理。它在我的 Nexus 5 上运行良好,但在我的 Shield 平板电脑上运行良好。我有一个与 SurfaceView 大小相同的分配(RGB8888),用法是 Allocation.USAGE_SCRIPT。我有另一个完全相同规格的分配,除了用法是 Allocation.USAGE_SCRIPT | 分配.USAGE_IO_OUTPUT。我的 Renderscript 已被缩减到最低限度(出于显而易见的原因删除了包名称):

#pragma version(1)
#pragma rs java_package_name()
#pragma rs_fp_relaxed

#include "rs_allocation.rsh"
#include "rs_core.rsh"

void root(const uchar4 *inVal, uchar4 *outVal){
    outVal -> rgba = inVal -> rgba;
}

如您所见,它所做的只是将数据从一个分配复制到另一个分配。然后我在绑定到 Surface 的输出分配上调用 iosend()。这会在我的 Nexus 5 上显示图像,但会导致Shield 上的屏幕损坏 ( Image )。腐败的性质让我相信,我不知何故进入了我不应该进入的记忆。

真正令人不安的是,将输入分配复制到位图,将位图复制到输出分配,然后在输出分配上调用 iosend() 在两个平台上都可以正常工作,但完全破坏了我在Tegra K1 的 GPU。

4

0 回答 0