diff options
Diffstat (limited to 'libs/rs/driver')
-rw-r--r-- | libs/rs/driver/rsdAllocation.cpp | 11 | ||||
-rw-r--r-- | libs/rs/driver/rsdCore.cpp | 11 | ||||
-rw-r--r-- | libs/rs/driver/rsdCore.h | 1 | ||||
-rw-r--r-- | libs/rs/driver/rsdGL.cpp | 10 | ||||
-rw-r--r-- | libs/rs/driver/rsdGL.h | 2 | ||||
-rw-r--r-- | libs/rs/driver/rsdMesh.cpp | 2 | ||||
-rw-r--r-- | libs/rs/driver/rsdMeshObj.cpp | 36 | ||||
-rw-r--r-- | libs/rs/driver/rsdMeshObj.h | 7 | ||||
-rw-r--r-- | libs/rs/driver/rsdPath.cpp | 185 | ||||
-rw-r--r-- | libs/rs/driver/rsdPath.h | 35 | ||||
-rw-r--r-- | libs/rs/driver/rsdProgramRaster.cpp | 3 | ||||
-rw-r--r-- | libs/rs/driver/rsdProgramStore.cpp | 4 | ||||
-rw-r--r-- | libs/rs/driver/rsdRuntimeStubs.cpp | 25 | ||||
-rw-r--r-- | libs/rs/driver/rsdShader.cpp | 97 |
14 files changed, 340 insertions, 89 deletions
diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp index fac40f2..ea92192 100644 --- a/libs/rs/driver/rsdAllocation.cpp +++ b/libs/rs/driver/rsdAllocation.cpp @@ -219,10 +219,13 @@ bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) { return false; } - void * ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + void * ptr = alloc->mHal.state.usrPtr; if (!ptr) { - free(drv); - return false; + ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + if (!ptr) { + free(drv); + return false; + } } drv->glTarget = GL_NONE; @@ -276,7 +279,7 @@ void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) { drv->renderTargetID = 0; } - if (drv->mallocPtr) { + if (drv->mallocPtr && !alloc->mHal.state.usrPtr) { free(drv->mallocPtr); drv->mallocPtr = NULL; } diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp index 9987027..e011955 100644 --- a/libs/rs/driver/rsdCore.cpp +++ b/libs/rs/driver/rsdCore.cpp @@ -18,6 +18,7 @@ #include "rsdAllocation.h" #include "rsdBcc.h" #include "rsdGL.h" +#include "rsdPath.h" #include "rsdProgramStore.h" #include "rsdProgramRaster.h" #include "rsdProgramVertex.h" @@ -115,6 +116,13 @@ static RsdHalFunctions FunctionTable = { }, { + rsdPathInitStatic, + rsdPathInitDynamic, + rsdPathDraw, + rsdPathDestroy + }, + + { rsdSamplerInit, rsdSamplerDestroy }, @@ -260,6 +268,9 @@ void SetPriority(const Context *rsc, int32_t priority) { for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) { setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority); } + if (dc->mHasGraphics) { + rsdGLSetPriority(rsc, priority); + } } void Shutdown(Context *rsc) { diff --git a/libs/rs/driver/rsdCore.h b/libs/rs/driver/rsdCore.h index 126c87a..168bdf3 100644 --- a/libs/rs/driver/rsdCore.h +++ b/libs/rs/driver/rsdCore.h @@ -41,6 +41,7 @@ typedef struct ScriptTLSStructRec { typedef struct RsdHalRec { uint32_t version_major; uint32_t version_minor; + bool mHasGraphics; struct Workers { volatile int mRunningCount; diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp index 368dd71..b136cc7 100644 --- a/libs/rs/driver/rsdGL.cpp +++ b/libs/rs/driver/rsdGL.cpp @@ -361,6 +361,7 @@ bool rsdGLInit(const Context *rsc) { dc->gl.vertexArrayState = new RsdVertexArrayState(); dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs); dc->gl.currentFrameBuffer = NULL; + dc->mHasGraphics = true; ALOGV("%p initGLThread end", rsc); rsc->setWatchdogGL(NULL, 0, NULL); @@ -421,6 +422,15 @@ void rsdGLSwap(const android::renderscript::Context *rsc) { RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface); } +void rsdGLSetPriority(const Context *rsc, int32_t priority) { + if (priority > 0) { + // Mark context as low priority. + ALOGV("low pri"); + } else { + ALOGV("normal pri"); + } +} + void rsdGLCheckError(const android::renderscript::Context *rsc, const char *msg, bool isFatal) { GLenum err = glGetError(); diff --git a/libs/rs/driver/rsdGL.h b/libs/rs/driver/rsdGL.h index 51893c3..e015cb1 100644 --- a/libs/rs/driver/rsdGL.h +++ b/libs/rs/driver/rsdGL.h @@ -82,6 +82,8 @@ bool rsdGLSetSurface(const android::renderscript::Context *rsc, void rsdGLSwap(const android::renderscript::Context *rsc); void rsdGLCheckError(const android::renderscript::Context *rsc, const char *msg, bool isFatal = false); +void rsdGLSetPriority(const android::renderscript::Context *rsc, + int32_t priority); #endif diff --git a/libs/rs/driver/rsdMesh.cpp b/libs/rs/driver/rsdMesh.cpp index eb62ddb..50daf3e 100644 --- a/libs/rs/driver/rsdMesh.cpp +++ b/libs/rs/driver/rsdMesh.cpp @@ -35,7 +35,7 @@ bool rsdMeshInit(const Context *rsc, const Mesh *m) { } drv = new RsdMeshObj(rsc, m); m->mHal.drv = drv; - return drv->init(); + return drv->init(rsc); } void rsdMeshDraw(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) { diff --git a/libs/rs/driver/rsdMeshObj.cpp b/libs/rs/driver/rsdMeshObj.cpp index 99d79dc..893f046 100644 --- a/libs/rs/driver/rsdMeshObj.cpp +++ b/libs/rs/driver/rsdMeshObj.cpp @@ -50,14 +50,9 @@ RsdMeshObj::~RsdMeshObj() { } bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { - // Do not create attribs for padding - if (elem->getFieldName(fieldIdx)[0] == '#') { - return false; - } - // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. // Filter rs types accordingly - RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); + RsDataType dt = elem->mHal.state.fields[fieldIdx]->mHal.state.dataType; if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && dt != RS_TYPE_SIGNED_16) { @@ -65,7 +60,7 @@ bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { } // Now make sure they are not arrays - uint32_t arraySize = elem->getFieldArraySize(fieldIdx); + uint32_t arraySize = elem->mHal.state.fieldArraySizes[fieldIdx]; if (arraySize != 1) { return false; } @@ -73,15 +68,15 @@ bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { return true; } -bool RsdMeshObj::init() { +bool RsdMeshObj::init(const Context *rsc) { - updateGLPrimitives(); + updateGLPrimitives(rsc); // Count the number of gl attrs to initialize mAttribCount = 0; for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) { const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement(); - for (uint32_t ct=0; ct < elem->getFieldCount(); ct++) { + for (uint32_t ct=0; ct < elem->mHal.state.fieldsCount; ct++) { if (isValidGLComponent(elem, ct)) { mAttribCount ++; } @@ -104,21 +99,21 @@ bool RsdMeshObj::init() { uint32_t userNum = 0; for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) { const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement(); - uint32_t stride = elem->getSizeBytes(); - for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { - const Component &c = elem->getField(fieldI)->getComponent(); + uint32_t stride = elem->mHal.state.elementSizeBytes; + for (uint32_t fieldI=0; fieldI < elem->mHal.state.fieldsCount; fieldI++) { + const Element *f = elem->mHal.state.fields[fieldI]; if (!isValidGLComponent(elem, fieldI)) { continue; } - mAttribs[userNum].size = c.getVectorSize(); - mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); - mAttribs[userNum].type = rsdTypeToGLType(c.getType()); - mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); + mAttribs[userNum].size = f->mHal.state.vectorSize; + mAttribs[userNum].offset = elem->mHal.state.fieldOffsetBytes[fieldI]; + mAttribs[userNum].type = rsdTypeToGLType(f->mHal.state.dataType); + mAttribs[userNum].normalized = f->mHal.state.dataType != RS_TYPE_FLOAT_32; mAttribs[userNum].stride = stride; String8 tmp(RS_SHADER_ATTR); - tmp.append(elem->getFieldName(fieldI)); + tmp.append(elem->mHal.state.fieldNames[fieldI]); mAttribs[userNum].name.setTo(tmp.string()); // Remember which allocation this attribute came from @@ -133,7 +128,7 @@ bool RsdMeshObj::init() { void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { if (len < 1 || primIndex >= mRSMesh->mHal.state.primitivesCount || mAttribCount == 0) { - ALOGE("Invalid mesh or parameters"); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh or parameters"); return; } @@ -186,7 +181,7 @@ void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex, rsdGLCheckError(rsc, "Mesh::renderPrimitiveRange"); } -void RsdMeshObj::updateGLPrimitives() { +void RsdMeshObj::updateGLPrimitives(const Context *rsc) { mGLPrimitives = new uint32_t[mRSMesh->mHal.state.primitivesCount]; for (uint32_t i = 0; i < mRSMesh->mHal.state.primitivesCount; i ++) { switch (mRSMesh->mHal.state.primitives[i]) { @@ -196,6 +191,7 @@ void RsdMeshObj::updateGLPrimitives() { case RS_PRIMITIVE_TRIANGLE: mGLPrimitives[i] = GL_TRIANGLES; break; case RS_PRIMITIVE_TRIANGLE_STRIP: mGLPrimitives[i] = GL_TRIANGLE_STRIP; break; case RS_PRIMITIVE_TRIANGLE_FAN: mGLPrimitives[i] = GL_TRIANGLE_FAN; break; + default: rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh primitive"); break; } } } diff --git a/libs/rs/driver/rsdMeshObj.h b/libs/rs/driver/rsdMeshObj.h index 8b1271b..1370f01 100644 --- a/libs/rs/driver/rsdMeshObj.h +++ b/libs/rs/driver/rsdMeshObj.h @@ -37,15 +37,16 @@ public: const android::renderscript::Mesh *); ~RsdMeshObj(); - void renderPrimitiveRange(const android::renderscript::Context *, uint32_t primIndex, uint32_t start, uint32_t len) const; + void renderPrimitiveRange(const android::renderscript::Context *, + uint32_t primIndex, uint32_t start, uint32_t len) const; - bool init(); + bool init(const android::renderscript::Context *rsc); protected: const android::renderscript::Mesh *mRSMesh; uint32_t *mGLPrimitives; - void updateGLPrimitives(); + void updateGLPrimitives(const android::renderscript::Context *rsc); bool isValidGLComponent(const android::renderscript::Element *elem, uint32_t fieldIdx); // Attribues that allow us to map to GL diff --git a/libs/rs/driver/rsdPath.cpp b/libs/rs/driver/rsdPath.cpp new file mode 100644 index 0000000..e04bc02 --- /dev/null +++ b/libs/rs/driver/rsdPath.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <GLES/gl.h> +#include <GLES2/gl2.h> +#include <GLES/glext.h> + +#include <rs_hal.h> +#include <rsContext.h> +#include <rsPath.h> + +#include "rsdCore.h" +#include "rsdPath.h" +#include "rsdAllocation.h" +#include "rsdGL.h" +#include "rsdVertexArray.h" +#include "rsdShaderCache.h" + +using namespace android; +using namespace android::renderscript; + +class DrvPath { +protected: + DrvPath(); +public: + virtual ~DrvPath(); + virtual void draw(Context *) = 0; +}; + +class DrvPathStatic : public DrvPath { +public: + typedef struct { + float x1, xc, x2; + float y1, yc, y2; + } segment_t; + + segment_t *mSegments; + uint32_t mSegmentCount; + + DrvPathStatic(const Allocation *vtx, const Allocation *loops); + virtual ~DrvPathStatic(); + + virtual void draw(Context *); +}; + +class DrvPathDynamic : public DrvPath { +public: + DrvPathDynamic(); + virtual ~DrvPathDynamic(); +}; + +static void cleanup(const Context *rsc, const Path *m) { + DrvPath *dp = (DrvPath *)m->mHal.drv; + if (dp) { + delete dp; + } +} + +bool rsdPathInitStatic(const Context *rsc, const Path *m, + const Allocation *vtx, const Allocation *loops) { + DrvPathStatic *drv = NULL; + cleanup(rsc, m); + + DrvPathStatic *dps = new DrvPathStatic(vtx, loops); + //LOGE("init path m %p, %p", m, dps); + m->mHal.drv = dps; + return dps != NULL; +} + +bool rsdPathInitDynamic(const Context *rsc, const Path *m) { + return false; +} + + +void rsdPathDraw(const Context *rsc, const Path *m) { + //LOGE("render m=%p", m); + + DrvPath *drv = (DrvPath *)m->mHal.drv; + if(drv) { + //LOGE("render 2 drv=%p", drv); + drv->draw((Context *)rsc); + } +} + +void rsdPathDestroy(const Context *rsc, const Path *m) { + cleanup(rsc, m); + m->mHal.drv = NULL; +} + + + + +DrvPath::DrvPath() { +} + +DrvPath::~DrvPath() { +} + +DrvPathStatic::DrvPathStatic(const Allocation *vtx, const Allocation *loops) { + mSegmentCount = vtx->getType()->getDimX() / 3; + mSegments = new segment_t[mSegmentCount]; + + const float *fin = (const float *)vtx->getPtr(); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + s->x1 = fin[0]; + s->y1 = fin[1]; + + s->xc = fin[2]; + s->yc = fin[3]; + + s->x2 = fin[4]; + s->y2 = fin[5]; + fin += 6; + } +} + +DrvPathStatic::~DrvPathStatic() { +} + +void DrvPathStatic::draw(Context *rsc) { + const static float color[24] = { + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + float vtx[12]; + + //LOGE("draw"); + if (!rsc->setupCheck()) { + return; + } + + RsdHal *dc = (RsdHal *)rsc->mHal.drv; + if (!dc->gl.shaderCache->setup(rsc)) { + return; + } + + RsdVertexArray::Attrib attribs[2]; + attribs[0].set(GL_FLOAT, 2, 8, false, (uint32_t)vtx, "ATTRIB_position"); + attribs[1].set(GL_FLOAT, 4, 16, false, (uint32_t)color, "ATTRIB_color"); + RsdVertexArray va(attribs, 2); + va.setup(rsc); + + //LOGE("mSegmentCount %i", mSegmentCount); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + + vtx[0] = s->x1; + vtx[1] = s->y1; + vtx[2] = s->xc; + vtx[3] = s->yc; + + vtx[4] = s->x2; + vtx[5] = s->y2; + vtx[6] = s->xc; + vtx[7] = s->yc; + + vtx[8] = s->x1; + vtx[9] = s->y1; + vtx[10] = s->x2; + vtx[11] = s->y2; + + RSD_CALL_GL(glDrawArrays, GL_LINES, 0, 6); + } + +} + +DrvPathDynamic::DrvPathDynamic() { +} + +DrvPathDynamic::~DrvPathDynamic() { +} diff --git a/libs/rs/driver/rsdPath.h b/libs/rs/driver/rsdPath.h new file mode 100644 index 0000000..fa00972 --- /dev/null +++ b/libs/rs/driver/rsdPath.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RSD_PATH_H +#define RSD_PATH_H + +#include <rs_hal.h> + + +bool rsdPathInitStatic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m, + const android::renderscript::Allocation *vertex, + const android::renderscript::Allocation *loops); +bool rsdPathInitDynamic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDraw(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDestroy(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); + + +#endif diff --git a/libs/rs/driver/rsdProgramRaster.cpp b/libs/rs/driver/rsdProgramRaster.cpp index b493759..e5a0291 100644 --- a/libs/rs/driver/rsdProgramRaster.cpp +++ b/libs/rs/driver/rsdProgramRaster.cpp @@ -45,6 +45,9 @@ void rsdProgramRasterSetActive(const Context *rsc, const ProgramRaster *pr) { case RS_CULL_NONE: RSD_CALL_GL(glDisable, GL_CULL_FACE); break; + default: + rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid cull type"); + break; } } diff --git a/libs/rs/driver/rsdProgramStore.cpp b/libs/rs/driver/rsdProgramStore.cpp index fca9ba9..c1295e8 100644 --- a/libs/rs/driver/rsdProgramStore.cpp +++ b/libs/rs/driver/rsdProgramStore.cpp @@ -111,7 +111,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) { drv->blendSrc = GL_SRC_ALPHA_SATURATE; break; default: - ALOGE("Unknown blend src mode."); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode."); goto error; } @@ -141,7 +141,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) { drv->blendDst = GL_ONE_MINUS_DST_ALPHA; break; default: - ALOGE("Unknown blend dst mode."); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode."); goto error; } diff --git a/libs/rs/driver/rsdRuntimeStubs.cpp b/libs/rs/driver/rsdRuntimeStubs.cpp index 14c2970..44bfb1c 100644 --- a/libs/rs/driver/rsdRuntimeStubs.cpp +++ b/libs/rs/driver/rsdRuntimeStubs.cpp @@ -25,6 +25,7 @@ #include "rsdCore.h" #include "rsdRuntime.h" +#include "rsdPath.h" #include <time.h> @@ -89,6 +90,16 @@ static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) { rsrBindTexture(rsc, sc, pf, slot, a); } +static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) { + GET_TLS(); + rsrBindConstant(rsc, sc, pv, slot, a); +} + +static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) { + GET_TLS(); + rsrBindConstant(rsc, sc, pf, slot, a); +} + static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) { GET_TLS(); rsrBindSampler(rsc, sc, pf, slot, s); @@ -204,6 +215,12 @@ static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) { rsrDrawRect(rsc, sc, x1, y1, x2, y2, z); } +static void SC_DrawPath(Path *p) { + GET_TLS(); + //rsrDrawPath(rsc, sc, p); + rsdPathDraw(rsc, p); +} + static void SC_DrawMesh(Mesh *m) { GET_TLS(); rsrDrawMesh(rsc, sc, m); @@ -533,6 +550,10 @@ static RsdSymbolTable gSyms[] = { { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true }, + { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true }, + { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true }, { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true }, @@ -580,6 +601,8 @@ static RsdSymbolTable gSyms[] = { { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false }, { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false }, { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false }, + { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false }, + { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false }, { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false }, { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false }, @@ -603,6 +626,8 @@ static RsdSymbolTable gSyms[] = { { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false }, { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false }, + { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false }, + { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false }, { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false }, diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp index 056a33a..3bca794 100644 --- a/libs/rs/driver/rsdShader.cpp +++ b/libs/rs/driver/rsdShader.cpp @@ -90,12 +90,12 @@ String8 RsdShader::getGLSLInputString() const { String8 s; for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { const Element *e = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < e->getFieldCount(); field++) { - const Element *f = e->getField(field); + for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { + const Element *f = e->mHal.state.fields[field]; // Cannot be complex - rsAssert(!f->getFieldCount()); - switch (f->getComponent().getVectorSize()) { + rsAssert(!f->mHal.state.fieldsCount); + switch (f->mHal.state.vectorSize) { case 1: s.append("attribute float ATTRIB_"); break; case 2: s.append("attribute vec2 ATTRIB_"); break; case 3: s.append("attribute vec3 ATTRIB_"); break; @@ -104,7 +104,7 @@ String8 RsdShader::getGLSLInputString() const { rsAssert(0); } - s.append(e->getFieldName(field)); + s.append(e->mHal.state.fieldNames[field]); s.append(";\n"); } } @@ -114,17 +114,13 @@ String8 RsdShader::getGLSLInputString() const { void RsdShader::appendAttributes() { for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { const Element *e = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < e->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fn = e->getFieldName(field); - - if (fn[0] == '#') { - continue; - } + for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { + const Element *f = e->mHal.state.fields[field]; + const char *fn = e->mHal.state.fieldNames[field]; // Cannot be complex - rsAssert(!f->getFieldCount()); - switch (f->getComponent().getVectorSize()) { + rsAssert(!f->mHal.state.fieldsCount); + switch (f->mHal.state.vectorSize) { case 1: mShader.append("attribute float ATTRIB_"); break; case 2: mShader.append("attribute vec2 ATTRIB_"); break; case 3: mShader.append("attribute vec3 ATTRIB_"); break; @@ -215,24 +211,20 @@ bool RsdShader::loadShader(const Context *rsc) { void RsdShader::appendUserConstants() { for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - for (uint32_t field=0; field < e->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fn = e->getFieldName(field); - - if (fn[0] == '#') { - continue; - } + for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { + const Element *f = e->mHal.state.fields[field]; + const char *fn = e->mHal.state.fieldNames[field]; // Cannot be complex - rsAssert(!f->getFieldCount()); - if (f->getType() == RS_TYPE_MATRIX_4X4) { + rsAssert(!f->mHal.state.fieldsCount); + if (f->mHal.state.dataType == RS_TYPE_MATRIX_4X4) { mShader.append("uniform mat4 UNI_"); - } else if (f->getType() == RS_TYPE_MATRIX_3X3) { + } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_3X3) { mShader.append("uniform mat3 UNI_"); - } else if (f->getType() == RS_TYPE_MATRIX_2X2) { + } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_2X2) { mShader.append("uniform mat2 UNI_"); } else { - switch (f->getComponent().getVectorSize()) { + switch (f->mHal.state.vectorSize) { case 1: mShader.append("uniform float UNI_"); break; case 2: mShader.append("uniform vec2 UNI_"); break; case 3: mShader.append("uniform vec3 UNI_"); break; @@ -243,8 +235,8 @@ void RsdShader::appendUserConstants() { } mShader.append(fn); - if (e->getFieldArraySize(field) > 1) { - mShader.appendFormat("[%d]", e->getFieldArraySize(field)); + if (e->mHal.state.fieldArraySizes[field] > 1) { + mShader.appendFormat("[%d]", e->mHal.state.fieldArraySizes[field]); } mShader.append(";\n"); } @@ -252,8 +244,8 @@ void RsdShader::appendUserConstants() { } void RsdShader::logUniform(const Element *field, const float *fd, uint32_t arraySize ) { - RsDataType dataType = field->getType(); - uint32_t elementSize = field->getSizeBytes() / sizeof(float); + RsDataType dataType = field->mHal.state.dataType; + uint32_t elementSize = field->mHal.state.elementSizeBytes / sizeof(float); for (uint32_t i = 0; i < arraySize; i ++) { if (arraySize > 1) { ALOGV("Array Element [%u]", i); @@ -274,7 +266,7 @@ void RsdShader::logUniform(const Element *field, const float *fd, uint32_t array ALOGV("{%f, %f", fd[0], fd[2]); ALOGV(" %f, %f}", fd[1], fd[3]); } else { - switch (field->getComponent().getVectorSize()) { + switch (field->mHal.state.vectorSize) { case 1: ALOGV("Uniform 1 = %f", fd[0]); break; @@ -299,7 +291,7 @@ void RsdShader::logUniform(const Element *field, const float *fd, uint32_t array void RsdShader::setUniform(const Context *rsc, const Element *field, const float *fd, int32_t slot, uint32_t arraySize ) { - RsDataType dataType = field->getType(); + RsDataType dataType = field->mHal.state.dataType; if (dataType == RS_TYPE_MATRIX_4X4) { RSD_CALL_GL(glUniformMatrix4fv, slot, arraySize, GL_FALSE, fd); } else if (dataType == RS_TYPE_MATRIX_3X3) { @@ -307,7 +299,7 @@ void RsdShader::setUniform(const Context *rsc, const Element *field, const float } else if (dataType == RS_TYPE_MATRIX_2X2) { RSD_CALL_GL(glUniformMatrix2fv, slot, arraySize, GL_FALSE, fd); } else { - switch (field->getComponent().getVectorSize()) { + switch (field->mHal.state.vectorSize) { case 1: RSD_CALL_GL(glUniform1fv, slot, arraySize, fd); break; @@ -462,15 +454,11 @@ void RsdShader::setupUserConstants(const Context *rsc, RsdShaderCache *sc, bool const uint8_t *data = static_cast<const uint8_t *>(alloc->getPtr()); const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - for (uint32_t field=0; field < e->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fieldName = e->getFieldName(field); - // If this field is padding, skip it - if (fieldName[0] == '#') { - continue; - } + for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { + const Element *f = e->mHal.state.fields[field]; + const char *fieldName = e->mHal.state.fieldNames[field]; - uint32_t offset = e->getFieldOffsetBytes(field); + uint32_t offset = e->mHal.state.fieldOffsetBytes[field]; const float *fd = reinterpret_cast<const float *>(&data[offset]); int32_t slot = -1; @@ -509,22 +497,13 @@ void RsdShader::initAttribAndUniformArray() { mAttribCount = 0; for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { const Element *elem = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < elem->getFieldCount(); field++) { - if (elem->getFieldName(field)[0] != '#') { - mAttribCount ++; - } - } + mAttribCount += elem->mHal.state.fieldsCount; } mUniformCount = 0; for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { const Element *elem = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - - for (uint32_t field=0; field < elem->getFieldCount(); field++) { - if (elem->getFieldName(field)[0] != '#') { - mUniformCount ++; - } - } + mUniformCount += elem->mHal.state.fieldsCount; } mUniformCount += mRSProgram->mHal.state.texturesCount; @@ -544,17 +523,17 @@ void RsdShader::initAttribAndUniformArray() { void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix) { - rsAssert(e->getFieldCount()); - for (uint32_t ct=0; ct < e->getFieldCount(); ct++) { - const Element *ce = e->getField(ct); - if (ce->getFieldCount()) { + rsAssert(e->mHal.state.fieldsCount); + for (uint32_t ct=0; ct < e->mHal.state.fieldsCount; ct++) { + const Element *ce = e->mHal.state.fields[ct]; + if (ce->mHal.state.fieldsCount) { initAddUserElement(ce, names, arrayLengths, count, prefix); - } else if (e->getFieldName(ct)[0] != '#') { + } else { String8 tmp(prefix); - tmp.append(e->getFieldName(ct)); + tmp.append(e->mHal.state.fieldNames[ct]); names[*count].setTo(tmp.string()); if (arrayLengths) { - arrayLengths[*count] = e->getFieldArraySize(ct); + arrayLengths[*count] = e->mHal.state.fieldArraySizes[ct]; } (*count)++; } |