diff options
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | rsCppUtils.cpp | 37 | ||||
-rw-r--r-- | rsCppUtils.h | 3 | ||||
-rw-r--r-- | rsElement.cpp | 57 | ||||
-rw-r--r-- | rsElement.h | 16 | ||||
-rw-r--r-- | rsFont.cpp | 15 | ||||
-rw-r--r-- | rsProgram.cpp | 13 | ||||
-rw-r--r-- | rsProgram.h | 3 | ||||
-rw-r--r-- | rsProgramFragment.cpp | 9 | ||||
-rw-r--r-- | rsProgramVertex.cpp | 23 |
10 files changed, 104 insertions, 73 deletions
@@ -117,6 +117,7 @@ LOCAL_SRC_FILES:= \ rsAnimation.cpp \ rsComponent.cpp \ rsContext.cpp \ + rsCppUtils.cpp \ rsDevice.cpp \ rsElement.cpp \ rsFBOCache.cpp \ diff --git a/rsCppUtils.cpp b/rsCppUtils.cpp new file mode 100644 index 00000000..899e7c9f --- /dev/null +++ b/rsCppUtils.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2013 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 "rsCppUtils.h" + +namespace android { +namespace renderscript { + +const char * rsuCopyString(const char *name) { + return rsuCopyString(name, strlen(name)); +} + +const char * rsuCopyString(const char *name, size_t len) { + char *n = new char[len+1]; + memcpy(n, name, len); + n[len] = 0; + return n; +} + + +} +} diff --git a/rsCppUtils.h b/rsCppUtils.h index f16325fc..342baf5c 100644 --- a/rsCppUtils.h +++ b/rsCppUtils.h @@ -124,6 +124,9 @@ namespace android { namespace android { namespace renderscript { +const char * rsuCopyString(const char *name); +const char * rsuCopyString(const char *name, size_t len); + #if 1 #define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0) #else diff --git a/rsElement.cpp b/rsElement.cpp index 712f17d6..559d567f 100644 --- a/rsElement.cpp +++ b/rsElement.cpp @@ -262,10 +262,21 @@ ObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, cons if (ee->getFieldCount() == count) { bool match = true; for (uint32_t i=0; i < count; i++) { + size_t len; + uint32_t asize = 1; + if (lengths) { + len = lengths[i]; + } else { + len = strlen(nin[i]); + } + if (asin) { + asize = asin[i]; + } + if ((ee->mFields[i].e.get() != ein[i]) || - (ee->mFields[i].name.length() != lengths[i]) || + (ee->mFields[i].name.length() != len) || (ee->mFields[i].name != nin[i]) || - (ee->mFields[i].arraySize != asin[i])) { + (ee->mFields[i].arraySize != asize)) { match = false; break; } @@ -284,9 +295,20 @@ ObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, cons e->mFields = new ElementField_t [count]; e->mFieldCount = count; for (size_t ct=0; ct < count; ct++) { + size_t len; + uint32_t asize = 1; + if (lengths) { + len = lengths[ct]; + } else { + len = strlen(nin[ct]); + } + if (asin) { + asize = asin[ct]; + } + e->mFields[ct].e.set(ein[ct]); - e->mFields[ct].name.setTo(nin[ct], lengths[ct]); - e->mFields[ct].arraySize = asin[ct]; + e->mFields[ct].name.setTo(nin[ct], len); + e->mFields[ct].arraySize = asize; } e->compute(); @@ -341,33 +363,6 @@ void Element::decRefs(const void *ptr) const { } } -Element::Builder::Builder() { - const uint32_t initialCapacity = 32; - mBuilderElementRefs.setCapacity(initialCapacity); - mBuilderElements.setCapacity(initialCapacity); - mBuilderNameStrings.setCapacity(initialCapacity); - mBuilderNameLengths.setCapacity(initialCapacity); - mBuilderArrays.setCapacity(initialCapacity); -} - -void Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) { - mBuilderElementRefs.push(ObjectBaseRef<const Element>(e)); - mBuilderElements.push(e); - mBuilderNameStrings.push(nameStr); - mBuilderNameLengths.push(strlen(nameStr)); - mBuilderArrays.push(arraySize); - -} - -ObjectBaseRef<const Element> Element::Builder::create(Context *rsc) { - return Element::createRef(rsc, mBuilderElements.size(), - &(mBuilderElements.editArray()[0]), - &(mBuilderNameStrings.editArray()[0]), - mBuilderNameLengths.editArray(), - mBuilderArrays.editArray()); -} - - ElementState::ElementState() { } diff --git a/rsElement.h b/rsElement.h index 1eae46df..32cfda14 100644 --- a/rsElement.h +++ b/rsElement.h @@ -57,18 +57,6 @@ public: }; Hal mHal; - class Builder { - public: - Builder(); - void add(const Element *e, const char *nameStr, uint32_t arraySize); - ObjectBaseRef<const Element> create(Context *rsc); - private: - Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; - Vector<const Element *> mBuilderElements; - Vector<const char*> mBuilderNameStrings; - Vector<size_t> mBuilderNameLengths; - Vector<uint32_t> mBuilderArrays; - }; uint32_t getGLType() const; uint32_t getGLFormat() const; @@ -133,8 +121,8 @@ public: static const Element* create(Context *rsc, size_t count, const Element **ein, const char **nin, - const size_t * lengths, - const uint32_t *asin) { + const size_t * lengths = NULL, + const uint32_t *asin = NULL) { ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); elem->incUserRef(); return elem.get(); @@ -508,10 +508,10 @@ void FontState::initRenderState() { RS_KIND_USER, false, 4); ObjectBaseRef<const Element> gammaElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1); - Element::Builder builder; - builder.add(colorElem.get(), "Color", 1); - builder.add(gammaElem.get(), "Gamma", 1); - ObjectBaseRef<const Element> constInput = builder.create(mRSC); + + const char *ebn1[] = { "Color", "Gamma" }; + const Element *ebe1[] = {colorElem.get(), gammaElem.get()}; + ObjectBaseRef<const Element> constInput = Element::create(mRSC, 2, ebe1, ebn1); ObjectBaseRef<Type> inputType = Type::getTypeRef(mRSC, constInput.get(), 1, 0, 0, false, false, 0); @@ -607,10 +607,9 @@ void FontState::initVertexArrayBuffers() { ObjectBaseRef<const Element> posElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); ObjectBaseRef<const Element> texElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2); - Element::Builder builder; - builder.add(posElem.get(), "position", 1); - builder.add(texElem.get(), "texture0", 1); - ObjectBaseRef<const Element> vertexDataElem = builder.create(mRSC); + const char *ebn1[] = { "position", "texture0" }; + const Element *ebe1[] = {posElem.get(), texElem.get()}; + ObjectBaseRef<const Element> vertexDataElem = Element::create(mRSC, 2, ebe1, ebn1); ObjectBaseRef<Type> vertexDataType = Type::getTypeRef(mRSC, vertexDataElem.get(), mMaxNumberOfQuads * 4, diff --git a/rsProgram.cpp b/rsProgram.cpp index 7114f29d..806d1de0 100644 --- a/rsProgram.cpp +++ b/rsProgram.cpp @@ -77,7 +77,9 @@ Program::Program(Context *rsc, const char * shaderText, size_t shaderLength, shaderText += internalTokenLen; shaderLength -= internalTokenLen; } - mUserShader.setTo(shaderText, shaderLength); + + mUserShader = rsuCopyString(shaderText, shaderLength); + mUserShaderLen = shaderLength; } Program::~Program() { @@ -98,6 +100,12 @@ Program::~Program() { mHal.state.inputElementsCount = 0; mHal.state.constantsCount = 0; mHal.state.texturesCount = 0; + + if (mUserShader != NULL) { + delete[] mUserShader; + mUserShader = NULL; + } + mUserShaderLen = 0; } bool Program::freeChildren() { @@ -134,6 +142,9 @@ void Program::initMemberVars() { mConstants = NULL; mIsInternal = false; + + mUserShader = NULL; + mUserShaderLen = 0; } void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) { diff --git a/rsProgram.h b/rsProgram.h index d0329306..be5631f0 100644 --- a/rsProgram.h +++ b/rsProgram.h @@ -78,7 +78,8 @@ protected: ObjectBaseRef<Element> *mInputElements; bool mIsInternal; - String8 mUserShader; + const char *mUserShader; + size_t mUserShaderLen; void initMemberVars(); }; diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp index fb00cd10..877b8bdb 100644 --- a/rsProgramFragment.cpp +++ b/rsProgramFragment.cpp @@ -30,7 +30,7 @@ ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, size_t s mConstantColor[2] = 1.f; mConstantColor[3] = 1.f; - mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader.string(), mUserShader.length(), + mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader, mUserShaderLen, textureNames, textureNamesCount, textureNamesLength); } @@ -103,9 +103,10 @@ void ProgramFragmentState::init(Context *rsc) { "}\n"; ObjectBaseRef<const Element> colorElem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); - Element::Builder builder; - builder.add(colorElem.get(), "Color", 1); - ObjectBaseRef<const Element> constInput = builder.create(rsc); + + const char *enames[] = { "Color" }; + const Element *eins[] = {colorElem.get()}; + ObjectBaseRef<const Element> constInput = Element::create(rsc, 1, eins, enames); ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false, 0); diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp index 30000b05..549dcaec 100644 --- a/rsProgramVertex.cpp +++ b/rsProgramVertex.cpp @@ -27,7 +27,7 @@ ProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, size_t shade const uint32_t * params, size_t paramLength) : Program(rsc, shaderText, shaderLength, params, paramLength) { - mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length(), + mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader, mUserShaderLen, textureNames, textureNamesCount, textureNamesLength); } @@ -174,19 +174,14 @@ void ProgramVertexState::init(Context *rsc) { ObjectBaseRef<const Element> f4Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); - Element::Builder constBuilder; - constBuilder.add(matrixElem.get(), "MV", 1); - constBuilder.add(matrixElem.get(), "P", 1); - constBuilder.add(matrixElem.get(), "TexMatrix", 1); - constBuilder.add(matrixElem.get(), "MVP", 1); - ObjectBaseRef<const Element> constInput = constBuilder.create(rsc); - - Element::Builder inputBuilder; - inputBuilder.add(f4Elem.get(), "position", 1); - inputBuilder.add(f4Elem.get(), "color", 1); - inputBuilder.add(f3Elem.get(), "normal", 1); - inputBuilder.add(f2Elem.get(), "texture0", 1); - ObjectBaseRef<const Element> attrElem = inputBuilder.create(rsc); + const char *ebn1[] = { "MV", "P", "TexMatrix", "MVP" }; + const Element *ebe1[] = {matrixElem.get(), matrixElem.get(), + matrixElem.get(), matrixElem.get()}; + ObjectBaseRef<const Element> constInput = Element::create(rsc, 4, ebe1, ebn1); + + const char *ebn2[] = { "position", "color", "normal", "texture0" }; + const Element *ebe2[] = {f4Elem.get(), f4Elem.get(), f3Elem.get(), f2Elem.get()}; + ObjectBaseRef<const Element> attrElem = Element::create(rsc, 4, ebe2, ebn2); ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false, 0); |