diff options
author | 2010-09-29 09:49:13 -0700 | |
---|---|---|
committer | 2010-09-29 09:49:13 -0700 | |
commit | 4378f1175546616c76ecb7f0b1159940ab22d5f4 (patch) | |
tree | 900b42e369c9cd58340c88dee93dc0139c7afe5c | |
parent | 5f421a56786cf7c71159280c51bd4280f5199cfb (diff) |
More robust attribute binding
Adding attribute and uniform debug logging.
Checking to see if aniso filtering is available.
Change-Id: I2ed9d166ed7ff3df971d7af18b7a33f4e3ade928
-rw-r--r-- | libs/rs/rsContext.cpp | 9 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 4 | ||||
-rw-r--r-- | libs/rs/rsFont.cpp | 4 | ||||
-rw-r--r-- | libs/rs/rsProgram.cpp | 41 | ||||
-rw-r--r-- | libs/rs/rsProgram.h | 2 | ||||
-rw-r--r-- | libs/rs/rsProgramFragment.cpp | 2 | ||||
-rw-r--r-- | libs/rs/rsProgramVertex.cpp | 5 | ||||
-rw-r--r-- | libs/rs/rsScriptC_LibGL.cpp | 4 | ||||
-rw-r--r-- | libs/rs/rsShaderCache.cpp | 29 | ||||
-rw-r--r-- | libs/rs/rsShaderCache.h | 6 | ||||
-rw-r--r-- | libs/rs/rsType.cpp | 17 | ||||
-rw-r--r-- | libs/rs/rsVertexArray.cpp | 31 |
12 files changed, 98 insertions, 56 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index a7f380f94f52..b4d501476f1b 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -278,6 +278,8 @@ void * Context::threadProc(void *vrsc) rsc->props.mLogScripts = getProp("debug.rs.script"); rsc->props.mLogObjects = getProp("debug.rs.object"); rsc->props.mLogShaders = getProp("debug.rs.shader"); + rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes"); + rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms"); rsc->props.mLogVisual = getProp("debug.rs.visual"); ScriptTLSStruct *tlsStruct = new ScriptTLSStruct; @@ -379,7 +381,7 @@ void * Context::helperThreadProc(void *vrsc) memset(&cpuset, 0, sizeof(cpuset)); cpuset.bits[idx / 64] |= 1ULL << (idx % 64); int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx], - sizeof(cpuset), &cpuset); + sizeof(cpuset), &cpuset); LOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret)); #endif @@ -614,6 +616,11 @@ void Context::setSurface(uint32_t w, uint32_t h, ANativeWindow *sur) glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &mGL.mMaxFragmentUniformVectors); mGL.OES_texture_npot = NULL != strstr((const char *)mGL.mExtensions, "GL_OES_texture_npot"); + mGL.EXT_texture_max_aniso = 1.0f; + bool hasAniso = NULL != strstr((const char *)mGL.mExtensions, "GL_EXT_texture_filter_anisotropic"); + if(hasAniso) { + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &mGL.EXT_texture_max_aniso); + } } } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index b85d2a8215d2..2e849303ee0c 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -158,6 +158,8 @@ public: bool mLogScripts; bool mLogObjects; bool mLogShaders; + bool mLogShadersAttr; + bool mLogShadersUniforms; bool mLogVisual; } props; @@ -169,6 +171,7 @@ public: mutable const ObjectBase * mObjHead; bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;} + float ext_texture_max_aniso() const {return mGL.EXT_texture_max_aniso; } uint32_t getMaxFragmentTextures() const {return mGL.mMaxFragmentTextureImageUnits;} uint32_t getMaxFragmentUniformVectors() const {return mGL.mMaxFragmentUniformVectors;} uint32_t getMaxVertexUniformVectors() const {return mGL.mMaxVertexUniformVectors;} @@ -209,6 +212,7 @@ protected: int32_t mMaxVertexTextureUnits; bool OES_texture_npot; + float EXT_texture_max_aniso; } mGL; uint32_t mWidth; diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index bd5713e9e78e..4f8d8df0fd50 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -575,8 +575,8 @@ void FontState::issueDrawCommand() { float *tex = vtx + 3; VertexArray va; - va.add(GL_FLOAT, 3, 20, false, (uint32_t)vtx, "position"); - va.add(GL_FLOAT, 2, 20, false, (uint32_t)tex, "texture0"); + va.add(GL_FLOAT, 3, 20, false, (uint32_t)vtx, "ATTRIB_position"); + va.add(GL_FLOAT, 2, 20, false, (uint32_t)tex, "ATTRIB_texture0"); va.setupGL2(mRSC, &mRSC->mStateVertexArray, &mRSC->mShaderCache); mIndexBuffer->uploadCheck(mRSC); diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp index 9c664627a2bc..2531a9bc4fd7 100644 --- a/libs/rs/rsProgram.cpp +++ b/libs/rs/rsProgram.cpp @@ -346,36 +346,61 @@ void Program::setupUserConstants(Context *rsc, ShaderCache *sc, bool isFragment) slot = sc->fragUniformSlot(uidx); } - //LOGE("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", slot, offset, ct, field, uidx, fieldName); + if(rsc->props.mLogShadersUniforms) { + LOGV("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", slot, offset, ct, field, uidx, fieldName); + } if (slot >= 0) { if(f->getType() == RS_TYPE_MATRIX_4X4) { + if(rsc->props.mLogShadersUniforms) { + LOGV("Matrix4x4"); + LOGV("{%f, %f, %f, %f", fd[0], fd[4], fd[8], fd[12]); + LOGV(" %f, %f, %f, %f", fd[1], fd[5], fd[9], fd[13]); + LOGV(" %f, %f, %f, %f", fd[2], fd[6], fd[10], fd[14]); + LOGV(" %f, %f, %f, %f}", fd[3], fd[7], fd[11], fd[15]); + } glUniformMatrix4fv(slot, 1, GL_FALSE, fd); - /*for(int i = 0; i < 4; i++) { - LOGE("Mat = %f %f %f %f", fd[i*4 + 0], fd[i*4 + 1], fd[i*4 + 2], fd[i*4 + 3]); - }*/ } else if(f->getType() == RS_TYPE_MATRIX_3X3) { + if(rsc->props.mLogShadersUniforms) { + LOGV("Matrix3x3"); + LOGV("{%f, %f, %f", fd[0], fd[3], fd[6]); + LOGV(" %f, %f, %f", fd[1], fd[4], fd[7]); + LOGV(" %f, %f, %f}", fd[2], fd[5], fd[8]); + } glUniformMatrix3fv(slot, 1, GL_FALSE, fd); } else if(f->getType() == RS_TYPE_MATRIX_2X2) { + if(rsc->props.mLogShadersUniforms){ + LOGV("Matrix2x2"); + LOGV("{%f, %f", fd[0], fd[2]); + LOGV(" %f, %f}", fd[1], fd[3]); + } glUniformMatrix2fv(slot, 1, GL_FALSE, fd); } else { switch(f->getComponent().getVectorSize()) { case 1: - //LOGE("Uniform 1 = %f", fd[0]); + if(rsc->props.mLogShadersUniforms) { + LOGV("Uniform 1 = %f", fd[0]); + } glUniform1fv(slot, 1, fd); break; case 2: - //LOGE("Uniform 2 = %f %f", fd[0], fd[1]); + if(rsc->props.mLogShadersUniforms) { + LOGV("Uniform 2 = %f %f", fd[0], fd[1]); + } glUniform2fv(slot, 1, fd); break; case 3: - //LOGE("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]); + if(rsc->props.mLogShadersUniforms) { + LOGV("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]); + } glUniform3fv(slot, 1, fd); break; case 4: - //LOGE("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]); + if(rsc->props.mLogShadersUniforms) { + LOGV("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]); + } glUniform4fv(slot, 1, fd); break; default: diff --git a/libs/rs/rsProgram.h b/libs/rs/rsProgram.h index a8f34c3ea26e..c93033b66306 100644 --- a/libs/rs/rsProgram.h +++ b/libs/rs/rsProgram.h @@ -26,6 +26,8 @@ namespace renderscript { class ShaderCache; #define RS_SHADER_INTERNAL "//rs_shader_internal\n" +#define RS_SHADER_ATTR "ATTRIB_" +#define RS_SHADER_UNI "UNI_" class Program : public ObjectBase { diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp index d511d213f301..275a1df0645a 100644 --- a/libs/rs/rsProgramFragment.cpp +++ b/libs/rs/rsProgramFragment.cpp @@ -149,7 +149,7 @@ void ProgramFragment::init(Context *rsc) mUniformCount = 0; if (mUserShader.size() > 0) { for (uint32_t ct=0; ct < mConstantCount; ct++) { - initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_"); + initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, RS_SHADER_UNI); } } mTextureUniformIndexStart = mUniformCount; diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp index 918625c5ab06..bd1298957aae 100644 --- a/libs/rs/rsProgramVertex.cpp +++ b/libs/rs/rsProgramVertex.cpp @@ -214,12 +214,11 @@ void ProgramVertex::init(Context *rsc) mAttribCount = 0; if (mUserShader.size() > 0) { for (uint32_t ct=0; ct < mInputCount; ct++) { - initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, "ATTRIB_"); + initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, RS_SHADER_ATTR); } - mUniformCount = 0; for (uint32_t ct=0; ct < mConstantCount; ct++) { - initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_"); + initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, RS_SHADER_UNI); } } createShader(); diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp index 4be50593db4f..fd4c379cb904 100644 --- a/libs/rs/rsScriptC_LibGL.cpp +++ b/libs/rs/rsScriptC_LibGL.cpp @@ -151,8 +151,8 @@ static void SC_drawQuadTexCoords(float x1, float y1, float z1, const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; VertexArray va; - va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position"); - va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0"); + va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); + va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); diff --git a/libs/rs/rsShaderCache.cpp b/libs/rs/rsShaderCache.cpp index 5c073b390bc7..28e3b1d77317 100644 --- a/libs/rs/rsShaderCache.cpp +++ b/libs/rs/rsShaderCache.cpp @@ -53,6 +53,11 @@ bool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag if (!frag->getShaderID()) { frag->loadShader(rsc); } + + // Don't try to cache if shaders failed to load + if(!vtx->getShaderID() || !frag->getShaderID()) { + return false; + } //LOGV("ShaderCache lookup vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID()); for (uint32_t ct=0; ct < mEntryCount; ct++) { @@ -90,7 +95,7 @@ bool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag e->vtx = vtx->getShaderID(); e->frag = frag->getShaderID(); e->program = glCreateProgram(); - e->mUserVertexProgram = vtx->isUserProgram(); + e->vtxAttrCount = vtx->getAttribCount(); if (mEntries[mEntryCount].program) { GLuint pgm = e->program; glAttachShader(pgm, vtx->getShaderID()); @@ -124,14 +129,15 @@ bool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag rsc->setError(RS_ERROR_BAD_SHADER, "Error linking GL Programs"); return false; } - if (vtx->isUserProgram()) { - for (uint32_t ct=0; ct < vtx->getAttribCount(); ct++) { - e->mVtxAttribSlots[ct] = glGetAttribLocation(pgm, vtx->getAttribName(ct)); - if (rsc->props.mLogShaders) { - LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->mVtxAttribSlots[ct]); - } + + for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) { + e->mVtxAttribSlots[ct] = glGetAttribLocation(pgm, vtx->getAttribName(ct)); + e->mVtxAttribNames[ct] = vtx->getAttribName(ct).string(); + if (rsc->props.mLogShaders) { + LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->mVtxAttribSlots[ct]); } } + for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) { e->mVtxUniformSlots[ct] = glGetUniformLocation(pgm, vtx->getUniformName(ct)); if (rsc->props.mLogShaders) { @@ -154,6 +160,15 @@ bool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag return true; } +int32_t ShaderCache::vtxAttribSlot(const String8 &attrName) const { + for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) { + if(attrName == mCurrent->mVtxAttribNames[ct]) { + return mCurrent->mVtxAttribSlots[ct]; + } + } + return -1; +} + void ShaderCache::cleanupVertex(uint32_t id) { } diff --git a/libs/rs/rsShaderCache.h b/libs/rs/rsShaderCache.h index df99ccc293ce..312c2513e69f 100644 --- a/libs/rs/rsShaderCache.h +++ b/libs/rs/rsShaderCache.h @@ -40,22 +40,22 @@ public: void cleanupAll(); - int32_t vtxAttribSlot(uint32_t a) const {return mCurrent->mVtxAttribSlots[a];} + int32_t vtxAttribSlot(const String8 &attrName) const; int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->mVtxUniformSlots[a];} int32_t fragAttribSlot(uint32_t a) const {return mCurrent->mFragAttribSlots[a];} int32_t fragUniformSlot(uint32_t a) const {return mCurrent->mFragUniformSlots[a];} - bool isUserVertexProgram() const {return mCurrent->mUserVertexProgram;} protected: typedef struct { uint32_t vtx; uint32_t frag; uint32_t program; + uint32_t vtxAttrCount; + const char* mVtxAttribNames[Program::MAX_ATTRIBS]; int32_t mVtxAttribSlots[Program::MAX_ATTRIBS]; int32_t mVtxUniformSlots[Program::MAX_UNIFORMS]; int32_t mFragAttribSlots[Program::MAX_ATTRIBS]; int32_t mFragUniformSlots[Program::MAX_UNIFORMS]; - bool mUserVertexProgram; bool mIsValid; } entry_t; entry_t *mEntries; diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp index 478cc95b9e07..1ee07cdb3e7d 100644 --- a/libs/rs/rsType.cpp +++ b/libs/rs/rsType.cpp @@ -145,21 +145,26 @@ uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) co void Type::makeGLComponents() { - if(getElement()->getFieldCount() >= RS_MAX_ATTRIBS) { - return; - } - uint32_t userNum = 0; - for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) { const Component &c = getElement()->getField(ct)->getComponent(); + if(getElement()->getFieldName(ct)[0] == '#') { + continue; + } + mAttribs[userNum].size = c.getVectorSize(); mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct); mAttribs[userNum].type = c.getGLType(); mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); - mAttribs[userNum].name.setTo(getElement()->getFieldName(ct)); + String8 tmp(RS_SHADER_ATTR); + tmp.append(getElement()->getFieldName(ct)); + mAttribs[userNum].name.setTo(tmp.string()); userNum ++; + + if(userNum == RS_MAX_ATTRIBS) { + return; + } } } diff --git a/libs/rs/rsVertexArray.cpp b/libs/rs/rsVertexArray.cpp index 16be5ea299a1..4d501246298e 100644 --- a/libs/rs/rsVertexArray.cpp +++ b/libs/rs/rsVertexArray.cpp @@ -84,10 +84,6 @@ void VertexArray::clear(uint32_t n) void VertexArray::add(const Attrib &a, uint32_t stride) { - // Skip padding - if(a.name[0] == '#') { - return; - } rsAssert(mCount < RS_MAX_ATTRIBS); mAttribs[mCount].set(a); mAttribs[mCount].buffer = mActiveBuffer; @@ -98,10 +94,6 @@ void VertexArray::add(const Attrib &a, uint32_t stride) void VertexArray::add(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name) { - // Skip padding - if(name[0] == '#') { - return; - } rsAssert(mCount < RS_MAX_ATTRIBS); mAttribs[mCount].clear(); mAttribs[mCount].type = type; @@ -117,7 +109,11 @@ void VertexArray::add(uint32_t type, uint32_t size, uint32_t stride, bool normal } void VertexArray::logAttrib(uint32_t idx, uint32_t slot) const { - LOGE("va %i: slot=%i name=%s buf=%i ptr=%p size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", idx, slot, + if(idx == 0) { + LOGV("Starting vertex attribute binding"); + } + LOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", + idx, slot, mAttribs[idx].name.string(), mAttribs[idx].buffer, mAttribs[idx].ptr, @@ -137,24 +133,13 @@ void VertexArray::setupGL2(const Context *rsc, class VertexArrayState *state, Sh rsc->checkError("VertexArray::setupGL2 disabled"); for (uint32_t ct=0; ct < mCount; ct++) { - int32_t slot = -1; - if (sc->isUserVertexProgram()) { - slot = sc->vtxAttribSlot(ct); - } else { - if (mAttribs[ct].name == "position") { - slot = 0; - } else if (mAttribs[ct].name == "color") { - slot = 1; - } else if (mAttribs[ct].name == "normal") { - slot = 2; - } else if (mAttribs[ct].name == "texture0") { - slot = 3; - } + int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name); + if(rsc->props.mLogShadersAttr) { + logAttrib(ct, slot); } if(slot < 0) { continue; } - //logAttrib(ct, slot); glEnableVertexAttribArray(slot); glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer); glVertexAttribPointer(slot, |