Add RS support for generic attribs as input to vertex programs.

This commit is contained in:
Jason Sams
2010-01-04 16:52:27 -08:00
parent 7d46f612a2
commit e17964e150
14 changed files with 110 additions and 151 deletions

View File

@@ -76,8 +76,6 @@ public class RenderScript {
native void nContextBindProgramFragment(int pf);
native void nContextBindProgramVertex(int pf);
native void nContextBindProgramRaster(int pr);
native void nContextAddDefineI32(String name, int value);
native void nContextAddDefineF(String name, float value);
native void nContextPause();
native void nContextResume();
native int nContextGetMessage(int[] data, boolean wait);

View File

@@ -34,6 +34,9 @@ public class Type extends BaseObj {
private int mNativeCache;
Class mJavaClass;
public Element getElement() {
return mElement;
}
public int getX() {
return mDimX;

View File

@@ -1212,26 +1212,6 @@ nContextBindProgramRaster(JNIEnv *_env, jobject _this, jint pf)
rsContextBindProgramRaster(con, (RsProgramRaster)pf);
}
static void
nContextAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
const char* n = _env->GetStringUTFChars(name, NULL);
LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value);
rsContextSetDefineI32(con, n, value);
_env->ReleaseStringUTFChars(name, n);
}
static void
nContextAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
const char* n = _env->GetStringUTFChars(name, NULL);
LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value);
rsContextSetDefineF(con, n, value);
_env->ReleaseStringUTFChars(name, n);
}
// ---------------------------------------------------------------------------

View File

@@ -20,16 +20,6 @@ ContextBindProgramRaster {
param RsProgramRaster pgm
}
ContextSetDefineF {
param const char* name
param float value
}
ContextSetDefineI32 {
param const char* name
param int32_t value
}
ContextPause {
}

View File

@@ -264,6 +264,27 @@ String8 Component::getCType() const
return s;
}
String8 Component::getGLSLType() const
{
if (mType == RS_TYPE_SIGNED_32) {
switch(mVectorSize) {
case 1: return String8("int");
case 2: return String8("ivec2");
case 3: return String8("ivec3");
case 4: return String8("ivec4");
}
}
if (mType == RS_TYPE_FLOAT_32) {
switch(mVectorSize) {
case 1: return String8("float");
case 2: return String8("vec2");
case 3: return String8("vec3");
case 4: return String8("vec4");
}
}
return String8();
}
static const char * gTypeStrings[] = {
"NONE",
"F16",

View File

@@ -36,6 +36,7 @@ public:
uint32_t getGLType() const;
uint32_t getGLFormat() const;
String8 getCType() const;
String8 getGLSLType() const;
void dumpLOGV(const char *prefix) const;

View File

@@ -632,26 +632,6 @@ void Context::appendNameDefines(String8 *str) const
}
}
void Context::appendVarDefines(String8 *str) const
{
char buf[256];
for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
str->append("#define ");
str->append(mInt32Defines.keyAt(ct));
str->append(" ");
sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
str->append(buf);
}
for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
str->append("#define ");
str->append(mFloatDefines.keyAt(ct));
str->append(" ");
sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
str->append(buf);
}
}
bool Context::objDestroyOOBInit()
{
int status = pthread_mutex_init(&mObjDestroy.mMutex, NULL);
@@ -851,16 +831,6 @@ void rsi_ObjDestroy(Context *rsc, void *obj)
ob->decUserRef();
}
void rsi_ContextSetDefineF(Context *rsc, const char* name, float value)
{
rsc->addInt32Define(name, value);
}
void rsi_ContextSetDefineI32(Context *rsc, const char* name, int32_t value)
{
rsc->addFloatDefine(name, value);
}
void rsi_ContextPause(Context *rsc)
{
rsc->pause();

View File

@@ -105,7 +105,6 @@ public:
void removeName(ObjectBase *obj);
ObjectBase * lookupName(const char *name) const;
void appendNameDefines(String8 *str) const;
void appendVarDefines(String8 *str) const;
uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
@@ -127,14 +126,6 @@ public:
return mStateRaster.mDefault.get();
}
void addInt32Define(const char* name, int32_t value) {
mInt32Defines.add(String8(name), value);
}
void addFloatDefine(const char* name, float value) {
mFloatDefines.add(String8(name), value);
}
uint32_t getWidth() const {return mEGL.mWidth;}
uint32_t getHeight() const {return mEGL.mHeight;}
@@ -249,8 +240,6 @@ private:
Surface *mWndSurface;
Vector<ObjectBase *> mNames;
KeyedVector<String8,int> mInt32Defines;
KeyedVector<String8,float> mFloatDefines;
uint64_t mTimers[_RS_TIMER_TOTAL];
Timers mTimerActive;

