diff options
-rw-r--r-- | java/Fountain/src/com/android/fountain/FountainRS.java | 4 | ||||
-rw-r--r-- | java/Fountain/src/com/android/fountain/fountain.rs | 2 | ||||
-rw-r--r-- | rsFont.cpp | 6 | ||||
-rw-r--r-- | rsProgramFragment.cpp | 142 | ||||
-rw-r--r-- | rsProgramFragment.h | 6 | ||||
-rw-r--r-- | rsProgramVertex.cpp | 6 | ||||
-rw-r--r-- | rsProgramVertex.h | 3 | ||||
-rw-r--r-- | rsScriptC_LibGL.cpp | 18 | ||||
-rw-r--r-- | scriptc/rs_graphics.rsh | 5 |
9 files changed, 90 insertions, 102 deletions
diff --git a/java/Fountain/src/com/android/fountain/FountainRS.java b/java/Fountain/src/com/android/fountain/FountainRS.java index bff72737..297ea074 100644 --- a/java/Fountain/src/com/android/fountain/FountainRS.java +++ b/java/Fountain/src/com/android/fountain/FountainRS.java @@ -34,6 +34,10 @@ public class FountainRS { mRS = rs; mRes = res; + ProgramFragment.Builder pfb = new ProgramFragment.Builder(rs); + pfb.setVaryingColor(true); + rs.contextBindProgramFragment(pfb.create()); + ScriptField_Point points = new ScriptField_Point(mRS, PART_COUNT); Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS); diff --git a/java/Fountain/src/com/android/fountain/fountain.rs b/java/Fountain/src/com/android/fountain/fountain.rs index f87ef596..812cb7ab 100644 --- a/java/Fountain/src/com/android/fountain/fountain.rs +++ b/java/Fountain/src/com/android/fountain/fountain.rs @@ -3,6 +3,8 @@ #pragma rs java_package_name(com.android.fountain) +#pragma stateFragment(parent) + #include "rs_graphics.rsh" static int newPart = 0; @@ -379,12 +379,12 @@ bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *r void FontState::initRenderState() { - uint32_t tmp[5] = { + uint32_t tmp[] = { RS_TEX_ENV_MODE_REPLACE, 1, RS_TEX_ENV_MODE_NONE, 0, - 0 + 0, 0 }; - ProgramFragment *pf = new ProgramFragment(mRSC, tmp, 5); + ProgramFragment *pf = new ProgramFragment(mRSC, tmp, 6); mFontShaderF.set(pf); mFontShaderF->init(mRSC); diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp index cbe33c72..056863c6 100644 --- a/rsProgramFragment.cpp +++ b/rsProgramFragment.cpp @@ -38,13 +38,21 @@ ProgramFragment::ProgramFragment(Context *rsc, const uint32_t * params, { mAllocFile = __FILE__; mAllocLine = __LINE__; - rsAssert(paramLength = 5); + rsAssert(paramLength == 6); + + mConstantColor[0] = 1.f; + mConstantColor[1] = 1.f; + mConstantColor[2] = 1.f; + mConstantColor[3] = 1.f; mEnvModes[0] = (RsTexEnvMode)params[0]; mTextureFormats[0] = params[1]; mEnvModes[1] = (RsTexEnvMode)params[2]; mTextureFormats[1] = params[3]; mPointSpriteEnable = params[4] != 0; + mVaryingColor = false; + if (paramLength > 5) + mVaryingColor = params[5] != 0; mTextureEnableMask = 0; if (mEnvModes[0]) { @@ -53,7 +61,17 @@ ProgramFragment::ProgramFragment(Context *rsc, const uint32_t * params, if (mEnvModes[1]) { mTextureEnableMask |= 2; } - init(rsc); + + mUniformCount = 0; + mUniformNames[mUniformCount++].setTo("uni_Tex0"); + mUniformNames[mUniformCount++].setTo("uni_Tex1"); + + mConstantColorUniformIndex = -1; + //if (!mVaryingColor) { + mConstantColorUniformIndex = mUniformCount; + mUniformNames[mUniformCount++].setTo("uni_Color"); + //} + createShader(); } ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, @@ -64,7 +82,19 @@ ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, mAllocFile = __FILE__; mAllocLine = __LINE__; - init(rsc); + mConstantColor[0] = 1.f; + mConstantColor[1] = 1.f; + mConstantColor[2] = 1.f; + mConstantColor[3] = 1.f; + + LOGE("Custom FP"); + + mUniformCount = 2; + mUniformNames[0].setTo("uni_Tex0"); + mUniformNames[1].setTo("uni_Tex1"); + + createShader(); + mTextureEnableMask = (1 << mTextureCount) -1; } @@ -73,79 +103,17 @@ ProgramFragment::~ProgramFragment() { } -void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) +void ProgramFragment::setConstantColor(float r, float g, float b, float a) { - if ((state->mLast.get() == this) && !mDirty) { - return; - } - state->mLast.set(this); - - for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { - glActiveTexture(GL_TEXTURE0 + ct); - if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { - glDisable(GL_TEXTURE_2D); - continue; - } - - glEnable(GL_TEXTURE_2D); - if (rsc->checkVersion1_1()) { -#ifndef ANDROID_RS_BUILD_FOR_HOST // These are GLES only - if (mPointSpriteEnable) { - glEnable(GL_POINT_SPRITE_OES); - } else { - glDisable(GL_POINT_SPRITE_OES); - } - glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); -#endif //ANDROID_RS_BUILD_FOR_HOST - - } - mTextures[ct]->uploadCheck(rsc); - glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); - - switch(mEnvModes[ct]) { - case RS_TEX_ENV_MODE_NONE: - rsAssert(0); - break; - case RS_TEX_ENV_MODE_REPLACE: - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - break; - case RS_TEX_ENV_MODE_MODULATE: - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - break; - case RS_TEX_ENV_MODE_DECAL: - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); - break; - } - - if (mSamplers[ct].get()) { - mSamplers[ct]->setupGL(rsc, mTextures[ct]->getType()->getIsNp2()); - } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - } + mConstantColor[0] = r; + mConstantColor[1] = g; + mConstantColor[2] = b; + mConstantColor[3] = a; + mDirty = true; +} - // Gross hack. - if (ct == 2) { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - } - } - glActiveTexture(GL_TEXTURE0); - mDirty = false; - rsc->checkError("ProgramFragment::setupGL"); +void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) +{ } void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc) @@ -158,6 +126,14 @@ void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, state->mLast.set(this); rsc->checkError("ProgramFragment::setupGL2 start"); + + if (!mVaryingColor && + (sc->fragUniformSlot(mConstantColorUniformIndex) >= 0)) { + //LOGE("mConstantColorUniformIndex %i %i", mConstantColorUniformIndex, sc->fragUniformSlot(mConstantColorUniformIndex)); + glUniform4fv(sc->fragUniformSlot(mConstantColorUniformIndex), 1, mConstantColor); + rsc->checkError("ProgramFragment::color setup"); + } + for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { glActiveTexture(GL_TEXTURE0 + ct); if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { @@ -195,6 +171,7 @@ void ProgramFragment::createShader() mShader.setTo("precision mediump float;\n"); mShader.append("varying vec4 varColor;\n"); mShader.append("varying vec4 varTex0;\n"); + mShader.append("uniform vec4 uni_Color;\n"); if (mUserShader.length() > 1) { for (uint32_t ct=0; ct < mTextureCount; ct++) { @@ -221,7 +198,11 @@ void ProgramFragment::createShader() mShader.append("void main() {\n"); - mShader.append(" vec4 col = varColor;\n"); + if (mVaryingColor) { + mShader.append(" vec4 col = varColor;\n"); + } else { + mShader.append(" vec4 col = uni_Color;\n"); + } if (mTextureEnableMask) { if (mPointSpriteEnable) { @@ -291,11 +272,6 @@ void ProgramFragment::createShader() void ProgramFragment::init(Context *rsc) { - mUniformCount = 2; - mUniformNames[0].setTo("uni_Tex0"); - mUniformNames[1].setTo("uni_Tex1"); - - createShader(); } void ProgramFragment::serialize(OStream *stream) const @@ -321,12 +297,12 @@ ProgramFragmentState::~ProgramFragmentState() void ProgramFragmentState::init(Context *rsc) { - uint32_t tmp[5] = { + uint32_t tmp[] = { RS_TEX_ENV_MODE_NONE, 0, RS_TEX_ENV_MODE_NONE, 0, - 0 + 0, 0 }; - ProgramFragment *pf = new ProgramFragment(rsc, tmp, 5); + ProgramFragment *pf = new ProgramFragment(rsc, tmp, 6); mDefault.set(pf); pf->init(rsc); } diff --git a/rsProgramFragment.h b/rsProgramFragment.h index e5bbe1b0..7c1598ea 100644 --- a/rsProgramFragment.h +++ b/rsProgramFragment.h @@ -44,6 +44,8 @@ public: virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_FRAGMENT; } static ProgramFragment *createFromStream(Context *rsc, IStream *stream); + void setConstantColor(float, float, float, float); + protected: // Hacks to create a program for now uint32_t mTextureFormats[MAX_TEXTURE]; @@ -51,6 +53,10 @@ protected: RsTexEnvMode mEnvModes[MAX_TEXTURE]; uint32_t mTextureEnableMask; bool mPointSpriteEnable; + bool mVaryingColor; + + float mConstantColor[4]; + int32_t mConstantColorUniformIndex; }; class ProgramFragmentState diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp index 55580070..60de04a8 100644 --- a/rsProgramVertex.cpp +++ b/rsProgramVertex.cpp @@ -221,7 +221,6 @@ void ProgramVertex::setupGL2(const Context *rsc, ProgramVertexState *state, Shad } rsc->checkError("ProgramVertex::setupGL2 start"); - glVertexAttrib4f(1, state->color[0], state->color[1], state->color[2], state->color[3]); const float *f = static_cast<const float *>(mConstants[0]->getPtr()); @@ -405,11 +404,6 @@ void ProgramVertexState::init(Context *rsc) pv->init(rsc); pv->bindAllocation(alloc, 0); - color[0] = 1.f; - color[1] = 1.f; - color[2] = 1.f; - color[3] = 1.f; - updateSize(rsc); #endif //ANDROID_RS_BUILD_FOR_HOST diff --git a/rsProgramVertex.h b/rsProgramVertex.h index cb93eaff..1c8b9c8d 100644 --- a/rsProgramVertex.h +++ b/rsProgramVertex.h @@ -83,9 +83,6 @@ public: ObjectBaseRef<Allocation> mDefaultAlloc; ObjectBaseRef<Type> mAllocType; - - - float color[4]; }; diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp index 22b0945b..f5e59534 100644 --- a/rsScriptC_LibGL.cpp +++ b/rsScriptC_LibGL.cpp @@ -110,6 +110,13 @@ static void SC_vpLoadTextureMatrix(const rsc_Matrix *m) } +static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) +{ + //GET_TLS(); + ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); + pf->setConstantColor(r, g, b, a); +} + ////////////////////////////////////////////////////////////////////////////// // Drawing @@ -253,13 +260,8 @@ static void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t s static void SC_color(float r, float g, float b, float a) { GET_TLS(); - rsc->mStateVertex.color[0] = r; - rsc->mStateVertex.color[1] = g; - rsc->mStateVertex.color[2] = b; - rsc->mStateVertex.color[3] = a; - if (!rsc->checkVersion2_0()) { - glColor4f(r, g, b, a); - } + ProgramFragment *pf = (ProgramFragment *)rsc->getFragment(); + pf->setConstantColor(r, g, b, a); } static void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) @@ -371,6 +373,8 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix }, { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix }, + { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor }, + { "_Z11rsgGetWidthv", (void *)&SC_getWidth }, { "_Z12rsgGetHeightv", (void *)&SC_getHeight }, diff --git a/scriptc/rs_graphics.rsh b/scriptc/rs_graphics.rsh index 4f539632..fd0491c3 100644 --- a/scriptc/rs_graphics.rsh +++ b/scriptc/rs_graphics.rsh @@ -26,6 +26,9 @@ extern void __attribute__((overloadable)) extern void __attribute__((overloadable)) rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *); +extern void __attribute__((overloadable)) + rsgProgramFragmentConstantColor(rs_program_fragment, float, float, float, float); + extern uint __attribute__((overloadable)) rsgGetWidth(void); extern uint __attribute__((overloadable)) @@ -76,6 +79,8 @@ extern void __attribute__((overloadable)) /////////////////////////////////////////////////////// // misc + +// Depricated extern void __attribute__((overloadable)) color(float, float, float, float); |