2014-03-01 35 views
1

在Java中,我有用於爲intPointer創建分配的代碼。但是在renderscript計算之後,我無法獲得分配的值。沒有copyTo(int)方法只有byte [],short [],int [],float [],位圖。RenderScript分配。從分配中讀取int

//Create Allocation 
    Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2); 

    convolution.bind_intPointer(intPointer); 
    convolution.forEach_root(allocationOut); 

    [...] 
    //read Allocation, not working 
    int[] ints = new int[]{0x}; 
    intPointer.copyTo(ints);    //does not overwrite the ints the line above 
    int i = (int)ints[0]; 
    Log.d("ints", String.valueOf(i)); 

的renderScript:

#pragma version(1) 
#pragma rs java_package_name(package com.ap.wificam) 
#pragma rs_fp_imprecise 

rs_allocation input; 
rs_allocation mask; 

int32_t *intPointer = 0; 

void root(uchar4* out, uint32_t x, uint32_t y) { 

    //do some stuff 

    if((sum.x + sum.y + sum.z)/3 > *intPointer) 
     *intPointer = (sum.x + sum.y + sum.z)/3; //wirte data to intPointer 

    *out = convert_uchar4(sum); 
} 

Log.d( 「整數」,將String.valueOf(I));給我D/ints﹕ 19088743 和rsDebug(「rs」,* intPointer); 2045 0x7fd

如何從分配中獲取我的int值?

+0

使用此代碼我可以讀取int: int [] ints = new int [] {0x0,0x0}; intPointer = convolution.get_intPointer(); intPointer.copyTo(ints); int []數組需要有兩個元素。 – Penta

回答

0

您的RenderScript設置似乎是正確的,但我認爲您在正確初始化分配中的數據時遇到問題。

由於您在比較sum平均值是否大於*intPointer時比較了RenderScript內部分配的值,因此您需要確保初始值是您實際期望的值。否則,它會有未初始化的數據,並且大多數時候比較失敗。

我想這就是你想要用int32_t *intPointer = 0;來做的事情,但這不是真正的初始化C中指針數據的正確方法。最簡單的方法是在創建完成後立即從Java執行數據拷貝配置:

Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2); 
intPointer.copy1DRangeFrom(0, 2, new int[2]); 
convolution.bind_intPointer(intPointer); 

這將確保所有的值都是0你RS內核的開始(因爲在Java中,new int[2]創建一個0初始化數組)。

此外,您的代碼可能不完全是線程安全的。由於您將有多個線程同時讀取和寫入該單個地址,因此您可能會遇到同步問題,您得到的最終值可能是也可能不是您所有線程的真正全局最大值。

我建議,而不是做這個,你存儲在分配是一樣大的輸入數據所有(sum.x + sum.y + sum.z)/3值,然後複製分配回給Java和從那裏,做一個簡單的循環,在其數組來找到最大值。

從RenderScript內核中正確地並行化一個最大化算法實際上有點難(如果你感興趣,你可以閱讀我之前發佈的this other answer以獲得更多細節),所以爲了簡單起見,你可能會最好從Java中找到最大值,而不是像我上面提到的那樣。