View File

@@ -43,17 +43,6 @@ void Element::clear()
mFields = NULL;
mFieldCount = 0;
}
/*
void Element::setComponent(uint32_t idx, Component *c)
{
rsAssert(!mComponents[idx].get());
rsAssert(idx < mComponentCount);
mComponents[idx].set(c);
// Fixme: This should probably not be here
c->incUserRef();
}
*/
size_t Element::getSizeBits() const
{
@@ -152,6 +141,24 @@ String8 Element::getCType(uint32_t indent) const
return s;
}
String8 Element::getGLSLType(uint32_t indent) const
{
String8 s;
for (uint32_t ct=0; ct < indent; ct++) {
s.append(" ");
}
if (!mFieldCount) {
// Basic component.
s.append(mComponent.getGLSLType());
} else {
rsAssert(0);
//s.append("struct ");
//s.append(getCStructBody(indent));
}
return s;
}
@@ -194,58 +201,6 @@ RsElement rsi_ElementCreate2(Context *rsc,
return e;
}
/*
void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
{
ElementState * sec = &rsc->mStateElement;
rsAssert(bits > 0);
Element *c = Element::create(rsc, dk, dt, isNormalized, bits);
sec->mBuildList.add(c);
if (name)
sec->mNames.add(String8(name));
else
sec->mNames.add(String8(""));
}
RsElement rsi_ElementCreate(Context *rsc)
{
ElementState * sec = &rsc->mStateElement;
size_t count = sec->mBuildList.size();
rsAssert(count > 0);
if (count == 1) {
Element *se = sec->mBuildList[0];
se->incUserRef();
sec->mBuildList.clear();
sec->mNames.clear();
return se;
}
Element ** tmpElements = (Element **)calloc(count, sizeof(Element *));
const char ** tmpNames = (const char **)calloc(count, sizeof(char *));
size_t * tmpLengths = (size_t *)calloc(count, sizeof(size_t));
for (size_t ct = 0; ct < count; ct++) {
tmpElements[ct] = sec->mBuildList[ct];
tmpNames[ct] = sec->mNames[ct].string();
tmpLengths[ct] = sec->mNames[ct].length();
}
Element *se = Element::create(rsc, tmpElements, tmpNames, tmpLengths, count);
sec->mBuildList.clear();
sec->mNames.clear();
se->incUserRef();
free(tmpElements);
free(tmpNames);
free(tmpLengths);
return se;
}
*/
}
}

View File

@@ -32,13 +32,9 @@ class Element : public ObjectBase
public:
~Element();
//void setComponent(uint32_t idx, Component *c);
uint32_t getGLType() const;
uint32_t getGLFormat() const;
size_t getSizeBits() const;
size_t getSizeBytes() const {
return (getSizeBits() + 7) >> 3;
@@ -55,13 +51,12 @@ public:
const Component & getComponent() const {return mComponent;}
RsDataType getType() const {return mComponent.getType();}
//bool getIsNormalized() const {return mIsNormalized;}
RsDataKind getKind() const {return mComponent.getKind();}
uint32_t getBits() const {return mBits;}
//uint32_t getGLType() const;
String8 getCType(uint32_t indent=0) const;
String8 getCStructBody(uint32_t indent=0) const;
String8 getGLSLType(uint32_t indent=0) const;
void dumpLOGV(const char *prefix) const;
@@ -94,8 +89,6 @@ public:
ElementState();
~ElementState();
Vector<Element *> mBuildList;
Vector<String8> mNames;
};

