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,  |