diff options
-rw-r--r-- | graphics/java/android/renderscript/Allocation.java | 5 | ||||
-rw-r--r-- | graphics/java/android/renderscript/Element.java | 46 | ||||
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 2 | ||||
-rw-r--r-- | graphics/java/android/renderscript/SimpleMesh.java | 7 | ||||
-rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 6 | ||||
-rw-r--r-- | libs/rs/java/Fall/res/raw/fall.c | 66 | ||||
-rw-r--r-- | libs/rs/java/Film/res/raw/filmstrip.c | 16 | ||||
-rw-r--r-- | libs/rs/java/Fountain/res/raw/fountain.c | 23 | ||||
-rw-r--r-- | libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java | 9 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 14 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 3 | ||||
-rw-r--r-- | libs/rs/rsScriptC.cpp | 81 | ||||
-rw-r--r-- | libs/rs/rsScriptC.h | 4 |
13 files changed, 194 insertions, 88 deletions
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index 536f71c..e6cb395 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -110,9 +110,12 @@ public class Allocation extends BaseObj { } public void data(Object o) { - mRS.nAllocationDataFromObject(mID, mType, o); + mRS.nAllocationSubDataFromObject(mID, mType, 0, o); } + public void subData(int offset, Object o) { + mRS.nAllocationSubDataFromObject(mID, mType, offset, o); + } public class Adapter1D extends BaseObj { Adapter1D(int id, RenderScript rs) { diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java index 0ca112c..0b7e667 100644 --- a/graphics/java/android/renderscript/Element.java +++ b/graphics/java/android/renderscript/Element.java @@ -244,8 +244,8 @@ public class Element extends BaseObj { } public Builder addFloatXY(String prefix) { - add(DataType.FLOAT, DataKind.X, false, 32, prefix + "X"); - add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "Y"); + add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x"); + add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y"); return this; } @@ -257,9 +257,9 @@ public class Element extends BaseObj { } public Builder addFloatXYZ(String prefix) { - add(DataType.FLOAT, DataKind.X, false, 32, prefix + "X"); - add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "Y"); - add(DataType.FLOAT, DataKind.Z, false, 32, prefix + "Z"); + add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x"); + add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y"); + add(DataType.FLOAT, DataKind.Z, false, 32, prefix + "z"); return this; } @@ -270,8 +270,8 @@ public class Element extends BaseObj { } public Builder addFloatST(String prefix) { - add(DataType.FLOAT, DataKind.S, false, 32, prefix + "S"); - add(DataType.FLOAT, DataKind.T, false, 32, prefix + "T"); + add(DataType.FLOAT, DataKind.S, false, 32, prefix + "s"); + add(DataType.FLOAT, DataKind.T, false, 32, prefix + "t"); return this; } @@ -283,9 +283,9 @@ public class Element extends BaseObj { } public Builder addFloatNorm(String prefix) { - add(DataType.FLOAT, DataKind.NX, false, 32, prefix + "NX"); - add(DataType.FLOAT, DataKind.NY, false, 32, prefix + "NY"); - add(DataType.FLOAT, DataKind.NZ, false, 32, prefix + "NZ"); + add(DataType.FLOAT, DataKind.NX, false, 32, prefix + "nx"); + add(DataType.FLOAT, DataKind.NY, false, 32, prefix + "ny"); + add(DataType.FLOAT, DataKind.NZ, false, 32, prefix + "nz"); return this; } @@ -294,8 +294,8 @@ public class Element extends BaseObj { return this; } - public Builder addFloatPointSize(String name) { - add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, name); + public Builder addFloatPointSize(String prefix) { + add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, prefix + "pointSize"); return this; } @@ -307,9 +307,9 @@ public class Element extends BaseObj { } public Builder addFloatRGB(String prefix) { - add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "R"); - add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "G"); - add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "B"); + add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r"); + add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g"); + add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b"); return this; } @@ -322,10 +322,10 @@ public class Element extends BaseObj { } public Builder addFloatRGBA(String prefix) { - add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "R"); - add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "G"); - add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "B"); - add(DataType.FLOAT, DataKind.ALPHA, false, 32, prefix + "A"); + add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r"); + add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g"); + add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b"); + add(DataType.FLOAT, DataKind.ALPHA, false, 32, prefix + "a"); return this; } @@ -338,10 +338,10 @@ public class Element extends BaseObj { } public Builder addUNorm8RGBA(String prefix) { - add(DataType.UNSIGNED, DataKind.RED, true, 8, prefix + "R"); - add(DataType.UNSIGNED, DataKind.GREEN, true, 8, prefix + "G"); - add(DataType.UNSIGNED, DataKind.BLUE, true, 8, prefix + "B"); - add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, prefix + "A"); + add(DataType.UNSIGNED, DataKind.RED, true, 8, prefix + "r"); + add(DataType.UNSIGNED, DataKind.GREEN, true, 8, prefix + "g"); + add(DataType.UNSIGNED, DataKind.BLUE, true, 8, prefix + "b"); + add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, prefix + "a"); return this; } diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 0f188f6..bd345e5 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -106,7 +106,7 @@ public class RenderScript { native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes); native void nAllocationRead(int id, int[] d); native void nAllocationRead(int id, float[] d); - native void nAllocationDataFromObject(int id, Type t, Object o); + native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o); native void nTriangleMeshBegin(int vertex, int index); native void nTriangleMeshAddVertex_XY (float x, float y); diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java index e66fb8a..5d87654 100644 --- a/graphics/java/android/renderscript/SimpleMesh.java +++ b/graphics/java/android/renderscript/SimpleMesh.java @@ -50,6 +50,13 @@ public class SimpleMesh extends BaseObj { return Allocation.createTyped(mRS, mIndexType); } + public Type getVertexType(int slot) { + return mVertexTypes[slot]; + } + + public Type getIndexType() { + return mIndexType; + } public static class Builder { RenderScript mRS; diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index 558146d..62c3914 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -543,7 +543,7 @@ nAllocationRead_f(JNIEnv *_env, jobject _this, jint alloc, jfloatArray data) //{"nAllocationDataFromObject", "(ILandroid/renderscript/Type;Ljava/lang/Object;)V", (void*)nAllocationDataFromObject }, static void -nAllocationDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type, jobject _o) +nAllocationSubDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type, jint offset, jobject _o) { RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); LOG_API("nAllocationDataFromObject con(%p), alloc(%p)", con, (RsAllocation)alloc); @@ -556,7 +556,7 @@ nAllocationDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type const TypeFieldCache *tfc = &tc->fields[ct]; buf = tfc->ptr(_env, _o, tfc->field, buf); } - rsAllocationData(con, (RsAllocation)alloc, bufAlloc, tc->size); + rsAllocation1DSubData(con, (RsAllocation)alloc, offset, 1, bufAlloc, tc->size); const uint32_t * tmp = (const uint32_t *)bufAlloc; free(bufAlloc); } @@ -1282,7 +1282,7 @@ static JNINativeMethod methods[] = { {"nAllocationSubData2D", "(IIIII[FI)V", (void*)nAllocationSubData2D_f }, {"nAllocationRead", "(I[I)V", (void*)nAllocationRead_i }, {"nAllocationRead", "(I[F)V", (void*)nAllocationRead_f }, -{"nAllocationDataFromObject", "(ILandroid/renderscript/Type;Ljava/lang/Object;)V", (void*)nAllocationDataFromObject }, +{"nAllocationSubDataFromObject", "(ILandroid/renderscript/Type;ILjava/lang/Object;)V", (void*)nAllocationSubDataFromObject }, {"nTriangleMeshBegin", "(II)V", (void*)nTriangleMeshBegin }, {"nTriangleMeshAddVertex_XY", "(FF)V", (void*)nTriangleMeshAddVertex_XY }, diff --git a/libs/rs/java/Fall/res/raw/fall.c b/libs/rs/java/Fall/res/raw/fall.c index f348a62..c09f43c 100644 --- a/libs/rs/java/Fall/res/raw/fall.c +++ b/libs/rs/java/Fall/res/raw/fall.c @@ -52,8 +52,8 @@ int offset(int x, int y, int width) { } void dropWithStrength(int x, int y, int r, int s) { - int width = State_meshWidth; - int height = State_meshHeight; + int width = State->meshWidth; + int height = State->meshHeight; if (x < r) x = r; if (y < r) y = r; @@ -62,8 +62,8 @@ void dropWithStrength(int x, int y, int r, int s) { x = width - x; - int rippleMapSize = State_rippleMapSize; - int index = State_rippleIndex; + int rippleMapSize = State->rippleMapSize; + int index = State->rippleIndex; int origin = offset(0, 0, width); int* current = loadArrayI32(RSID_RIPPLE_MAP, index * rippleMapSize + origin); @@ -94,10 +94,10 @@ void drop(int x, int y, int r) { } void updateRipples() { - int rippleMapSize = State_rippleMapSize; - int width = State_meshWidth; - int height = State_meshHeight; - int index = State_rippleIndex; + int rippleMapSize = State->rippleMapSize; + int width = State->meshWidth; + int height = State->meshHeight; + int index = State->rippleIndex; int origin = offset(0, 0, width); int* current = loadArrayI32(RSID_RIPPLE_MAP, index * rippleMapSize + origin); @@ -139,9 +139,9 @@ int refraction(int d, int wave, int *map) { void generateRipples() { int rippleMapSize = loadI32(RSID_STATE, OFFSETOF_WorldState_rippleMapSize); - int width = State_meshWidth; - int height = State_meshHeight; - int index = State_rippleIndex; + int width = State->meshWidth; + int height = State->meshHeight; + int index = State->rippleIndex; int origin = offset(0, 0, width); int b = width + 2; @@ -180,7 +180,7 @@ void generateRipples() { // Update Z coordinate of the vertex vertices[index + 7] = dy * fy; - + w -= 1; current += 1; wave = nextWave; @@ -210,7 +210,7 @@ void generateRipples() { float v2x = vertices[o1 + 5]; float v2y = vertices[o1 + 6]; float v2z = vertices[o1 + 7]; - + // V3 float v3x = vertices[ow + 5]; float v3y = vertices[ow + 6]; @@ -236,7 +236,7 @@ void generateRipples() { n3x *= len; n3y *= len; n3z *= len; - + // V2 v2x = vertices[ow1 + 5]; v2y = vertices[ow1 + 6]; @@ -266,7 +266,7 @@ void generateRipples() { vertices[o + 0] = n3x; vertices[o + 1] = n3y; vertices[o + 2] = -n3z; - + // reset Z //vertices[(yOffset + x) << 3 + 7] = 0.0f; } @@ -322,7 +322,7 @@ void drawLeaf(int index, float* vertices, int meshWidth, int meshHeight, float z2 = 0.0f; float z3 = 0.0f; float z4 = 0.0f; - + float a = leafStruct[LEAF_STRUCT_ALTITUDE]; float s = leafStruct[LEAF_STRUCT_SCALE]; float r = leafStruct[LEAF_STRUCT_ANGLE]; @@ -384,7 +384,7 @@ void drawLeaf(int index, float* vertices, int meshWidth, int meshHeight, LEAF_SIZE * s + y < -glHeight / 2.0f) { int sprite = randf(LEAVES_TEXTURES_COUNT); - leafStruct[LEAF_STRUCT_X] = randf2(-1.0f, 1.0f); + leafStruct[LEAF_STRUCT_X] = randf2(-1.0f, 1.0f); leafStruct[LEAF_STRUCT_Y] = glHeight / 2.0f + LEAF_SIZE * 2 * randf(1.0f); leafStruct[LEAF_STRUCT_SCALE] = randf2(0.4f, 0.5f); leafStruct[LEAF_STRUCT_SPIN] = degf(randf2(-0.02f, 0.02f)) / 4.0f; @@ -401,20 +401,20 @@ void drawLeaves() { bindProgramVertex(NAMED_PVSky); bindTexture(NAMED_PFBackground, 0, NAMED_TLeaves); - int leavesCount = State_leavesCount; + int leavesCount = State->leavesCount; int count = leavesCount * LEAF_STRUCT_FIELDS_COUNT; - int width = State_meshWidth; - int height = State_meshHeight; - float glWidth = State_glWidth; - float glHeight = State_glHeight; + int width = State->meshWidth; + int height = State->meshHeight; + float glWidth = State->glWidth; + float glHeight = State->glHeight; - float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh); + float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh); int i = 0; for ( ; i < count; i += LEAF_STRUCT_FIELDS_COUNT) { drawLeaf(i, vertices, width, height, glWidth, glHeight); } - + float matrix[16]; matrixLoadIdentity(matrix); vpLoadModelMatrix(matrix); @@ -433,8 +433,8 @@ void drawSky() { bindProgramFragmentStore(NAMED_PFSLeaf); bindTexture(NAMED_PFSky, 0, NAMED_TSky); - float x = State_skyOffsetX + State_skySpeedX; - float y = State_skyOffsetY + State_skySpeedY; + float x = State->skyOffsetX + State->skySpeedX; + float y = State->skyOffsetY + State->skySpeedY; if (x > 1.0f) x = 0.0f; if (x < -1.0f) x = 0.0f; @@ -467,8 +467,8 @@ void drawLighting() { } void drawNormals() { - int width = State_meshWidth; - int height = State_meshHeight; + int width = State->meshWidth; + int height = State->meshHeight; float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh); @@ -496,12 +496,10 @@ void drawNormals() { } int main(int index) { - int dropX = Drop_dropX; - if (dropX != -1) { - int dropY = Drop_dropY; - drop(dropX, dropY, DROP_RADIUS); - storeI32(RSID_DROP, OFFSETOF_DropState_dropX, -1); - storeI32(RSID_DROP, OFFSETOF_DropState_dropY, -1); + if (Drop->dropX != -1) { + drop(Drop->dropX, Drop->dropY, DROP_RADIUS); + Drop->dropX = -1; + Drop->dropY = -1; } updateRipples(); diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c index 8f3d930..8fbfee1 100644 --- a/libs/rs/java/Film/res/raw/filmstrip.c +++ b/libs/rs/java/Film/res/raw/filmstrip.c @@ -5,10 +5,6 @@ #pragma stateFragment(PFBackground) #pragma stateFragmentStore(PSBackground) -#define POS_TRANSLATE 0 -#define POS_ROTATE 1 -#define POS_FOCUS 2 - #define STATE_TRIANGLE_OFFSET_COUNT 0 #define STATE_LAST_FOCUS 1 @@ -18,12 +14,14 @@ // bank1: (r) The position information // bank2: (rw) The temporary texture state +int lastFocus; + int main(int index) { float mat1[16]; - float trans = Pos_translate; - float rot = Pos_rotate; + float trans = Pos->translate; + float rot = Pos->rotate; matrixLoadScale(mat1, 2.f, 2.f, 2.f); matrixTranslate(mat1, 0.f, 0.f, trans); @@ -39,7 +37,7 @@ int main(int index) bindProgramFragment(NAMED_PFImages); bindProgramVertex(NAMED_PVImages); - float focusPos = Pos_focus; + float focusPos = Pos->focus; int focusID = 0; int lastFocusID = loadI32(2, STATE_LAST_FOCUS); int imgCount = 13; @@ -63,9 +61,9 @@ int main(int index) } } */ - storeI32(2, STATE_LAST_FOCUS, focusID); + lastFocus = focusID; - int triangleOffsetsCount = Pos_triangleOffsetCount; + int triangleOffsetsCount = Pos->triangleOffsetCount; int imgId = 0; for (imgId=1; imgId <= imgCount; imgId++) { diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c index 99f4048..36516c2 100644 --- a/libs/rs/java/Fountain/res/raw/fountain.c +++ b/libs/rs/java/Fountain/res/raw/fountain.c @@ -4,27 +4,32 @@ #pragma stateFragment(default) #pragma stateFragmentStore(default) -struct PartStruct {float dx; float dy; float x; float y; int c;}; int newPart = 0; int main(int launchID) { int ct; - int count = Control_count - 1; - int rate = Control_rate; + int count = Control->count; + int rate = Control->rate; float height = getHeight(); - struct PartStruct * p = (struct PartStruct *)loadArrayF(1, 0); + struct point_s * p = (struct point_s *)point; if (rate) { float rMax = ((float)rate) * 0.005f; - int x = Control_x; - int y = Control_y; - int c = colorFloatRGBAtoUNorm8(Control_r, Control_g, Control_b, 0.99f); + int x = Control->x; + int y = Control->y; + char r = Control->r * 255.f; + char g = Control->g * 255.f; + char b = Control->b * 255.f; + char a = 0xf0; while (rate--) { vec2Rand((float *)(p + newPart), rMax); p[newPart].x = x; p[newPart].y = y; - p[newPart].c = c; + p[newPart].r = r; + p[newPart].g = g; + p[newPart].b = b; + p[newPart].a = a; newPart++; if (newPart >= count) { newPart = 0; @@ -45,6 +50,6 @@ int main(int launchID) { } uploadToBufferObject(NAMED_PartBuffer); - drawSimpleMeshRange(NAMED_PartMesh, 0, count); + drawSimpleMesh(NAMED_PartMesh); return 1; } diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java index 6d400c5..f4f9b0c 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java @@ -79,10 +79,10 @@ public class FountainRS { mIntAlloc.data(mSD); Element.Builder eb = new Element.Builder(mRS); - eb.addFloat(Element.DataKind.USER); //dx - eb.addFloat(Element.DataKind.USER); //dy - eb.addFloatXY(); - eb.addUNorm8RGBA(); + eb.addFloat(Element.DataKind.USER, "dx"); + eb.addFloat(Element.DataKind.USER, "dy"); + eb.addFloatXY(""); + eb.addUNorm8RGBA(""); Element primElement = eb.create(); @@ -102,6 +102,7 @@ public class FountainRS { sb.setScript(mRes, R.raw.fountain); sb.setRoot(true); sb.setType(mSDType, "Control", 0); + sb.setType(mSM.getVertexType(0), "point", 1); Script script = sb.create(); script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index c28bd02..c132915 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -116,6 +116,7 @@ bool Context::runRootScript() //glEnable(GL_LIGHT0); glViewport(0, 0, mEGL.mWidth, mEGL.mHeight); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glEnable(GL_POINT_SMOOTH); glClearColor(mRootScript->mEnviroment.mClearColor[0], mRootScript->mEnviroment.mClearColor[1], @@ -153,10 +154,18 @@ void Context::timerReset() void Context::timerInit() { mTimeLast = getTime(); + mTimeFrame = mTimeLast; + mTimeLastFrame = mTimeLast; mTimerActive = RS_TIMER_INTERNAL; timerReset(); } +void Context::timerFrame() +{ + mTimeLastFrame = mTimeFrame; + mTimeFrame = getTime(); +} + void Context::timerSet(Timers tm) { uint64_t last = mTimeLast; @@ -171,8 +180,10 @@ void Context::timerPrint() for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) { total += mTimers[ct]; } + uint64_t frame = mTimeFrame - mTimeLastFrame; - LOGV("RS Time Data: Idle %2.1f (%lli), Internal %2.1f (%lli), Script %2.1f (%lli), Clear & Swap %2.1f (%lli)", + LOGV("RS: Frame (%lli), Script %2.1f (%lli), Clear & Swap %2.1f (%lli), Idle %2.1f (%lli), Internal %2.1f (%lli)", + frame / 1000000, 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000, 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000, 100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimers[RS_TIMER_SCRIPT] / 1000000, @@ -232,6 +243,7 @@ void * Context::threadProc(void *vrsc) #endif eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface); #if RS_LOG_TIMES + rsc->timerFrame(); rsc->timerSet(RS_TIMER_INTERNAL); rsc->timerPrint(); rsc->timerReset(); diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index c58a88c..634416b 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -131,6 +131,7 @@ public: void timerReset(); void timerSet(Timers); void timerPrint(); + void timerFrame(); bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); } bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; } @@ -202,6 +203,8 @@ private: uint64_t mTimers[_RS_TIMER_TOTAL]; Timers mTimerActive; uint64_t mTimeLast; + uint64_t mTimeFrame; + uint64_t mTimeLastFrame; }; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 0c7ac18..9d9eb1b 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -67,6 +67,12 @@ bool ScriptC::run(Context *rsc, uint32_t launchIndex) = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); } + for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { + if (mProgram.mSlotPointers[ct]) { + *mProgram.mSlotPointers[ct] = mSlots[ct]->getPtr(); + } + } + bool ret = false; tls->mScript = this; ret = mProgram.mScript(launchIndex) != 0; @@ -139,6 +145,7 @@ void ScriptCState::runCompiler(Context *rsc) accRegisterSymbolCallback(mAccScript, symbolLookup, NULL); accCompileScript(mAccScript); accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript); + accGetScriptLabel(mAccScript, "init", (ACCvoid**) &mProgram.mInit); rsAssert(mProgram.mScript); if (!mProgram.mScript) { @@ -148,6 +155,19 @@ void ScriptCState::runCompiler(Context *rsc) LOGE(buf); } + if (mProgram.mInit) { + mProgram.mInit(); + } + + for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) { + if (mSlotNames[ct].length() > 0) { + accGetScriptLabel(mAccScript, + mSlotNames[ct].string(), + (ACCvoid**) &mProgram.mSlotPointers[ct]); + LOGE("var %s %p", mSlotNames[ct].string(), mProgram.mSlotPointers[ct]); + } + } + mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore()); @@ -224,6 +244,19 @@ void ScriptCState::runCompiler(Context *rsc) } } +static void appendElementBody(String8 *s, const Element *e) +{ + s->append(" {\n"); + for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { + const Component *c = e->getComponent(ct2); + s->append(" "); + s->append(c->getCType()); + s->append(" "); + s->append(c->getComponentName()); + s->append(";\n"); + } + s->append("}"); +} void ScriptCState::appendVarDefines(String8 *str) { @@ -246,6 +279,8 @@ void ScriptCState::appendVarDefines(String8 *str) } } + + void ScriptCState::appendTypes(String8 *str) { char buf[256]; @@ -257,6 +292,19 @@ void ScriptCState::appendTypes(String8 *str) continue; } const Element *e = t->getElement(); + if (e->getName() && (e->getComponentCount() > 1)) { + String8 s("struct struct_"); + s.append(e->getName()); + appendElementBody(&s, e); + s.append(";\n"); + s.append("#define "); + s.append(e->getName()); + s.append("_t struct struct_"); + s.append(e->getName()); + s.append("\n\n"); + LOGD(s); + str->append(s); + } if (t->getName()) { for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { @@ -267,12 +315,39 @@ void ScriptCState::appendTypes(String8 *str) tmp.append(c->getComponentName()); sprintf(buf, " %i\n", ct2); tmp.append(buf); - //LOGD(tmp); + LOGD(tmp); str->append(tmp); } } if (mSlotNames[ct].length() > 0) { + String8 s; + if (e->getComponentCount() > 1) { + if (e->getName()) { + // Use the named struct + s.setTo(e->getName()); + s.append("_t *"); + } else { + // create an struct named from the slot. + s.setTo("struct "); + s.append(mSlotNames[ct]); + s.append("_s"); + appendElementBody(&s, e); + s.append(";\n"); + s.append("struct "); + s.append(mSlotNames[ct]); + s.append("_s * "); + } + } else { + // Just make an array + s.setTo(e->getComponent(0)->getCType()); + s.append("_t *"); + } + s.append(mSlotNames[ct]); + s.append(";\n"); + LOGD(s); + str->append(s); +#if 0 for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) { const Component *c = e->getComponent(ct2); tmp.setTo("#define "); @@ -295,12 +370,12 @@ void ScriptCState::appendTypes(String8 *str) sprintf(buf, "%i, %i)\n", ct, ct2); tmp.append(buf); - //LOGD(tmp); + LOGD(tmp); str->append(tmp); } +#endif } } - } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 302515e..8aa99ef 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -35,6 +35,7 @@ class ScriptC : public Script { public: typedef int (*RunScript_t)(uint32_t launchIndex); + typedef void (*VoidFunc_t)(); ScriptC(); virtual ~ScriptC(); @@ -48,6 +49,9 @@ public: int mVersionMinor; RunScript_t mScript; + VoidFunc_t mInit; + + void ** mSlotPointers[MAX_SCRIPT_BANKS]; }; Program_t mProgram; |