View File

@@ -144,6 +144,42 @@ void Program::bindSampler(uint32_t slot, Sampler *s)
mDirty = true;
}
String8 Program::getGLSLInputString() const
{
String8 s;
for (uint32_t ct=0; ct < mInputCount; ct++) {
const Element *e = mInputElements[ct].get();
for (uint32_t field=0; field < e->getFieldCount(); field++) {
const Element *f = e->getField(field);
// Cannot be complex
rsAssert(!f->getFieldCount());
switch(f->getComponent().getVectorSize()) {
case 1: s.append("attribute float ATTRIB_"); break;
case 2: s.append("attribute vec2 ATTRIB_"); break;
case 3: s.append("attribute vec3 ATTRIB_"); break;
case 4: s.append("attribute vec4 ATTRIB_"); break;
default:
rsAssert(0);
}
s.append(e->getFieldName(field));
s.append(";\n");
}
}
return s;
}
String8 Program::getGLSLOutputString() const
{
return String8();
}
String8 Program::getGLSLConstantString() const
{
return String8();
}
void Program::createShader()
{

View File

@@ -53,6 +53,10 @@ public:
const String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
const String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
String8 getGLSLInputString() const;
String8 getGLSLOutputString() const;
String8 getGLSLConstantString() const;
protected:
// Components not listed in "in" will be passed though
// unless overwritten by components in out.

View File

@@ -116,12 +116,6 @@ void ProgramVertex::createShader()
{
mShader.setTo("");
for (uint32_t ct=0; ct < mAttribCount; ct++) {
mShader.append("attribute vec4 ");
mShader.append(mAttribNames[ct]);
mShader.append(";\n");
}
for (uint32_t ct=0; ct < mUniformCount; ct++) {
mShader.append("uniform mat4 ");
mShader.append(mUniformNames[ct]);
@@ -132,8 +126,34 @@ void ProgramVertex::createShader()
mShader.append("varying vec4 varTex0;\n");
if (mUserShader.length() > 1) {
for (uint32_t ct=0; ct < mInputCount; ct++) {
const Element *e = mInputElements[ct].get();
for (uint32_t field=0; field < e->getFieldCount(); field++) {
const Element *f = e->getField(field);
// Cannot be complex
rsAssert(!f->getFieldCount());
switch(f->getComponent().getVectorSize()) {
case 1: mShader.append("attribute float ATTRIB_"); break;
case 2: mShader.append("attribute vec2 ATTRIB_"); break;
case 3: mShader.append("attribute vec3 ATTRIB_"); break;
case 4: mShader.append("attribute vec4 ATTRIB_"); break;
default:
rsAssert(0);
}
mShader.append(e->getFieldName(field));
mShader.append(";\n");
}
}
mShader.append(mUserShader);
} else {
for (uint32_t ct=0; ct < mAttribCount; ct++) {
mShader.append("attribute vec4 ");
mShader.append(mAttribNames[ct]);
mShader.append(";\n");
}
mShader.append("void main() {\n");
mShader.append(" gl_Position = uni_MVP * attrib_Position;\n");
mShader.append(" gl_PointSize = attrib_PointSize.x;\n");

View File

@@ -137,7 +137,6 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s)
rsc->appendNameDefines(&tmp);
appendDecls(&tmp);
rsc->appendVarDefines(&tmp);
appendVarDefines(rsc, &tmp);
appendTypes(rsc, &tmp);
tmp.append("#line 1\n");