summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsProgramFragment.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/rs/rsProgramFragment.cpp')
-rw-r--r--libs/rs/rsProgramFragment.cpp165
1 files changed, 81 insertions, 84 deletions
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index c17b94c..a045043 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -14,13 +14,19 @@
* limitations under the License.
*/
+#ifndef ANDROID_RS_BUILD_FOR_HOST
#include "rsContext.h"
-#include "rsProgramFragment.h"
-
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+#else
+#include "rsContextHostStub.h"
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#endif //ANDROID_RS_BUILD_FOR_HOST
+
+#include "rsProgramFragment.h"
using namespace android;
using namespace android::renderscript;
@@ -32,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]) {
@@ -47,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,
@@ -58,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;
}
@@ -67,76 +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()) {
- if (mPointSpriteEnable) {
- glEnable(GL_POINT_SPRITE_OES);
- } else {
- glDisable(GL_POINT_SPRITE_OES);
- }
- glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
- }
- 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)
@@ -144,11 +121,19 @@ void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state,
//LOGE("sgl2 frag1 %x", glGetError());
if ((state->mLast.get() == this) && !mDirty) {
- //return;
+ return;
}
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()) {
@@ -184,8 +169,9 @@ void ProgramFragment::loadShader(Context *rsc) {
void ProgramFragment::createShader()
{
mShader.setTo("precision mediump float;\n");
- mShader.append("varying vec4 varColor;\n");
+ mShader.append("varying lowp 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++) {
@@ -212,7 +198,11 @@ void ProgramFragment::createShader()
mShader.append("void main() {\n");
- mShader.append(" vec4 col = varColor;\n");
+ if (mVaryingColor) {
+ mShader.append(" lowp vec4 col = varColor;\n");
+ } else {
+ mShader.append(" lowp vec4 col = uni_Color;\n");
+ }
if (mTextureEnableMask) {
if (mPointSpriteEnable) {
@@ -282,11 +272,16 @@ 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
+{
+
+}
+
+ProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream)
+{
+ return NULL;
}
ProgramFragmentState::ProgramFragmentState()
@@ -300,14 +295,14 @@ ProgramFragmentState::~ProgramFragmentState()
}
-void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
+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);
}
@@ -328,6 +323,7 @@ RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc,
{
ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
pf->incUserRef();
+ //LOGE("rsi_ProgramFragmentCreate %p", pf);
return pf;
}
@@ -337,6 +333,7 @@ RsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderTe
{
ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
pf->incUserRef();
+ //LOGE("rsi_ProgramFragmentCreate2 %p", pf);
return pf;
}