Continue es2 shader dev
Conflicts: graphics/java/android/renderscript/Program.java graphics/java/android/renderscript/ProgramVertex.java
This commit is contained in:
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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 },
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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];
|
||||||
|
@ -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];
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 *);
|
||||||
|
Reference in New Issue
Block a user