Continue es2 shader dev

Conflicts:

	graphics/java/android/renderscript/Program.java
	graphics/java/android/renderscript/ProgramVertex.java
This commit is contained in:
Jason Sams
2009-12-15 13:27:04 -08:00
parent b686ec7044
commit 7e5ab3b177
11 changed files with 158 additions and 60 deletions

View File

@ -29,10 +29,12 @@ public class Program extends BaseObj {
public static final int MAX_INPUT = 8; public static final int MAX_INPUT = 8;
public static final int MAX_OUTPUT = 8; public static final int MAX_OUTPUT = 8;
public static final int MAX_CONSTANT = 8; public static final int MAX_CONSTANT = 8;
public static final int MAX_TEXTURE = 8;
Element mInputs[]; Element mInputs[];
Element mOutputs[]; Element mOutputs[];
Type mConstants[]; Type mConstants[];
int mTextureCount;
String mShader; String mShader;
Program(int id, RenderScript rs) { Program(int id, RenderScript rs) {
@ -65,6 +67,7 @@ public class Program extends BaseObj {
mInputCount = 0; mInputCount = 0;
mOutputCount = 0; mOutputCount = 0;
mConstantCount = 0; mConstantCount = 0;
mTextureCount = 0;
} }
public void setShader(String s) { public void setShader(String s) {
@ -95,12 +98,12 @@ public class Program extends BaseObj {
mConstants[mConstantCount++] = t; mConstants[mConstantCount++] = t;
} }
public void addTexture(Type t) throws IllegalStateException { public void setTextureCount(int count) throws IllegalArgumentException {
// Should check for consistant and non-conflicting names... // Should check for consistant and non-conflicting names...
if(mTextureCount >= MAX_CONSTANT) { if(count >= MAX_CONSTANT) {
throw new IllegalArgumentException("Max input count exceeded."); throw new IllegalArgumentException("Max texture count exceeded.");
} }
mTextures[mTextureCount++] = t; mTextureCount = count;
} }
protected void initProgram(Program p) { protected void initProgram(Program p) {
@ -110,8 +113,7 @@ public class Program extends BaseObj {
System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount); System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
p.mConstants = new Type[mConstantCount]; p.mConstants = new Type[mConstantCount];
System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount); System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
p.mTextures = new Type[mTextureCount]; p.mTextureCount = mTextureCount;
System.arraycopy(mTextures, 0, p.mTextures, 0, mTextureCount);
} }
} }

View File

