Loading graphics/java/android/renderscript/ProgramFragment.java +8 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public class ProgramFragment extends Program { public static final int MAX_TEXTURE = 2; RenderScript mRS; boolean mPointSpriteEnable; boolean mVaryingColorEnable; public enum EnvMode { REPLACE (1), Loading Loading @@ -120,9 +121,14 @@ public class ProgramFragment extends Program { return this; } public Builder setVaryingColor(boolean enable) { mVaryingColorEnable = enable; return this; } public ProgramFragment create() { mRS.validate(); int[] tmp = new int[MAX_TEXTURE * 2 + 1]; int[] tmp = new int[MAX_TEXTURE * 2 + 2]; if (mSlots[0] != null) { tmp[0] = mSlots[0].env.mID; tmp[1] = mSlots[0].format.mID; Loading @@ -132,6 +138,7 @@ public class ProgramFragment extends Program { tmp[3] = mSlots[1].format.mID; } tmp[4] = mPointSpriteEnable ? 1 : 0; tmp[5] = mVaryingColorEnable ? 1 : 0; int id = mRS.nProgramFragmentCreate(tmp); ProgramFragment pf = new ProgramFragment(id, mRS); pf.mTextureCount = MAX_TEXTURE; Loading libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java +4 −0 Original line number Diff line number Diff line Loading @@ -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); Loading libs/rs/java/Fountain/src/com/android/fountain/fountain.rs +2 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ #pragma rs java_package_name(com.android.fountain) #pragma stateFragment(parent) #include "rs_graphics.rsh" static int newPart = 0; Loading libs/rs/rsFont.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading libs/rs/rsProgramFragment.cpp +59 −83 Original line number Diff line number Diff line Loading @@ -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]) { Loading @@ -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, Loading @@ -64,88 +82,38 @@ ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, mAllocFile = __FILE__; mAllocLine = __LINE__; init(rsc); mTextureEnableMask = (1 << mTextureCount) -1; } mConstantColor[0] = 1.f; mConstantColor[1] = 1.f; mConstantColor[2] = 1.f; mConstantColor[3] = 1.f; ProgramFragment::~ProgramFragment() { } LOGE("Custom FP"); void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) { if ((state->mLast.get() == this) && !mDirty) { return; } state->mLast.set(this); mUniformCount = 2; mUniformNames[0].setTo("uni_Tex0"); mUniformNames[1].setTo("uni_Tex1"); 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; } createShader(); 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); mTextureEnableMask = (1 << mTextureCount) -1; } 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; ProgramFragment::~ProgramFragment() { } 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); void ProgramFragment::setConstantColor(float r, float g, float b, float a) { 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) Loading @@ -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()) { Loading Loading @@ -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++) { Loading @@ -221,7 +198,11 @@ void ProgramFragment::createShader() mShader.append("void main() {\n"); if (mVaryingColor) { mShader.append(" vec4 col = varColor;\n"); } else { mShader.append(" vec4 col = uni_Color;\n"); } if (mTextureEnableMask) { if (mPointSpriteEnable) { Loading Loading @@ -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 Loading @@ -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); } Loading Loading
graphics/java/android/renderscript/ProgramFragment.java +8 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public class ProgramFragment extends Program { public static final int MAX_TEXTURE = 2; RenderScript mRS; boolean mPointSpriteEnable; boolean mVaryingColorEnable; public enum EnvMode { REPLACE (1), Loading Loading @@ -120,9 +121,14 @@ public class ProgramFragment extends Program { return this; } public Builder setVaryingColor(boolean enable) { mVaryingColorEnable = enable; return this; } public ProgramFragment create() { mRS.validate(); int[] tmp = new int[MAX_TEXTURE * 2 + 1]; int[] tmp = new int[MAX_TEXTURE * 2 + 2]; if (mSlots[0] != null) { tmp[0] = mSlots[0].env.mID; tmp[1] = mSlots[0].format.mID; Loading @@ -132,6 +138,7 @@ public class ProgramFragment extends Program { tmp[3] = mSlots[1].format.mID; } tmp[4] = mPointSpriteEnable ? 1 : 0; tmp[5] = mVaryingColorEnable ? 1 : 0; int id = mRS.nProgramFragmentCreate(tmp); ProgramFragment pf = new ProgramFragment(id, mRS); pf.mTextureCount = MAX_TEXTURE; Loading
libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java +4 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
libs/rs/java/Fountain/src/com/android/fountain/fountain.rs +2 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ #pragma rs java_package_name(com.android.fountain) #pragma stateFragment(parent) #include "rs_graphics.rsh" static int newPart = 0; Loading
libs/rs/rsFont.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading
libs/rs/rsProgramFragment.cpp +59 −83 Original line number Diff line number Diff line Loading @@ -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]) { Loading @@ -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, Loading @@ -64,88 +82,38 @@ ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, mAllocFile = __FILE__; mAllocLine = __LINE__; init(rsc); mTextureEnableMask = (1 << mTextureCount) -1; } mConstantColor[0] = 1.f; mConstantColor[1] = 1.f; mConstantColor[2] = 1.f; mConstantColor[3] = 1.f; ProgramFragment::~ProgramFragment() { } LOGE("Custom FP"); void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) { if ((state->mLast.get() == this) && !mDirty) { return; } state->mLast.set(this); mUniformCount = 2; mUniformNames[0].setTo("uni_Tex0"); mUniformNames[1].setTo("uni_Tex1"); 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; } createShader(); 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); mTextureEnableMask = (1 << mTextureCount) -1; } 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; ProgramFragment::~ProgramFragment() { } 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); void ProgramFragment::setConstantColor(float r, float g, float b, float a) { 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) Loading @@ -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()) { Loading Loading @@ -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++) { Loading @@ -221,7 +198,11 @@ void ProgramFragment::createShader() mShader.append("void main() {\n"); if (mVaryingColor) { mShader.append(" vec4 col = varColor;\n"); } else { mShader.append(" vec4 col = uni_Color;\n"); } if (mTextureEnableMask) { if (mPointSpriteEnable) { Loading Loading @@ -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 Loading @@ -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); } Loading