diff options
author | 2011-12-20 12:37:59 -0800 | |
---|---|---|
committer | 2011-12-20 12:37:59 -0800 | |
commit | c9e7da6130e9e272873cbb465834c6755cea9afd (patch) | |
tree | 63f46d353895f868cfe92569759212fea29d8e4d | |
parent | 603e0bec0c45fb5fd303917b640bbc32efc6073b (diff) |
Adding simple hal struct to type.
Fixing off by 1 error in the element.
Change-Id: I0b142942c760cb861007af7099d35d0363f4e13b
-rw-r--r-- | libs/rs/rsElement.cpp | 2 | ||||
-rw-r--r-- | libs/rs/rsType.cpp | 63 | ||||
-rw-r--r-- | libs/rs/rsType.h | 43 | ||||
-rw-r--r-- | libs/rs/scriptc/rs_allocation.rsh | 6 |
4 files changed, 66 insertions, 48 deletions
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp index 8b60701769ce..1e022cfc251d 100644 --- a/libs/rs/rsElement.cpp +++ b/libs/rs/rsElement.cpp @@ -198,7 +198,7 @@ void Element::compute() { mHal.state.fields[ct] = mFields[ct].e.get(); mHal.state.fieldArraySizes[ct] = mFields[ct].arraySize; mHal.state.fieldNames[ct] = mFields[ct].name.string(); - mHal.state.fieldNameLengths[ct] = mFields[ct].name.length(); + mHal.state.fieldNameLengths[ct] = mFields[ct].name.length() + 1; // to include 0 mHal.state.fieldOffsetBytes[ct] = mFields[ct].offsetBits >> 3; } diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp index 271c9e2361a4..039714ecc6fb 100644 --- a/libs/rs/rsType.cpp +++ b/libs/rs/rsType.cpp @@ -46,12 +46,8 @@ void Type::clear() { delete [] mLODs; mLODs = NULL; } - mDimX = 0; - mDimY = 0; - mDimZ = 0; - mDimLOD = 0; - mFaces = false; mElement.clear(); + memset(&mHal, 0, sizeof(mHal)); } TypeState::TypeState() { @@ -62,16 +58,16 @@ TypeState::~TypeState() { } size_t Type::getOffsetForFace(uint32_t face) const { - rsAssert(mFaces); + rsAssert(mHal.state.faces); return 0; } void Type::compute() { uint32_t oldLODCount = mLODCount; - if (mDimLOD) { - uint32_t l2x = rsFindHighBit(mDimX) + 1; - uint32_t l2y = rsFindHighBit(mDimY) + 1; - uint32_t l2z = rsFindHighBit(mDimZ) + 1; + if (mHal.state.dimLOD) { + uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1; + uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1; + uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1; mLODCount = rsMax(l2x, l2y); mLODCount = rsMax(mLODCount, l2z); @@ -85,9 +81,9 @@ void Type::compute() { mLODs = new LOD[mLODCount]; } - uint32_t tx = mDimX; - uint32_t ty = mDimY; - uint32_t tz = mDimZ; + uint32_t tx = mHal.state.dimX; + uint32_t ty = mHal.state.dimY; + uint32_t tz = mHal.state.dimZ; size_t offset = 0; for (uint32_t lod=0; lod < mLODCount; lod++) { mLODs[lod].mX = tx; @@ -103,10 +99,11 @@ void Type::compute() { // At this point the offset is the size of a mipmap chain; mMipChainSizeBytes = offset; - if (mFaces) { + if (mHal.state.faces) { offset *= 6; } mTotalSizeBytes = offset; + mHal.state.element = mElement.get(); } uint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { @@ -127,7 +124,8 @@ uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) co return offset; } -uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const { +uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, + uint32_t x, uint32_t y) const { uint32_t offset = mLODs[lod].mOffset; offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); @@ -141,7 +139,12 @@ uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint void Type::dumpLOGV(const char *prefix) const { char buf[1024]; ObjectBase::dumpLOGV(prefix); - ALOGV("%s Type: x=%zu y=%zu z=%zu mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); + ALOGV("%s Type: x=%u y=%u z=%u mip=%i face=%i", prefix, + mHal.state.dimX, + mHal.state.dimY, + mHal.state.dimZ, + mHal.state.dimLOD, + mHal.state.faces); snprintf(buf, sizeof(buf), "%s element: ", prefix); mElement->dumpLOGV(buf); } @@ -155,12 +158,12 @@ void Type::serialize(OStream *stream) const { mElement->serialize(stream); - stream->addU32(mDimX); - stream->addU32(mDimY); - stream->addU32(mDimZ); + stream->addU32(mHal.state.dimX); + stream->addU32(mHal.state.dimY); + stream->addU32(mHal.state.dimZ); - stream->addU8((uint8_t)(mDimLOD ? 1 : 0)); - stream->addU8((uint8_t)(mFaces ? 1 : 0)); + stream->addU8((uint8_t)(mHal.state.dimLOD ? 1 : 0)); + stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0)); } Type *Type::createFromStream(Context *rsc, IStream *stream) { @@ -232,11 +235,11 @@ ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, Type *nt = new Type(rsc); returnRef.set(nt); nt->mElement.set(e); - nt->mDimX = dimX; - nt->mDimY = dimY; - nt->mDimZ = dimZ; - nt->mDimLOD = dimLOD; - nt->mFaces = dimFaces; + nt->mHal.state.dimX = dimX; + nt->mHal.state.dimY = dimY; + nt->mHal.state.dimZ = dimZ; + nt->mHal.state.dimLOD = dimLOD; + nt->mHal.state.faces = dimFaces; nt->compute(); ObjectBase::asyncLock(); @@ -248,14 +251,14 @@ ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, ObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { return getTypeRef(rsc, mElement.get(), dimX, - mDimY, mDimZ, mDimLOD, mFaces); + mHal.state.dimY, mHal.state.dimZ, mHal.state.dimLOD, mHal.state.faces); } ObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const { return getTypeRef(rsc, mElement.get(), dimX, dimY, - mDimZ, mDimLOD, mFaces); + mHal.state.dimZ, mHal.state.dimLOD, mHal.state.faces); } @@ -276,8 +279,8 @@ RsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, void rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { rsAssert(typeDataSize == 6); - // Pack the data in the follofing way mDimX; mDimY; mDimZ; - // mDimLOD; mDimFaces; mElement; into typeData + // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; + // mHal.state.dimLOD; mHal.state.faces; mElement; into typeData Type *t = static_cast<Type *>(type); (*typeData++) = t->getDimX(); diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h index bc0d9ffdbe46..074a6b4971e1 100644 --- a/libs/rs/rsType.h +++ b/libs/rs/rsType.h @@ -26,6 +26,24 @@ namespace renderscript { class Type : public ObjectBase { public: + struct Hal { + mutable void *drv; + + struct State { + const Element * element; + + // Size of the structure in the various dimensions. A missing Dimension is + // specified as a 0 and not a 1. + uint32_t dimX; + uint32_t dimY; + uint32_t dimZ; + bool dimLOD; + bool faces; + }; + State state; + }; + Hal mHal; + Type * createTex2D(const Element *, size_t w, size_t h, bool mip); size_t getOffsetForFace(uint32_t face) const; @@ -34,22 +52,25 @@ public: size_t getElementSizeBytes() const {return mElement->getSizeBytes();} const Element * getElement() const {return mElement.get();} - uint32_t getDimX() const {return mDimX;} - uint32_t getDimY() const {return mDimY;} - uint32_t getDimZ() const {return mDimZ;} - uint32_t getDimLOD() const {return mDimLOD;} - bool getDimFaces() const {return mFaces;} + uint32_t getDimX() const {return mHal.state.dimX;} + uint32_t getDimY() const {return mHal.state.dimY;} + uint32_t getDimZ() const {return mHal.state.dimZ;} + uint32_t getDimLOD() const {return mHal.state.dimLOD;} + bool getDimFaces() const {return mHal.state.faces;} uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;} uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;} uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;} - uint32_t getLODOffset(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mOffset;} + uint32_t getLODOffset(uint32_t lod) const { + rsAssert(lod < mLODCount); return mLODs[lod].mOffset; + } uint32_t getLODOffset(uint32_t lod, uint32_t x) const; uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const; uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const; - uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const; + uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, + uint32_t x, uint32_t y) const; uint32_t getLODCount() const {return mLODCount;} bool getIsNp2() const; @@ -95,14 +116,6 @@ protected: ObjectBaseRef<const Element> mElement; - // Size of the structure in the various dimensions. A missing Dimension is - // specified as a 0 and not a 1. - size_t mDimX; - size_t mDimY; - size_t mDimZ; - bool mDimLOD; - bool mFaces; - // count of mipmap levels, 0 indicates no mipmapping size_t mMipChainSizeBytes; diff --git a/libs/rs/scriptc/rs_allocation.rsh b/libs/rs/scriptc/rs_allocation.rsh index 83598f311c66..e890021c3b9e 100644 --- a/libs/rs/scriptc/rs_allocation.rsh +++ b/libs/rs/scriptc/rs_allocation.rsh @@ -234,7 +234,8 @@ extern rs_element __attribute__((overloadable)) /** * @param e element to get data from * @param index index of the sub-element to return - * @return length of the sub-element name + * @return length of the sub-element name including the null + * terminator (size of buffer needed to write the name) */ extern uint32_t __attribute__((overloadable)) rsElementGetSubElementNameLength(rs_element e, uint32_t index); @@ -244,7 +245,8 @@ extern uint32_t __attribute__((overloadable)) * @param index index of the sub-element * @param name array to store the name into * @param nameLength length of the provided name array - * @return number of characters written + * @return number of characters actually written, excluding the + * null terminator */ extern uint32_t __attribute__((overloadable)) rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength); |