@ -25,7 +25,7 @@ import android.util.Log;
* @hide * @hide
* *
**/ **/
public class ProgramFragment extends BaseObj { public class ProgramFragment extends Program {
public static final int MAX_SLOT = 2; public static final int MAX_SLOT = 2;
public enum EnvMode { public enum EnvMode {
@ -41,8 +41,7 @@ public class ProgramFragment extends BaseObj {
ProgramFragment(int id, RenderScript rs) { ProgramFragment(int id, RenderScript rs) {
super(rs); super(id, rs);
mID = id;
} }
public void bindTexture(Allocation va, int slot) public void bindTexture(Allocation va, int slot)
@ -65,6 +64,37 @@ public class ProgramFragment extends BaseObj {
mRS.nProgramFragmentBindSampler(mID, slot, vs.mID); mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
} }
public static class ShaderBuilder extends BaseProgramBuilder {
public ShaderBuilder(RenderScript rs) {
super(rs);
}
public ProgramFragment create() {
mRS.validate();
int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2];
int idx = 0;
for (int i=0; i < mInputCount; i++) {
tmp[idx++] = 0;
tmp[idx++] = mInputs[i].mID;
}
for (int i=0; i < mOutputCount; i++) {
tmp[idx++] = 1;
tmp[idx++] = mOutputs[i].mID;
}
for (int i=0; i < mConstantCount; i++) {
tmp[idx++] = 2;
tmp[idx++] = mConstants[i].mID;
}
tmp[idx++] = 3;
tmp[idx++] = mTextureCount;
int id = mRS.nProgramFragmentCreate2(mShader, tmp);
ProgramFragment pf = new ProgramFragment(id, mRS);
initProgram(pf);
return pf;
}
}
public static class Builder { public static class Builder {
RenderScript mRS; RenderScript mRS;

View File

@ -79,10 +79,8 @@ public class ProgramVertex extends Program {
tmp[idx++] = 2; tmp[idx++] = 2;
tmp[idx++] = mConstants[i].mID; tmp[idx++] = mConstants[i].mID;
} }
for (int i=0; i < mTextureCount; i++) { tmp[idx++] = 3;
tmp[idx++] = 3; tmp[idx++] = mTextureCount;
tmp[idx++] = mTextures[i].mID;
}
int id = mRS.nProgramVertexCreate2(mShader, tmp); int id = mRS.nProgramVertexCreate2(mShader, tmp);
ProgramVertex pv = new ProgramVertex(id, mRS); ProgramVertex pv = new ProgramVertex(id, mRS);

View File

@ -175,6 +175,7 @@ public class RenderScript {
native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt); native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
native void nProgramFragmentSetShader(String txt); native void nProgramFragmentSetShader(String txt);
native int nProgramFragmentCreate(); native int nProgramFragmentCreate();
native int nProgramFragmentCreate2(String shader, int[] params);
native int nProgramVertexCreate(boolean texMat); native int nProgramVertexCreate(boolean texMat);
native int nProgramVertexCreate2(String shader, int[] params); native int nProgramVertexCreate2(String shader, int[] params);

View File

@ -1115,6 +1115,24 @@ nProgramFragmentCreate(JNIEnv *_env, jobject _this, jint slot, jboolean enable)
return (jint)rsProgramFragmentCreate(con); return (jint)rsProgramFragmentCreate(con);
} }
static jint
nProgramFragmentCreate2(JNIEnv *_env, jobject _this, jstring shader, jintArray params)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
const char* shaderUTF = _env->GetStringUTFChars(shader, NULL);
jint shaderLen = _env->GetStringUTFLength(shader);
jint *paramPtr = _env->GetIntArrayElements(params, NULL);
jint paramLen = _env->GetArrayLength(params);
LOG_API("nProgramFragmentCreate2, con(%p), shaderLen(%i), paramLen(%i)", con, shaderLen, paramLen);
jint ret = (jint)rsProgramFragmentCreate2(con, shaderUTF, shaderLen, (uint32_t *)paramPtr, paramLen);
_env->ReleaseStringUTFChars(shader, shaderUTF);
_env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
return ret;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
static jint static jint
@ -1444,6 +1462,7 @@ static JNINativeMethod methods[] = {
{"nProgramFragmentSetSlot", "(IZII)V", (void*)nProgramFragmentSetSlot }, {"nProgramFragmentSetSlot", "(IZII)V", (void*)nProgramFragmentSetSlot },
{"nProgramFragmentSetShader", "(Ljava/lang/String;)V", (void*)nProgramFragmentSetShader }, {"nProgramFragmentSetShader", "(Ljava/lang/String;)V", (void*)nProgramFragmentSetShader },
{"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate }, {"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate },
{"nProgramFragmentCreate2", "(Ljava/lang/String;[I)I", (void*)nProgramFragmentCreate2 },
{"nProgramRasterCreate", "(IIZZZ)I", (void*)nProgramRasterCreate }, {"nProgramRasterCreate", "(IIZZZ)I", (void*)nProgramRasterCreate },
{"nProgramRasterSetPointSize", "(IF)V", (void*)nProgramRasterSetPointSize }, {"nProgramRasterSetPointSize", "(IF)V", (void*)nProgramRasterSetPointSize },

View File

@ -167,6 +167,7 @@ enum RsProgramParam {
RS_PROGRAM_PARAM_INPUT, RS_PROGRAM_PARAM_INPUT,
RS_PROGRAM_PARAM_OUTPUT, RS_PROGRAM_PARAM_OUTPUT,
RS_PROGRAM_PARAM_CONSTANT, RS_PROGRAM_PARAM_CONSTANT,
RS_PROGRAM_PARAM_TEXTURE_COUNT,
}; };
enum RsPrimitive { enum RsPrimitive {

View File

@ -406,6 +406,14 @@ ProgramFragmentCreate {
ret RsProgramFragment ret RsProgramFragment
} }
ProgramFragmentCreate2 {
param const char * shaderText
param uint32_t shaderLength
param const uint32_t * params
param uint32_t paramLength
ret RsProgramFragment
}
ProgramVertexCreate { ProgramVertexCreate {
param bool texMat param bool texMat
ret RsProgramVertex ret RsProgramVertex
@ -416,7 +424,7 @@ ProgramVertexCreate2 {
param uint32_t shaderLength param uint32_t shaderLength
param const uint32_t * params param const uint32_t * params
param uint32_t paramLength param uint32_t paramLength
ret RsProgramFragment ret RsProgramVertex
} }
LightBegin { LightBegin {

View File

@ -51,6 +51,7 @@ Program::Program(Context *rsc, const char * shaderText, uint32_t shaderLength,
mShaderID = 0; mShaderID = 0;
mAttribCount = 0; mAttribCount = 0;
mUniformCount = 0; mUniformCount = 0;
mTextureCount = 0;
mInputCount = 0; mInputCount = 0;
mOutputCount = 0; mOutputCount = 0;
@ -66,6 +67,9 @@ Program::Program(Context *rsc, const char * shaderText, uint32_t shaderLength,
if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) { if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
mConstantCount++; mConstantCount++;
} }
if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_COUNT) {
mTextureCount = params[ct+1];
}
} }
mInputElements = new ObjectBaseRef<Element>[mInputCount]; mInputElements = new ObjectBaseRef<Element>[mInputCount];

View File

@ -66,6 +66,7 @@ protected:
String8 mUserShader; String8 mUserShader;
uint32_t mShaderID; uint32_t mShaderID;
uint32_t mTextureCount;
uint32_t mAttribCount; uint32_t mAttribCount;
uint32_t mUniformCount; uint32_t mUniformCount;
String8 mAttribNames[MAX_ATTRIBS]; String8 mAttribNames[MAX_ATTRIBS];

View File

@ -40,6 +40,19 @@ ProgramFragment::ProgramFragment(Context *rsc, Element *in, Element *out, bool p
mEnvModes[1] = RS_TEX_ENV_MODE_DECAL; mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
} }
ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
uint32_t shaderLength, const uint32_t * params,
uint32_t paramLength) :
Program(rsc, shaderText, shaderLength, params, paramLength)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
init(rsc);
mTextureEnableMask = (1 << mTextureCount) -1;
}
ProgramFragment::~ProgramFragment() ProgramFragment::~ProgramFragment()
{ {
} }
@ -158,58 +171,68 @@ void ProgramFragment::createShader()
mShader.append("varying vec4 varColor;\n"); mShader.append("varying vec4 varColor;\n");
mShader.append("varying vec4 varTex0;\n"); mShader.append("varying vec4 varTex0;\n");
uint32_t mask = mTextureEnableMask; if (mUserShader.length() > 1) {
uint32_t texNum = 0; for (uint32_t ct=0; ct < mTextureCount; ct++) {
while (mask) { char buf[256];
if (mask & 1) { sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
char buf[64];
mShader.append("uniform sampler2D uni_Tex");
sprintf(buf, "%i", texNum);
mShader.append(buf); mShader.append(buf);
mShader.append(";\n");
} }
mask >>= 1;
texNum++;
}
mShader.append(mUserShader);
mShader.append("void main() {\n"); } else {
mShader.append(" vec4 col = varColor;\n"); uint32_t mask = mTextureEnableMask;
uint32_t texNum = 0;
if (mTextureEnableMask) { while (mask) {
if (mPointSpriteEnable) { if (mask & 1) {
mShader.append(" vec2 tex0 = gl_PointCoord;\n"); char buf[64];
} else { mShader.append("uniform sampler2D uni_Tex");
mShader.append(" vec2 tex0 = varTex0.xy;\n"); sprintf(buf, "%i", texNum);
} mShader.append(buf);
} mShader.append(";\n");
mask = mTextureEnableMask;
texNum = 0;
while (mask) {
if (mask & 1) {
switch(mEnvModes[texNum]) {
case RS_TEX_ENV_MODE_REPLACE:
mShader.append(" col = texture2D(uni_Tex0, tex0);\n");
break;
case RS_TEX_ENV_MODE_MODULATE:
mShader.append(" col *= texture2D(uni_Tex0, tex0);\n");
break;
case RS_TEX_ENV_MODE_DECAL:
mShader.append(" col = texture2D(uni_Tex0, tex0);\n");
break;
} }
mask >>= 1;
texNum++;
} }
mask >>= 1;
texNum++;
mShader.append("void main() {\n");
mShader.append(" vec4 col = varColor;\n");
if (mTextureEnableMask) {
if (mPointSpriteEnable) {
mShader.append(" vec2 tex0 = gl_PointCoord;\n");
} else {
mShader.append(" vec2 tex0 = varTex0.xy;\n");
}
}
mask = mTextureEnableMask;
texNum = 0;
while (mask) {
if (mask & 1) {
switch(mEnvModes[texNum]) {
case RS_TEX_ENV_MODE_REPLACE:
mShader.append(" col = texture2D(uni_Tex0, tex0);\n");
break;
case RS_TEX_ENV_MODE_MODULATE:
mShader.append(" col *= texture2D(uni_Tex0, tex0);\n");
break;
case RS_TEX_ENV_MODE_DECAL:
mShader.append(" col = texture2D(uni_Tex0, tex0);\n");
break;
}
}
mask >>= 1;
texNum++;
}
//mShader.append(" col.a = 1.0;\n");
//mShader.append(" col.r = 0.5;\n");
mShader.append(" gl_FragColor = col;\n");
mShader.append("}\n");
} }
//mShader.append(" col.a = 1.0;\n");
//mShader.append(" col.r = 0.5;\n");
mShader.append(" gl_FragColor = col;\n");
mShader.append("}\n");
} }
void ProgramFragment::bindTexture(uint32_t slot, Allocation *a) void ProgramFragment::bindTexture(uint32_t slot, Allocation *a)
@ -361,6 +384,14 @@ RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc)
return pf; return pf;
} }
RsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
uint32_t shaderLength, const uint32_t * params,
uint32_t paramLength)
{
ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
pf->incUserRef();
return pf;
}
} }
} }

View File

@ -33,6 +33,9 @@ public:
ProgramFragment(Context *, Element *in, Element *out, bool pointSpriteEnable); ProgramFragment(Context *, Element *in, Element *out, bool pointSpriteEnable);
ProgramFragment(Context *rsc, const char * shaderText,
uint32_t shaderLength, const uint32_t * params,
uint32_t paramLength);
virtual ~ProgramFragment(); virtual ~ProgramFragment();
virtual void setupGL(const Context *, ProgramFragmentState *); virtual void setupGL(const Context *, ProgramFragmentState *);