1

I use the following procedure for transferring an array of float numbers to a RenderScript Kernel and it works fine.

float[] w = new float[10];
Allocation w_rs = Allocation.createSized(rs, Element.F32(rs), 10);
w_rs.copy1DRangeFrom(0, 10, w);

I want to use a similar procedure for transferring Float4 values as follows

Float4[] w = new Float4[10];
for (int i = 0; i < 10; i++) {
   w[i] = new Float4(i, 2*i, 3*i, 4*i);
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);    
w_rs.copy1DRangeFromUnchecked(0, 10, w);

Which results in the following error

Object passed is not an Array of primitives

Apparently, w should be array of primitives. But I want w to be array of Float4.

Rohit416
  • 3,416
  • 3
  • 24
  • 41
mmotamedi144
  • 115
  • 1
  • 10

1 Answers1

1

You can simply use:

float[] w = new float[4 * 10];
for (int i = 0; i < 10; i++) {
    w[i * 4 + 0] = i;
    w[i * 4 + 1] = i*2;
    w[i * 4 + 2] = i*3;
    w[i * 4 + 3] = i*4;
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);

w_rs.copyFrom(w);
// Or 
w_rs.copy1DRangeFrom(0,40,w);

Painless :)

Reference: RenderScript: parallel computing on Android, the easy way

Deeper explanation

Inside RenderScript Java source code, you'll see this middleware function:

public void copy1DRangeFromUnchecked(int off, int count, Object array) {
    copy1DRangeFromUnchecked(off, count, array,
                             validateObjectIsPrimitiveArray(array, false),
                             java.lang.reflect.Array.getLength(array));
}

The validateObjectIsPrimitiveArray is performed on any copy-method invocation. You can pass only raw arrays.

cmaster11
  • 527
  • 3
  • 6