Implement basic allocation readback. Add Get height, width to ScriptC_Lib.

This commit is contained in:
Jason Sams
2009-08-10 14:55:26 -07:00
parent c028d09409
commit 40a29e8e28
10 changed files with 89 additions and 50 deletions

View File

@@ -74,6 +74,15 @@ public class Allocation extends BaseObj {
mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d);
}
public void readData(int[] d) {
mRS.nAllocationRead(mID, d);
}
public void readData(float[] d) {
mRS.nAllocationRead(mID, d);
}
public class Adapter1D extends BaseObj {
Adapter1D(int id, RenderScript rs) {
super(rs);

View File

@@ -100,6 +100,8 @@ public class RenderScript {
native void nAllocationSubData1D(int id, int off, int count, float[] d);
native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d);
native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d);
native void nAllocationRead(int id, int[] d);
native void nAllocationRead(int id, float[] d);
native void nTriangleMeshDestroy(int id);
native void nTriangleMeshBegin(int vertex, int index);
@@ -187,6 +189,10 @@ public class RenderScript {
native void nSimpleMeshBindVertex(int id, int alloc, int slot);
native void nSimpleMeshBindIndex(int id, int alloc);
native void nAnimationDestroy(int id);
native void nAnimationBegin(int attribCount, int keyframeCount);
native void nAnimationAdd(float time, float[] attribs);
native int nAnimationCreate();
private int mDev;
private int mContext;

View File

@@ -389,6 +389,27 @@ nAllocationSubData2D_f(JNIEnv *_env, jobject _this, jint alloc, jint xoff, jint
_env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
}
static void
nAllocationRead_i(JNIEnv *_env, jobject _this, jint alloc, jintArray data)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
jint len = _env->GetArrayLength(data);
LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
jint *ptr = _env->GetIntArrayElements(data, NULL);
rsAllocationData((RsAllocation)alloc, ptr);
_env->ReleaseIntArrayElements(data, ptr, JNI_COMMIT);
}
static void
nAllocationRead_f(JNIEnv *_env, jobject _this, jint alloc, jfloatArray data)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
jint len = _env->GetArrayLength(data);
LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
rsAllocationData((RsAllocation)alloc, ptr);
_env->ReleaseFloatArrayElements(data, ptr, JNI_COMMIT);
}
// -----------------------------------
@@ -1197,6 +1218,8 @@ static JNINativeMethod methods[] = {
{"nAllocationSubData1D", "(III[F)V", (void*)nAllocationSubData1D_f },
{"nAllocationSubData2D", "(IIIII[I)V", (void*)nAllocationSubData2D_i },
{"nAllocationSubData2D", "(IIIII[F)V", (void*)nAllocationSubData2D_f },
{"nAllocationRead", "(I[I)V", (void*)nAllocationRead_i },
{"nAllocationRead", "(I[F)V", (void*)nAllocationRead_f },
{"nTriangleMeshDestroy", "(I)V", (void*)nTriangleMeshDestroy },
{"nTriangleMeshBegin", "(II)V", (void*)nTriangleMeshBegin },

View File

@@ -7,8 +7,7 @@
int main(int launchID) {
int count, touch, x, y, rate, maxLife, lifeShift;
int life;
int count, touch, x, y, rate;
int ct, ct2;
int newPart;
int drawCount;
@@ -25,15 +24,7 @@ int main(int launchID) {
y = loadI32(0, 4);
rate = 4;
maxLife = (count / rate) - 1;
lifeShift = 0;
{
life = maxLife;
while (life > 255) {
life = life >> 1;
lifeShift ++;
}
}
int maxLife = (count / rate) - 1;
if (touch) {
newPart = loadI32(2, 0);
@@ -57,19 +48,20 @@ int main(int launchID) {
}
drawCount = 0;
float height = getHeight();
for (ct=0; ct < count; ct++) {
srcIdx = ct * 5 + 1;
dx = loadF(2, srcIdx);
dy = loadF(2, srcIdx + 1);
life = loadI32(2, srcIdx + 2);
int life = loadI32(2, srcIdx + 2);
posx = loadF(2, srcIdx + 3);
posy = loadF(2, srcIdx + 4);
if (life) {
if (posy < 480.f) {
if (posy < height) {
dstIdx = drawCount * 9;
c = 0xffafcf | ((life >> lifeShift) << 24);
c = 0xcfcfcfcf;
storeI32(1, dstIdx, c);
storeF(1, dstIdx + 1, posx);
@@ -91,7 +83,7 @@ int main(int launchID) {
posx = posx + dx;
posy = posy + dy;
dy = dy + 0.1f;
dy = dy + 0.05f;
life --;
//storeI32(2, srcIdx, dx);

View File

@@ -39,6 +39,7 @@ import android.renderscript.Primitive;
public class FountainRS {
public static final int PART_COUNT = 4000;
public FountainRS() {
}
@@ -75,10 +76,8 @@ public class FountainRS {
int mParams[] = new int[10];
private void initRS() {
int partCount = 1024;
mIntAlloc = Allocation.createSized(mRS, Element.USER_I32, 10);
mVertAlloc = Allocation.createSized(mRS, Element.USER_I32, partCount * 5 + 1);
mVertAlloc = Allocation.createSized(mRS, Element.USER_I32, PART_COUNT * 5 + 1);
ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA, ProgramStore.BlendDstFunc.ONE);
@@ -93,10 +92,12 @@ public class FountainRS {
mPF.setName("PgmFragParts");
mParams[0] = 0;
mParams[1] = partCount;
mParams[1] = PART_COUNT;
mParams[2] = 0;
mParams[3] = 0;
mParams[4] = 0;
mParams[5] = 0;
mParams[6] = 0;
mIntAlloc.data(mParams);
Element.Builder eb = new Element.Builder(mRS);
@@ -109,7 +110,7 @@ public class FountainRS {
Element primElement = eb.create();
SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS);
int vtxSlot = smb.addVertexType(primElement, partCount * 3);
int vtxSlot = smb.addVertexType(primElement, PART_COUNT * 3);
smb.setPrimitive(Primitive.TRIANGLE);
mSM = smb.create();
mSM.setName("PartMesh");

View File

@@ -155,6 +155,10 @@ Allocation2DSubData {
param const void *data
}
AllocationRead {
param RsAllocation va
param void * data
}
Adapter1DCreate {
ret RsAdapter1D

View File

@@ -120,6 +120,11 @@ void Allocation::data(const void *data)
memcpy(mPtr, data, mType->getSizeBytes());
}
void Allocation::read(void *data)
{
memcpy(data, mPtr, mType->getSizeBytes());
}
void Allocation::subData(uint32_t xoff, uint32_t count, const void *data)
{
uint32_t eSize = mType->getElementSizeBytes();
@@ -523,6 +528,12 @@ void rsi_Allocation2DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint3
rsc->allocationCheck(a);
}
void rsi_AllocationRead(Context *rsc, RsAllocation va, void *data)
{
Allocation *a = static_cast<Allocation *>(va);
a->read(data);
}
}
}

View File

@@ -60,6 +60,8 @@ public:
void subData(uint32_t xoff, uint32_t yoff, uint32_t zoff,
uint32_t w, uint32_t h, uint32_t d, const void *data);
void read(void *data);
void enableGLVertexBuffers() const;
void setupGLIndexBuffers() const;

View File

@@ -115,6 +115,9 @@ public:
mFloatDefines.add(String8(name), value);
}
uint32_t getWidth() const {return mWidth;}
uint32_t getHeight() const {return mHeight;}
protected:
Device *mDev;

View File

@@ -547,32 +547,6 @@ static void SC_drawTriangleMeshRange(RsTriangleMesh mesh, uint32_t start, uint32
rsi_TriangleMeshRenderRange(rsc, mesh, start, count);
}
// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
static void SC_drawTriangleArray(int ialloc, uint32_t count)
{
GET_TLS();
RsAllocation alloc = (RsAllocation)ialloc;
const Allocation *a = (const Allocation *)alloc;
const uint32_t *ptr = (const uint32_t *)a->getPtr();
rsc->setupCheck();
glBindBuffer(GL_ARRAY_BUFFER, 0);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
glEnableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(2, GL_FIXED, 12, ptr + 1);
//glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
glDrawArrays(GL_TRIANGLES, 0, count * 3);
}
static void SC_drawLine(float x1, float y1, float z1,
float x2, float y2, float z2)
{
@@ -601,13 +575,13 @@ static void SC_drawQuadTexCoords(float x1, float y1, float z1,
float u4, float v4)
{
GET_TLS();
//LOGE("Quad");
//LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
//LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
//LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
//LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
@@ -795,7 +769,17 @@ static void SC_debugI32(const char *s, int32_t i)
LOGE("%s %i", s, i);
}
static uint32_t SC_getWidth()
{
GET_TLS();
return rsc->getWidth();
}
static uint32_t SC_getHeight()
{
GET_TLS();
return rsc->getHeight();
}
//////////////////////////////////////////////////////////////////////////////
// Class implementation
@@ -981,8 +965,6 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
"void", "(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4)" },
{ "drawQuadTexCoords", (void *)&SC_drawQuadTexCoords,
"void", "(float x1, float y1, float z1, float u1, float v1, float x2, float y2, float z2, float u2, float v2, float x3, float y3, float z3, float u3, float v3, float x4, float y4, float z4, float u4, float v4)" },
{ "drawTriangleArray", (void *)&SC_drawTriangleArray,
"void", "(int ialloc, int count)" },
{ "drawTriangleMesh", (void *)&SC_drawTriangleMesh,
"void", "(int mesh)" },
{ "drawTriangleMeshRange", (void *)&SC_drawTriangleMeshRange,
@@ -1018,6 +1000,12 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
{ "uploadToBufferObject", (void *)&SC_uploadToBufferObject,
"void", "(int)" },
{ "getWidth", (void *)&SC_getWidth,
"int", "()" },
{ "getHeight", (void *)&SC_getHeight,
"int", "()" },
{ "debugF", (void *)&SC_debugF,
"void", "(void *, float)" },