diff options
| -rw-r--r-- | libs/rs/java/Film/res/raw/filmstrip.c | 5 | ||||
| -rw-r--r-- | libs/rs/java/Film/src/com/android/film/FilmRS.java | 108 | ||||
| -rw-r--r-- | libs/rs/java/RenderScript/android/renderscript/RenderScript.java | 6 | ||||
| -rw-r--r-- | libs/rs/jni/RenderScript_jni.cpp | 9 | ||||
| -rw-r--r-- | libs/rs/rs.spec | 4 | ||||
| -rw-r--r-- | libs/rs/rsContext.h | 2 | ||||
| -rw-r--r-- | libs/rs/rsLight.cpp | 35 | ||||
| -rw-r--r-- | libs/rs/rsLight.h | 6 | ||||
| -rw-r--r-- | libs/rs/rsProgramVertex.cpp | 38 | ||||
| -rw-r--r-- | libs/rs/rsProgramVertex.h | 7 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.cpp | 6 | ||||
| -rw-r--r-- | libs/rs/rsScriptC_Lib.cpp | 8 |
12 files changed, 148 insertions, 86 deletions
diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c index 863b930e63fb..6885251d9250 100644 --- a/libs/rs/java/Film/res/raw/filmstrip.c +++ b/libs/rs/java/Film/res/raw/filmstrip.c @@ -1,7 +1,7 @@ // Fountain test script #pragma version(1) -#pragma stateVertex(PV) +#pragma stateVertex(PVBackground) #pragma stateFragment(PFBackground) #pragma stateFragmentStore(PFSBackground) @@ -43,8 +43,6 @@ int main(int index) //materialDiffuse(con, 0.0f, 0.0f, 0.0f, 1.0f); //materialSpecular(con, 0.5f, 0.5f, 0.5f, 0.5f); //materialShininess(intToFloat(20)); - //lightPosition(con, 0.2f, -0.2f, -2.0f, 0.0f); - //enable(con, GL_LIGHTING); drawTriangleMesh(NAMED_mesh); @@ -53,6 +51,7 @@ int main(int index) bindProgramFragmentStore(NAMED_PFImages); bindProgramFragment(NAMED_PFSImages); + bindProgramVertex(NAMED_PVImages); //focusPos = loadF(1, 2); //focusID = 0; diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java index 2711bf0cc4aa..fca0818983d1 100644 --- a/libs/rs/java/Film/src/com/android/film/FilmRS.java +++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java @@ -45,7 +45,6 @@ public class FilmRS { public void init(RenderScript rs, Resources res, int width, int height) { mRS = rs; mRes = res; - initNamed(); initRS(); } @@ -77,7 +76,8 @@ public class FilmRS { private RenderScript.ProgramFragmentStore mPFSImages; private RenderScript.ProgramFragment mPFBackground; private RenderScript.ProgramFragment mPFImages; - private RenderScript.ProgramVertex mPV; + private RenderScript.ProgramVertex mPVBackground; + private RenderScript.ProgramVertex mPVImages; private ProgramVertexAlloc mPVA; private RenderScript.Allocation mAllocEnv; @@ -90,20 +90,7 @@ public class FilmRS { private float[] mBufferPos; private float[] mBufferPV; - private void initNamed() { - mElementVertex = mRS.elementGetPredefined( - RenderScript.ElementPredefined.NORM_ST_XYZ_F32); - mElementIndex = mRS.elementGetPredefined( - RenderScript.ElementPredefined.INDEX_16); - - mRS.triangleMeshBegin(mElementVertex, mElementIndex); - FilmStripMesh fsm = new FilmStripMesh(); - fsm.init(mRS); - mMesh = mRS.triangleMeshCreate(); - mMesh.setName("mesh"); - Log.e("rs", "Done loading strips"); - - + private void initSamplers() { mRS.samplerBegin(); mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN, RenderScript.SamplerValue.LINEAR_MIP_LINEAR); @@ -112,19 +99,9 @@ public class FilmRS { mRS.samplerSet(RenderScript.SamplerParam.WRAP_MODE_T, RenderScript.SamplerValue.CLAMP); mSampler = mRS.samplerCreate(); + } - mRS.programFragmentBegin(null, null); - mPFBackground = mRS.programFragmentCreate(); - mPFBackground.setName("PFBackground"); - - mRS.programFragmentBegin(null, null); - mRS.programFragmentSetTexEnable(0, true); - //mRS.programFragmentSetEnvMode(0, RS_TEX_ENV_MODE_REPLACE); - //rsProgramFragmentSetType(0, gEnv.tex[0]->getType()); - mPFImages = mRS.programFragmentCreate(); - mPFImages.setName("PFImages"); - mPFImages.bindSampler(mSampler, 0); - + private void initPFS() { mRS.programFragmentStoreBegin(null, null); mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.LESS); mRS.programFragmentStoreDitherEnable(true); @@ -139,26 +116,59 @@ public class FilmRS { RenderScript.BlendDstFunc.ONE); mPFSImages = mRS.programFragmentStoreCreate(); mPFSImages.setName("PFSImages"); + } - mRS.programVertexBegin(null, null); - mRS.programVertexSetTextureMatrixEnable(true); - mPV = mRS.programVertexCreate(); - mPV.setName("PV"); + private void initPF() { + mRS.programFragmentBegin(null, null); + mPFBackground = mRS.programFragmentCreate(); + mPFBackground.setName("PFBackground"); + + mRS.programFragmentBegin(null, null); + mRS.programFragmentSetTexEnable(0, true); + //mRS.programFragmentSetEnvMode(0, RS_TEX_ENV_MODE_REPLACE); + //rsProgramFragmentSetType(0, gEnv.tex[0]->getType()); + mPFImages = mRS.programFragmentCreate(); + mPFImages.setName("PFImages"); + } + private void initPV() { mRS.lightBegin(); mLight = mRS.lightCreate(); mLight.setPosition(0, -0.5f, -1.0f); - Log.e("rs", "Done loading named"); - } + mRS.programVertexBegin(null, null); + mRS.programVertexSetTextureMatrixEnable(true); + mRS.programVertexAddLight(mLight); + mPVBackground = mRS.programVertexCreate(); + mPVBackground.setName("PVBackground"); + mRS.programVertexBegin(null, null); + mPVImages = mRS.programVertexCreate(); + mPVImages.setName("PVImages"); + } - private Bitmap mBackground; int mParams[] = new int[10]; private void initRS() { - int partCount = 1024; + mElementVertex = mRS.elementGetPredefined( + RenderScript.ElementPredefined.NORM_ST_XYZ_F32); + mElementIndex = mRS.elementGetPredefined( + RenderScript.ElementPredefined.INDEX_16); + + mRS.triangleMeshBegin(mElementVertex, mElementIndex); + FilmStripMesh fsm = new FilmStripMesh(); + fsm.init(mRS); + mMesh = mRS.triangleMeshCreate(); + mMesh.setName("mesh"); + + initPFS(); + initSamplers(); + initPF(); + initPV(); + mPFImages.bindSampler(mSampler, 0); + + Log.e("rs", "Done loading named"); mRS.scriptCBegin(); mRS.scriptCSetClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -172,7 +182,8 @@ public class FilmRS { mBufferPos.length); mPVA = new ProgramVertexAlloc(mRS); - mPV.bindAllocation(0, mPVA.mAlloc); + mPVBackground.bindAllocation(0, mPVA.mAlloc); + mPVImages.bindAllocation(0, mPVA.mAlloc); mPVA.setupProjectionNormalized(320, 480); @@ -181,10 +192,6 @@ public class FilmRS { mScriptStrip.bindAllocation(mPVA.mAlloc, 3); - //mIntAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, 10); - //mPartAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 3 * 3); - //mPartAlloc.setName("PartBuffer"); - //mVertAlloc = mRS.allocationCreatePredefSized(RenderScript.ElementPredefined.USER_I32, partCount * 5 + 1); /* { Resources res = getResources(); @@ -203,25 +210,6 @@ public class FilmRS { mPFS = mRS.programFragmentStoreCreate(); mPFS.setName("MyBlend"); mRS.contextBindProgramFragmentStore(mPFS); - - mRS.samplerBegin(); - mRS.samplerSet(RenderScript.SamplerParam.FILTER_MAG, RenderScript.SamplerValue.LINEAR); - mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN, RenderScript.SamplerValue.LINEAR); - mSampler = mRS.samplerCreate(); - - - mParams[0] = 0; - mParams[1] = partCount; - mParams[2] = 0; - mParams[3] = 0; - mParams[4] = 0; - mIntAlloc.data(mParams); - - int t2[] = new int[partCount * 4*3]; - for (int ct=0; ct < t2.length; ct++) { - t2[ct] = 0; - } - mPartAlloc.data(t2); */ setFilmStripPosition(0, 0); diff --git a/libs/rs/java/RenderScript/android/renderscript/RenderScript.java b/libs/rs/java/RenderScript/android/renderscript/RenderScript.java index 733009e9a555..e3556351a952 100644 --- a/libs/rs/java/RenderScript/android/renderscript/RenderScript.java +++ b/libs/rs/java/RenderScript/android/renderscript/RenderScript.java @@ -156,6 +156,7 @@ public class RenderScript { native private void nProgramVertexBegin(int inID, int outID); native private void nProgramVertexSetType(int slot, int mID); native private void nProgramVertexSetTextureMatrixEnable(boolean enable); + native private void nProgramVertexAddLight(int id); native private int nProgramVertexCreate(); native private void nLightBegin(); @@ -720,7 +721,6 @@ public class RenderScript { public void bindAllocation(int slot, Allocation va) { nProgramVertexBindAllocation(mID, slot, va.mID); } - } public void programVertexBegin(Element in, Element out) { @@ -743,6 +743,10 @@ public class RenderScript { nProgramVertexSetTextureMatrixEnable(enable); } + public void programVertexAddLight(Light l) { + nProgramVertexAddLight(l.mID); + } + public ProgramVertex programVertexCreate() { int id = nProgramVertexCreate(); return new ProgramVertex(id); diff --git a/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp index 248a6bd7c264..17476734f178 100644 --- a/libs/rs/jni/RenderScript_jni.cpp +++ b/libs/rs/jni/RenderScript_jni.cpp @@ -810,6 +810,14 @@ nProgramVertexSetTextureMatrixEnable(JNIEnv *_env, jobject _this, jboolean enabl rsProgramVertexSetTextureMatrixEnable(enable); } +static void +nProgramVertexAddLight(JNIEnv *_env, jobject _this, jint light) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + LOG_API("nProgramVertexAddLight, con(%p), light(%p)", con, (RsLight)light); + rsProgramVertexAddLight((RsLight)light); +} + static jint nProgramVertexCreate(JNIEnv *_env, jobject _this) { @@ -1048,6 +1056,7 @@ static JNINativeMethod methods[] = { {"nProgramVertexBegin", "(II)V", (void*)nProgramVertexBegin }, {"nProgramVertexSetType", "(II)V", (void*)nProgramVertexSetType }, {"nProgramVertexSetTextureMatrixEnable", "(Z)V", (void*)nProgramVertexSetTextureMatrixEnable }, +{"nProgramVertexAddLight", "(I)V", (void*)nProgramVertexAddLight }, {"nProgramVertexCreate", "()I", (void*)nProgramVertexCreate }, {"nLightBegin", "()V", (void*)nLightBegin }, diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 62533af020bb..2f99808b8682 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -403,6 +403,10 @@ ProgramVertexSetTextureMatrixEnable { param bool enable } +ProgramVertexAddLight { + param RsLight light + } + LightBegin { } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 442a920fbbd7..497dbcf7620f 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -32,10 +32,10 @@ #include "rsAllocation.h" #include "rsAdapter.h" #include "rsSampler.h" +#include "rsLight.h" #include "rsProgramFragment.h" #include "rsProgramFragmentStore.h" #include "rsProgramVertex.h" -#include "rsLight.h" #include "rsgApiStructs.h" #include "rsLocklessFifo.h" diff --git a/libs/rs/rsLight.cpp b/libs/rs/rsLight.cpp index 67d009544402..24b58b622ac6 100644 --- a/libs/rs/rsLight.cpp +++ b/libs/rs/rsLight.cpp @@ -16,6 +16,8 @@ #include "rsContext.h" +#include <GLES/gl.h> + using namespace android; using namespace android::renderscript; @@ -25,13 +27,15 @@ Light::Light(bool isLocal, bool isMono) mIsLocal = isLocal; mIsMono = isMono; - mX = 0; - mY = 0; - mZ = 0; + mPosition[0] = 0; + mPosition[1] = 0; + mPosition[2] = 1; + mPosition[3] = 0; - mR = 1.f; - mG = 1.f; - mB = 1.f; + mColor[0] = 1.f; + mColor[1] = 1.f; + mColor[2] = 1.f; + mColor[3] = 1.f; } Light::~Light() @@ -40,16 +44,23 @@ Light::~Light() void Light::setPosition(float x, float y, float z) { - mX = x; - mY = y; - mZ = z; + mPosition[0] = x; + mPosition[1] = y; + mPosition[2] = z; } void Light::setColor(float r, float g, float b) { - mR = r; - mG = g; - mB = b; + mColor[0] = r; + mColor[1] = g; + mColor[2] = b; +} + +void Light::setupGL(uint32_t num) const +{ + glLightfv(GL_LIGHT0 + num, GL_DIFFUSE, mColor); + glLightfv(GL_LIGHT0 + num, GL_SPECULAR, mColor); + glLightfv(GL_LIGHT0 + num, GL_POSITION, mPosition); } //////////////////////////////////////////// diff --git a/libs/rs/rsLight.h b/libs/rs/rsLight.h index 76d1eccacdb7..b0c33862f52d 100644 --- a/libs/rs/rsLight.h +++ b/libs/rs/rsLight.h @@ -36,9 +36,11 @@ public: void setPosition(float x, float y, float z); void setColor(float r, float g, float b); + void setupGL(uint32_t num) const; + protected: - float mR, mG, mB; - float mX, mY, mZ; + float mColor[4]; + float mPosition[4]; bool mIsLocal; bool mIsMono; }; diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp index 4089507bbb98..417ba6aed13e 100644 --- a/libs/rs/rsProgramVertex.cpp +++ b/libs/rs/rsProgramVertex.cpp @@ -28,6 +28,7 @@ ProgramVertex::ProgramVertex(Element *in, Element *out) : Program(in, out) { mTextureMatrixEnable = false; + mLightCount = 0; } ProgramVertex::~ProgramVertex() @@ -54,8 +55,29 @@ void ProgramVertex::setupGL() glLoadIdentity(); } - //logMatrix("prog", &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); - //logMatrix("model", &f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); + + LOGE("lights %i ", mLightCount); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + if (mLightCount) { + int v = 1; + glEnable(GL_LIGHTING); + glLightModelxv(GL_LIGHT_MODEL_TWO_SIDE, &v); + for (uint32_t ct = 0; ct < mLightCount; ct++) { + const Light *l = mLights[ct].get(); + glEnable(GL_LIGHT0 + ct); + l->setupGL(ct); + } + for (uint32_t ct = mLightCount; ct < MAX_LIGHTS; ct++) { + glDisable(GL_LIGHT0 + ct); + } + } else { + glDisable(GL_LIGHTING); + } + + if (!f) { + LOGE("Must bind constants to vertex program"); + } glMatrixMode(GL_PROJECTION); glLoadMatrixf(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); @@ -73,6 +95,14 @@ void ProgramVertex::bindAllocation(uint32_t slot, Allocation *a) mConstants[slot].set(a); } +void ProgramVertex::addLight(const Light *l) +{ + if (mLightCount < MAX_LIGHTS) { + mLights[mLightCount].set(l); + mLightCount++; + } +} + ProgramVertexState::ProgramVertexState() { @@ -136,6 +166,10 @@ void rsi_ProgramVertexSetTextureMatrixEnable(Context *rsc, bool enable) rsc->mStateVertex.mPV->setTextureMatrixEnable(enable); } +void rsi_ProgramVertexAddLight(Context *rsc, RsLight light) +{ + rsc->mStateVertex.mPV->addLight(static_cast<const Light *>(light)); +} } diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h index 1a92f013c7b1..ac15b70a7cb6 100644 --- a/libs/rs/rsProgramVertex.h +++ b/libs/rs/rsProgramVertex.h @@ -28,6 +28,7 @@ class ProgramVertex : public Program { public: const static uint32_t MAX_CONSTANTS = 2; + const static uint32_t MAX_LIGHTS = 8; ProgramVertex(Element *in, Element *out); virtual ~ProgramVertex(); @@ -38,12 +39,16 @@ public: void setConstantType(uint32_t slot, const Type *); void bindAllocation(uint32_t slot, Allocation *); void setTextureMatrixEnable(bool e) {mTextureMatrixEnable = e;} + void addLight(const Light *); protected: bool mDirty; + uint32_t mLightCount; ObjectBaseRef<Allocation> mConstants[MAX_CONSTANTS]; ObjectBaseRef<const Type> mConstantTypes[MAX_CONSTANTS]; + ObjectBaseRef<const Light> mLights[MAX_LIGHTS]; + // Hacks to create a program for now bool mTextureMatrixEnable; @@ -61,6 +66,8 @@ public: ObjectBaseRef<ProgramVertex> mDefault; ObjectBaseRef<Allocation> mDefaultAlloc; + + ProgramVertex *mPV; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index e0928c3c53bc..842c836b9ec5 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -103,14 +103,10 @@ void ScriptCState::clear() static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) { const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name); - if (sym) { return sym->mPtr; } - LOGE("ScriptC sym lookup failed for %s", name); - - // Default to calling dlsym to allow any global symbol: return NULL; } @@ -121,7 +117,7 @@ void ScriptCState::runCompiler(Context *rsc) rsc->appendNameDefines(&tmp); appendDecls(&tmp); - //tmp.append("#line 1\n"); + tmp.append("#line 1\n"); const char* scriptSource[] = {tmp.string(), mProgram.mScriptText}; int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ; diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp index 59d8e5f0c51b..129b19fc5a54 100644 --- a/libs/rs/rsScriptC_Lib.cpp +++ b/libs/rs/rsScriptC_Lib.cpp @@ -249,6 +249,12 @@ static void SC_bindProgramFragment(RsProgramFragment pf) } +static void SC_bindProgramVertex(RsProgramVertex pv) +{ + GET_TLS(); + rsi_ContextBindProgramVertex(rsc, pv); + +} ////////////////////////////////////////////////////////////////////////////// // Drawing @@ -468,6 +474,8 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = { "void", "(int)" }, { "bindProgramFragmentStore", (void *)&SC_bindProgramFragmentStore, "void", "(int)" }, + { "bindProgramVertex", (void *)&SC_bindProgramVertex, + "void", "(int)" }, { "bindSampler", (void *)&SC_bindSampler, "void", "(int, int, int)" }, { "bindTexture", (void *)&SC_bindTexture, |