Loading libs/rs/rsAllocation.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -234,6 +234,12 @@ void Allocation::data(const void *data, uint32_t sizeBytes) LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes); return; } if (mType->getElement()->getHasReferences()) { incRefs(data, sizeBytes / mType->getElement()->getSizeBytes()); decRefs(mPtr, sizeBytes / mType->getElement()->getSizeBytes()); } memcpy(mPtr, data, size); sendDirty(); mUploadDefered = true; Loading @@ -256,6 +262,12 @@ void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32 mType->dumpLOGV("type info"); return; } if (mType->getElement()->getHasReferences()) { incRefs(data, count); decRefs(ptr, count); } memcpy(ptr, data, size); sendDirty(); mUploadDefered = true; Loading @@ -279,6 +291,10 @@ void Allocation::subData(uint32_t xoff, uint32_t yoff, for (uint32_t line=yoff; line < (yoff+h); line++) { uint8_t * ptr = static_cast<uint8_t *>(mPtr); if (mType->getElement()->getHasReferences()) { incRefs(src, w); decRefs(dst, w); } memcpy(dst, src, lineSize); src += lineSize; dst += destW * eSize; Loading Loading @@ -387,6 +403,32 @@ void Allocation::sendDirty() const } } void Allocation::incRefs(const void *ptr, size_t ct) const { const uint8_t *p = static_cast<const uint8_t *>(ptr); const Element *e = mType->getElement(); uint32_t stride = e->getSizeBytes(); while (ct > 0) { e->incRefs(p); ct --; p += stride; } } void Allocation::decRefs(const void *ptr, size_t ct) const { const uint8_t *p = static_cast<const uint8_t *>(ptr); const Element *e = mType->getElement(); uint32_t stride = e->getSizeBytes(); while (ct > 0) { e->decRefs(p); ct --; p += stride; } } ///////////////// // Loading libs/rs/rsAllocation.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public: bool getIsTexture() const {return mIsTexture;} bool getIsBufferObject() const {return mIsVertexBuffer;} void incRefs(const void *ptr, size_t ct) const; void decRefs(const void *ptr, size_t ct) const; protected: void sendDirty() const; Loading libs/rs/rsComponent.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,10 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) mBits = mTypeBits * mVectorSize; } bool Component::isReference() const { return (mType >= RS_TYPE_ELEMENT); } Loading libs/rs/rsComponent.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ public: void serialize(OStream *stream) const; void loadFromStream(IStream *stream); bool isReference() const; protected: RsDataType mType; RsDataKind mKind; Loading libs/rs/rsElement.cpp +50 −9 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ Element::Element(Context *rsc) : ObjectBase(rsc) mAllocLine = __LINE__; mFields = NULL; mFieldCount = 0; mHasReference = false; } Loading @@ -53,6 +54,7 @@ void Element::clear() delete [] mFields; mFields = NULL; mFieldCount = 0; mHasReference = false; } size_t Element::getSizeBits() const Loading @@ -68,15 +70,6 @@ size_t Element::getSizeBits() const return total; } size_t Element::getFieldOffsetBits(uint32_t componentNumber) const { size_t offset = 0; for (uint32_t ct = 0; ct < componentNumber; ct++) { offset += mFields[ct].e->mBits; } return offset; } void Element::dumpLOGV(const char *prefix) const { ObjectBase::dumpLOGV(prefix); Loading Loading @@ -124,11 +117,14 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) elem->mFieldCount = stream->loadU32(); if(elem->mFieldCount) { uint32_t offset = 0; elem->mFields = new ElementField_t [elem->mFieldCount]; for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) { stream->loadString(&elem->mFields[ct].name); Element *fieldElem = Element::createFromStream(rsc, stream); elem->mFields[ct].e.set(fieldElem); elem->mFields[ct].offsetBits = offset; offset += fieldElem->getSizeBits(); } } Loading Loading @@ -193,6 +189,7 @@ const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, Element *e = new Element(rsc); e->mComponent.set(dt, dk, isNorm, vecSize); e->mBits = e->mComponent.getBits(); e->mHasReference = e->mComponent.isReference(); rsc->mStateElement.mElements.push(e); return e; } Loading Loading @@ -223,9 +220,16 @@ const Element * Element::create(Context *rsc, size_t count, const Element **ein, Element *e = new Element(rsc); e->mFields = new ElementField_t [count]; e->mFieldCount = count; size_t bits = 0; for (size_t ct=0; ct < count; ct++) { e->mFields[ct].e.set(ein[ct]); e->mFields[ct].name.setTo(nin[ct], lengths[ct]); e->mFields[ct].offsetBits = bits; bits += ein[ct]->getSizeBits(); if (ein[ct]->mHasReference) { e->mHasReference = true; } } rsc->mStateElement.mElements.push(e); Loading @@ -251,6 +255,43 @@ String8 Element::getGLSLType(uint32_t indent) const return s; } void Element::incRefs(const void *ptr) const { if (!mFieldCount) { if (mComponent.isReference()) { ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); ObjectBase *ob = obp[0]; ob->incSysRef(); } return; } const uint8_t *p = static_cast<const uint8_t *>(ptr); for (uint32_t i=0; i < mFieldCount; i++) { if (mFields[i].e->mHasReference) { mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]); } } } void Element::decRefs(const void *ptr) const { if (!mFieldCount) { if (mComponent.isReference()) { ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); ObjectBase *ob = obp[0]; ob->decSysRef(); } return; } const uint8_t *p = static_cast<const uint8_t *>(ptr); for (uint32_t i=0; i < mFieldCount; i++) { if (mFields[i].e->mHasReference) { mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]); } } } ElementState::ElementState() Loading Loading
libs/rs/rsAllocation.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -234,6 +234,12 @@ void Allocation::data(const void *data, uint32_t sizeBytes) LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes); return; } if (mType->getElement()->getHasReferences()) { incRefs(data, sizeBytes / mType->getElement()->getSizeBytes()); decRefs(mPtr, sizeBytes / mType->getElement()->getSizeBytes()); } memcpy(mPtr, data, size); sendDirty(); mUploadDefered = true; Loading @@ -256,6 +262,12 @@ void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32 mType->dumpLOGV("type info"); return; } if (mType->getElement()->getHasReferences()) { incRefs(data, count); decRefs(ptr, count); } memcpy(ptr, data, size); sendDirty(); mUploadDefered = true; Loading @@ -279,6 +291,10 @@ void Allocation::subData(uint32_t xoff, uint32_t yoff, for (uint32_t line=yoff; line < (yoff+h); line++) { uint8_t * ptr = static_cast<uint8_t *>(mPtr); if (mType->getElement()->getHasReferences()) { incRefs(src, w); decRefs(dst, w); } memcpy(dst, src, lineSize); src += lineSize; dst += destW * eSize; Loading Loading @@ -387,6 +403,32 @@ void Allocation::sendDirty() const } } void Allocation::incRefs(const void *ptr, size_t ct) const { const uint8_t *p = static_cast<const uint8_t *>(ptr); const Element *e = mType->getElement(); uint32_t stride = e->getSizeBytes(); while (ct > 0) { e->incRefs(p); ct --; p += stride; } } void Allocation::decRefs(const void *ptr, size_t ct) const { const uint8_t *p = static_cast<const uint8_t *>(ptr); const Element *e = mType->getElement(); uint32_t stride = e->getSizeBytes(); while (ct > 0) { e->decRefs(p); ct --; p += stride; } } ///////////////// // Loading
libs/rs/rsAllocation.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public: bool getIsTexture() const {return mIsTexture;} bool getIsBufferObject() const {return mIsVertexBuffer;} void incRefs(const void *ptr, size_t ct) const; void decRefs(const void *ptr, size_t ct) const; protected: void sendDirty() const; Loading
libs/rs/rsComponent.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,10 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) mBits = mTypeBits * mVectorSize; } bool Component::isReference() const { return (mType >= RS_TYPE_ELEMENT); } Loading
libs/rs/rsComponent.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ public: void serialize(OStream *stream) const; void loadFromStream(IStream *stream); bool isReference() const; protected: RsDataType mType; RsDataKind mKind; Loading
libs/rs/rsElement.cpp +50 −9 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ Element::Element(Context *rsc) : ObjectBase(rsc) mAllocLine = __LINE__; mFields = NULL; mFieldCount = 0; mHasReference = false; } Loading @@ -53,6 +54,7 @@ void Element::clear() delete [] mFields; mFields = NULL; mFieldCount = 0; mHasReference = false; } size_t Element::getSizeBits() const Loading @@ -68,15 +70,6 @@ size_t Element::getSizeBits() const return total; } size_t Element::getFieldOffsetBits(uint32_t componentNumber) const { size_t offset = 0; for (uint32_t ct = 0; ct < componentNumber; ct++) { offset += mFields[ct].e->mBits; } return offset; } void Element::dumpLOGV(const char *prefix) const { ObjectBase::dumpLOGV(prefix); Loading Loading @@ -124,11 +117,14 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) elem->mFieldCount = stream->loadU32(); if(elem->mFieldCount) { uint32_t offset = 0; elem->mFields = new ElementField_t [elem->mFieldCount]; for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) { stream->loadString(&elem->mFields[ct].name); Element *fieldElem = Element::createFromStream(rsc, stream); elem->mFields[ct].e.set(fieldElem); elem->mFields[ct].offsetBits = offset; offset += fieldElem->getSizeBits(); } } Loading Loading @@ -193,6 +189,7 @@ const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, Element *e = new Element(rsc); e->mComponent.set(dt, dk, isNorm, vecSize); e->mBits = e->mComponent.getBits(); e->mHasReference = e->mComponent.isReference(); rsc->mStateElement.mElements.push(e); return e; } Loading Loading @@ -223,9 +220,16 @@ const Element * Element::create(Context *rsc, size_t count, const Element **ein, Element *e = new Element(rsc); e->mFields = new ElementField_t [count]; e->mFieldCount = count; size_t bits = 0; for (size_t ct=0; ct < count; ct++) { e->mFields[ct].e.set(ein[ct]); e->mFields[ct].name.setTo(nin[ct], lengths[ct]); e->mFields[ct].offsetBits = bits; bits += ein[ct]->getSizeBits(); if (ein[ct]->mHasReference) { e->mHasReference = true; } } rsc->mStateElement.mElements.push(e); Loading @@ -251,6 +255,43 @@ String8 Element::getGLSLType(uint32_t indent) const return s; } void Element::incRefs(const void *ptr) const { if (!mFieldCount) { if (mComponent.isReference()) { ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); ObjectBase *ob = obp[0]; ob->incSysRef(); } return; } const uint8_t *p = static_cast<const uint8_t *>(ptr); for (uint32_t i=0; i < mFieldCount; i++) { if (mFields[i].e->mHasReference) { mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]); } } } void Element::decRefs(const void *ptr) const { if (!mFieldCount) { if (mComponent.isReference()) { ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); ObjectBase *ob = obp[0]; ob->decSysRef(); } return; } const uint8_t *p = static_cast<const uint8_t *>(ptr); for (uint32_t i=0; i < mFieldCount; i++) { if (mFields[i].e->mHasReference) { mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]); } } } ElementState::ElementState() Loading