Move to smart pointers for refcounting RS contexts Change-Id: I0dc6adc4e02c7427a4234c549d3555a501fe5f90
diff --git a/cpp/Allocation.cpp b/cpp/Allocation.cpp index d6f79b0..396018b 100644 --- a/cpp/Allocation.cpp +++ b/cpp/Allocation.cpp
@@ -14,23 +14,12 @@ * limitations under the License. */ -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> - #include "RenderScript.h" -#include "Element.h" -#include "Type.h" -#include "Allocation.h" using namespace android; using namespace renderscriptCpp; void * Allocation::getIDSafe() const { - //if (mAdaptedAllocation != NULL) { - //return mAdaptedAllocation.getID(); - //} return getID(); } @@ -47,7 +36,7 @@ } } -Allocation::Allocation(void *id, RenderScript *rs, sp<const Type> t, uint32_t usage) : +Allocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) : BaseObj(id, rs) { if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT | @@ -129,7 +118,7 @@ void Allocation::updateFromNative() { BaseObj::updateFromNative(); - const void *typeID = rsaAllocationGetType(mRS->mContext, getID()); + const void *typeID = rsaAllocationGetType(mRS->getContext(), getID()); if(typeID != NULL) { sp<const Type> old = mType; sp<Type> t = new Type((void *)typeID, mRS); @@ -149,79 +138,25 @@ default: ALOGE("Source must be exactly one usage type."); } - rsAllocationSyncAll(mRS->mContext, getIDSafe(), srcLocation); + rsAllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation); } void Allocation::ioSendOutput() { if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { ALOGE("Can only send buffer if IO_OUTPUT usage specified."); } - rsAllocationIoSend(mRS->mContext, getID()); + rsAllocationIoSend(mRS->getContext(), getID()); } void Allocation::ioGetInput() { if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { ALOGE("Can only send buffer if IO_OUTPUT usage specified."); } - rsAllocationIoReceive(mRS->mContext, getID()); + rsAllocationIoReceive(mRS->getContext(), getID()); } -/* -void copyFrom(BaseObj[] d) { - mRS.validate(); - validateIsObject(); - if (d.length != mCurrentCount) { - ALOGE("Array size mismatch, allocation sizeX = " + - mCurrentCount + ", array length = " + d.length); - } - int i[] = new int[d.length]; - for (int ct=0; ct < d.length; ct++) { - i[ct] = d[ct].getID(); - } - copy1DRangeFromUnchecked(0, mCurrentCount, i); -} -*/ - - -/* -void Allocation::setFromFieldPacker(int xoff, FieldPacker fp) { - mRS.validate(); - int eSize = mType.mElement.getSizeBytes(); - final byte[] data = fp.getData(); - - int count = data.length / eSize; - if ((eSize * count) != data.length) { - ALOGE("Field packer length " + data.length + - " not divisible by element size " + eSize + "."); - } - copy1DRangeFromUnchecked(xoff, count, data); -} - -void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) { - mRS.validate(); - if (component_number >= mType.mElement.mElements.length) { - ALOGE("Component_number " + component_number + " out of range."); - } - if(xoff < 0) { - ALOGE("Offset must be >= 0."); - } - - final byte[] data = fp.getData(); - int eSize = mType.mElement.mElements[component_number].getSizeBytes(); - eSize *= mType.mElement.mArraySizes[component_number]; - - if (data.length != eSize) { - ALOGE("Field packer sizelength " + data.length + - " does not match component size " + eSize + "."); - } - - mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD, - component_number, data, data.length); -} -*/ - void Allocation::generateMipmaps() { - rsAllocationGenerateMipmaps(mRS->mContext, getID()); + rsAllocationGenerateMipmaps(mRS->getContext(), getID()); } void Allocation::copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, @@ -240,7 +175,7 @@ return; } - rsAllocation1DData(mRS->mContext, getIDSafe(), off, mSelectedLOD, count, data, dataLen); + rsAllocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, dataLen); } void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int32_t *d, size_t dataLen) { @@ -266,7 +201,7 @@ void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff) { - rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), off, 0, + rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0, mSelectedLOD, mSelectedFace, count, 1, data->getIDSafe(), dataOff, 0, data->mSelectedLOD, data->mSelectedFace); @@ -285,28 +220,28 @@ void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const int8_t *data, size_t dataLen) { validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, + rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, w, h, data, dataLen); } void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const int16_t *data, size_t dataLen) { validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, + rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, w, h, data, dataLen); } void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const int32_t *data, size_t dataLen) { validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, + rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, w, h, data, dataLen); } void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const float *data, size_t dataLen) { validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, + rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, w, h, data, dataLen); } @@ -314,37 +249,13 @@ const Allocation *data, size_t dataLen, uint32_t dataXoff, uint32_t dataYoff) { validate2DRange(xoff, yoff, w, h); - rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), xoff, yoff, + rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, w, h, data->getIDSafe(), dataXoff, dataYoff, data->mSelectedLOD, data->mSelectedFace); } /* -void copyTo(byte[] d) { - validateIsInt8(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(short[] d) { - validateIsInt16(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(int[] d) { - validateIsInt32(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(float[] d) { - validateIsFloat32(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - void resize(int dimX) { if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); @@ -378,9 +289,9 @@ */ -android::sp<Allocation> Allocation::createTyped(RenderScript *rs, sp<const Type> type, +android::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, RsAllocationMipmapControl mips, uint32_t usage) { - void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, 0); + void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0); if (id == 0) { ALOGE("Allocation creation failed."); return NULL; @@ -388,92 +299,31 @@ return new Allocation(id, rs, type, usage); } -android::sp<Allocation> Allocation::createTyped(RenderScript *rs, sp<const Type> type, +android::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, RsAllocationMipmapControl mips, uint32_t usage, void *pointer) { - void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, (uint32_t)pointer); + void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, (uint32_t)pointer); if (id == 0) { ALOGE("Allocation creation failed."); } return new Allocation(id, rs, type, usage); } -android::sp<Allocation> Allocation::createTyped(RenderScript *rs, sp<const Type> type, +android::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, uint32_t usage) { return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage); } -android::sp<Allocation> Allocation::createSized(RenderScript *rs, sp<const Element> e, +android::sp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e, size_t count, uint32_t usage) { Type::Builder b(rs, e); b.setX(count); sp<const Type> t = b.create(); - void *id = rsAllocationCreateTyped(rs->mContext, t->getID(), + void *id = rsAllocationCreateTyped(rs->getContext(), t->getID(), RS_ALLOCATION_MIPMAP_NONE, usage, 0); if (id == 0) { ALOGE("Allocation creation failed."); } return new Allocation(id, rs, t, usage); } - - -/* -SurfaceTexture getSurfaceTexture() { - if ((mUsage & USAGE_GRAPHICS_SURFACE_TEXTURE_INPUT_OPAQUE) == 0) { - throw new RSInvalidStateException("Allocation is not a surface texture."); - } - - int id = mRS.nAllocationGetSurfaceTextureID(getID()); - return new SurfaceTexture(id); - -} - -void setSurfaceTexture(SurfaceTexture sur) { - if ((mUsage & USAGE_IO_OUTPUT) == 0) { - throw new RSInvalidStateException("Allocation is not USAGE_IO_OUTPUT."); - } - - mRS.validate(); - mRS.nAllocationSetSurfaceTexture(getID(), sur); -} - - -static Allocation createFromBitmapResource(RenderScript rs, - Resources res, - int id, - MipmapControl mips, - int usage) { - - rs.validate(); - Bitmap b = BitmapFactory.decodeResource(res, id); - Allocation alloc = createFromBitmap(rs, b, mips, usage); - b.recycle(); - return alloc; -} - -static Allocation createFromBitmapResource(RenderScript rs, - Resources res, - int id) { - return createFromBitmapResource(rs, res, id, - MipmapControl.MIPMAP_NONE, - USAGE_GRAPHICS_TEXTURE); -} - -static Allocation createFromString(RenderScript rs, - String str, - int usage) { - rs.validate(); - byte[] allocArray = NULL; - try { - allocArray = str.getBytes("UTF-8"); - Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage); - alloc.copyFrom(allocArray); - return alloc; - } - catch (Exception e) { - throw new RSRuntimeException("Could not convert string to utf-8."); - } -} -*/ -
diff --git a/cpp/Allocation.h b/cpp/Allocation.h deleted file mode 100644 index 7a893f8..0000000 --- a/cpp/Allocation.h +++ /dev/null
@@ -1,132 +0,0 @@ -/* - * Copyright (C) 2012 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 __ANDROID_ALLOCATION_H__ -#define __ANDROID_ALLOCATION_H__ - -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" -#include "Type.h" -#include "Element.h" - -namespace android { -namespace renderscriptCpp { - -class Allocation : public BaseObj { -protected: - android::sp<const Type> mType; - uint32_t mUsage; - android::sp<Allocation> mAdaptedAllocation; - - bool mConstrainedLOD; - bool mConstrainedFace; - bool mConstrainedY; - bool mConstrainedZ; - bool mReadAllowed; - bool mWriteAllowed; - uint32_t mSelectedY; - uint32_t mSelectedZ; - uint32_t mSelectedLOD; - RsAllocationCubemapFace mSelectedFace; - - uint32_t mCurrentDimX; - uint32_t mCurrentDimY; - uint32_t mCurrentDimZ; - uint32_t mCurrentCount; - - - void * getIDSafe() const; - void updateCacheInfo(sp<const Type> t); - - Allocation(void *id, RenderScript *rs, sp<const Type> t, uint32_t usage); - - void validateIsInt32(); - void validateIsInt16(); - void validateIsInt8(); - void validateIsFloat32(); - void validateIsObject(); - - virtual void updateFromNative(); - - void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h); - -public: - android::sp<const Type> getType() { - return mType; - } - - void syncAll(RsAllocationUsageType srcLocation); - void ioSendOutput(); - void ioGetInput(); - - //void copyFrom(BaseObj[] d); - //void copyFromUnchecked(int[] d); - //void copyFromUnchecked(short[] d); - //void copyFromUnchecked(byte[] d); - //void copyFromUnchecked(float[] d); - //void copyFrom(int[] d); - //void copyFrom(short[] d); - //void copyFrom(byte[] d); - //void copyFrom(float[] d); - //void setFromFieldPacker(int xoff, FieldPacker fp); - //void setFromFieldPacker(int xoff, int component_number, FieldPacker fp); - void generateMipmaps(); - void copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int32_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int16_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int8_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const float* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff); - - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int32_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int16_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int8_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const float *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const Allocation *data, size_t dataLen, - uint32_t dataXoff, uint32_t dataYoff); - - //void copyTo(byte[] d); - //void copyTo(short[] d); - //void copyTo(int[] d); - //void copyTo(float[] d); - void resize(int dimX); - void resize(int dimX, int dimY); - - static sp<Allocation> createTyped(RenderScript *rs, sp<const Type> type, - RsAllocationMipmapControl mips, uint32_t usage); - static sp<Allocation> createTyped(RenderScript *rs, sp<const Type> type, - RsAllocationMipmapControl mips, uint32_t usage, void * pointer); - - static sp<Allocation> createTyped(RenderScript *rs, sp<const Type> type, - uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); - static sp<Allocation> createSized(RenderScript *rs, sp<const Element> e, size_t count, - uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); - //SurfaceTexture *getSurfaceTexture(); - //void setSurfaceTexture(SurfaceTexture *sur); - -}; - -} -} - -#endif
diff --git a/cpp/Android.mk b/cpp/Android.mk index ada2866..8756ce7 100644 --- a/cpp/Android.mk +++ b/cpp/Android.mk
@@ -1,6 +1,18 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) +ifeq "REL" "$(PLATFORM_VERSION_CODENAME)" + RS_VERSION := $(PLATFORM_SDK_VERSION) +else + # Increment by 1 whenever this is not a final release build, since we want to + # be able to see the RS version number change during development. + # See build/core/version_defaults.mk for more information about this. + RS_VERSION := "(1 + $(PLATFORM_SDK_VERSION))" +endif +local_cflags_for_rs_cpp += -DRS_VERSION=$(RS_VERSION) + +LOCAL_CFLAGS += $(local_cflags_for_rs_cpp) + LOCAL_SRC_FILES:= \ RenderScript.cpp \ BaseObj.cpp \
diff --git a/cpp/BaseObj.cpp b/cpp/BaseObj.cpp index a370e8d..4a9faac 100644 --- a/cpp/BaseObj.cpp +++ b/cpp/BaseObj.cpp
@@ -16,10 +16,7 @@ #define LOG_TAG "libRS_cpp" -#include <rs.h> - #include "RenderScript.h" -#include "BaseObj.h" using namespace android; using namespace renderscriptCpp; @@ -36,7 +33,7 @@ } -BaseObj::BaseObj(void *id, RenderScript *rs) { +BaseObj::BaseObj(void *id, sp<RS> rs) { mRS = rs; mID = id; } @@ -48,14 +45,14 @@ } BaseObj::~BaseObj() { - rsObjDestroy(mRS->mContext, mID); + rsObjDestroy(mRS->getContext(), mID); mRS = NULL; mID = NULL; } void BaseObj::updateFromNative() { const char *name = NULL; - rsaGetName(mRS, mID, &name); + rsaGetName(mRS->getContext(), mID, &name); mName = name; } @@ -65,6 +62,3 @@ return true; return mID == obj->mID; } - - -
diff --git a/cpp/BaseObj.h b/cpp/BaseObj.h deleted file mode 100644 index 23ae85c..0000000 --- a/cpp/BaseObj.h +++ /dev/null
@@ -1,59 +0,0 @@ -/* - * Copyright (C) 2012 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 __ANDROID_BASE_OBJ_H__ -#define __ANDROID_BASE_OBJ_H__ - - -#include "utils/RefBase.h" -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" - -namespace android { -namespace renderscriptCpp { - - -class BaseObj : public android::LightRefBase<BaseObj> { -protected: - friend class Element; - friend class Type; - friend class Allocation; - friend class Script; - friend class ScriptC; - - void *mID; - RenderScript *mRS; - android::String8 mName; - - void * getID() const; - - BaseObj(void *id, RenderScript *rs); - void checkValid(); - - static void * getObjID(sp<const BaseObj> o); - -public: - - virtual ~BaseObj(); - virtual void updateFromNative(); - virtual bool equals(const BaseObj *obj); -}; - -} -} -#endif
diff --git a/cpp/Element.cpp b/cpp/Element.cpp index 2be4166..99b1069 100644 --- a/cpp/Element.cpp +++ b/cpp/Element.cpp
@@ -14,14 +14,10 @@ * limitations under the License. */ -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> #include <malloc.h> #include <string.h> #include "RenderScript.h" -#include "Element.h" using namespace android; using namespace renderscriptCpp; @@ -67,7 +63,7 @@ } -#define CREATE_USER(N, T) sp<const Element> Element::N(RenderScript *rs) { \ +#define CREATE_USER(N, T) sp<const Element> Element::N(sp<RS> rs) { \ return createUser(rs, RS_TYPE_##T); \ } CREATE_USER(BOOLEAN, BOOLEAN); @@ -95,7 +91,7 @@ CREATE_USER(MATRIX_3X3, MATRIX_3X3); CREATE_USER(MATRIX_2X2, MATRIX_2X2); -#define CREATE_PIXEL(N, T, K) sp<const Element> Element::N(RenderScript *rs) { \ +#define CREATE_PIXEL(N, T, K) sp<const Element> Element::N(sp<RS> rs) { \ return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ } CREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A); @@ -104,13 +100,13 @@ CREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA); CREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA); -#define CREATE_VECTOR(N, T) sp<const Element> Element::N##_2(RenderScript *rs) { \ +#define CREATE_VECTOR(N, T) sp<const Element> Element::N##_2(sp<RS> rs) { \ return createVector(rs, RS_TYPE_##T, 2); \ } \ -sp<const Element> Element::N##_3(RenderScript *rs) { \ +sp<const Element> Element::N##_3(sp<RS> rs) { \ return createVector(rs, RS_TYPE_##T, 3); \ } \ -sp<const Element> Element::N##_4(RenderScript *rs) { \ +sp<const Element> Element::N##_4(sp<RS> rs) { \ return createVector(rs, RS_TYPE_##T, 4); \ } CREATE_VECTOR(U8, UNSIGNED_8); @@ -148,8 +144,8 @@ } } -Element::Element(void *id, RenderScript *rs, - android::Vector<sp</*const*/ Element> > &elements, +Element::Element(void *id, sp<RS> rs, + android::Vector<sp<Element> > &elements, android::Vector<android::String8> &elementNames, android::Vector<uint32_t> &arraySizes) : BaseObj(id, rs) { mSizeBytes = 0; @@ -222,7 +218,7 @@ return 0; } -Element::Element(void *id, RenderScript *rs, +Element::Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : BaseObj(id, rs) { @@ -247,68 +243,25 @@ Element::~Element() { } - /* - Element(int id, RenderScript rs) { - super(id, rs); - } - */ - void Element::updateFromNative() { BaseObj::updateFromNative(); -/* - // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements - int[] dataBuffer = new int[5]; - mRS.nElementGetNativeData(getID(), dataBuffer); - - mNormalized = dataBuffer[2] == 1 ? true : false; - mVectorSize = dataBuffer[3]; - mSize = 0; - for (DataType dt: DataType.values()) { - if(dt.mID == dataBuffer[0]){ - mType = dt; - mSize = mType.mSize * mVectorSize; - } - } - for (DataKind dk: DataKind.values()) { - if(dk.mID == dataBuffer[1]){ - mKind = dk; - } - } - - int numSubElements = dataBuffer[4]; - if(numSubElements > 0) { - mElements = new Element[numSubElements]; - mElementNames = new String[numSubElements]; - mArraySizes = new int[numSubElements]; - mOffsetInBytes = new int[numSubElements]; - - int[] subElementIds = new int[numSubElements]; - mRS.nElementGetSubElements(getID(), subElementIds, mElementNames, mArraySizes); - for(int i = 0; i < numSubElements; i ++) { - mElements[i] = new Element(subElementIds[i], mRS); - mElements[i].updateFromNative(); - mOffsetInBytes[i] = mSize; - mSize += mElements[i].mSize * mArraySizes[i]; - } - } - */ updateVisibleSubElements(); } -sp<const Element> Element::createUser(RenderScript *rs, RsDataType dt) { - void * id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, 1); +sp<const Element> Element::createUser(sp<RS> rs, RsDataType dt) { + void * id = rsElementCreate(rs->getContext(), dt, RS_KIND_USER, false, 1); return new Element(id, rs, dt, RS_KIND_USER, false, 1); } -sp<const Element> Element::createVector(RenderScript *rs, RsDataType dt, uint32_t size) { +sp<const Element> Element::createVector(sp<RS> rs, RsDataType dt, uint32_t size) { if (size < 2 || size > 4) { rs->throwError("Vector size out of range 2-4."); } - void *id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, size); + void *id = rsElementCreate(rs->getContext(), dt, RS_KIND_USER, false, size); return new Element(id, rs, dt, RS_KIND_USER, false, size); } -sp<const Element> Element::createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk) { +sp<const Element> Element::createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk) { if (!(dk == RS_KIND_PIXEL_L || dk == RS_KIND_PIXEL_A || dk == RS_KIND_PIXEL_LA || @@ -355,7 +308,7 @@ break; } - void * id = rsElementCreate(rs->mContext, dt, dk, true, size); + void * id = rsElementCreate(rs->getContext(), dt, dk, true, size); return new Element(id, rs, dt, dk, true, size); } @@ -375,7 +328,7 @@ (mVectorSize == e->mVectorSize)); } -Element::Builder::Builder(RenderScript *rs) { +Element::Builder::Builder(sp<RS> rs) { mRS = rs; mSkipPadding = false; } @@ -417,7 +370,7 @@ sizeArray[ct] = mElementNames[ct].length(); } - void *id = rsElementCreate2(mRS->mContext, + void *id = rsElementCreate2(mRS->getContext(), (RsElement *)elementArray, fieldCount, nameArray, fieldCount * sizeof(size_t), sizeArray, (const uint32_t *)mArraySizes.array(), fieldCount);
diff --git a/cpp/Element.h b/cpp/Element.h deleted file mode 100644 index dea3570..0000000 --- a/cpp/Element.h +++ /dev/null
@@ -1,204 +0,0 @@ -/* - * Copyright (C) 2012 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 __ANDROID_ELEMENT_H__ -#define __ANDROID_ELEMENT_H__ - -#include <rs.h> -#include "RenderScript.h" -#include "BaseObj.h" - -namespace android { -namespace renderscriptCpp { - -class Element : public BaseObj { -public: - /** - * Return if a element is too complex for use as a data source for a Mesh or - * a Program. - * - * @return boolean - */ - bool isComplex(); - - /** - * @hide - * @return number of sub-elements in this element - */ - size_t getSubElementCount() { - return mVisibleElementMap.size(); - } - - /** - * @hide - * @param index index of the sub-element to return - * @return sub-element in this element at given index - */ - sp<const Element> getSubElement(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return sub-element in this element at given index - */ - const char * getSubElementName(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return array size of sub-element in this element at given index - */ - size_t getSubElementArraySize(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return offset in bytes of sub-element in this element at given index - */ - uint32_t getSubElementOffsetBytes(uint32_t index); - - /** - * @hide - * @return element data type - */ - RsDataType getDataType() const { - return mType; - } - - /** - * @hide - * @return element data kind - */ - RsDataKind getDataKind() const { - return mKind; - } - - size_t getSizeBytes() const { - return mSizeBytes; - } - - - static sp<const Element> BOOLEAN(RenderScript *rs); - static sp<const Element> U8(RenderScript *rs); - static sp<const Element> I8(RenderScript *rs); - static sp<const Element> U16(RenderScript *rs); - static sp<const Element> I16(RenderScript *rs); - static sp<const Element> U32(RenderScript *rs); - static sp<const Element> I32(RenderScript *rs); - static sp<const Element> U64(RenderScript *rs); - static sp<const Element> I64(RenderScript *rs); - static sp<const Element> F32(RenderScript *rs); - static sp<const Element> F64(RenderScript *rs); - static sp<const Element> ELEMENT(RenderScript *rs); - static sp<const Element> TYPE(RenderScript *rs); - static sp<const Element> ALLOCATION(RenderScript *rs); - static sp<const Element> SAMPLER(RenderScript *rs); - static sp<const Element> SCRIPT(RenderScript *rs); - static sp<const Element> MESH(RenderScript *rs); - static sp<const Element> PROGRAM_FRAGMENT(RenderScript *rs); - static sp<const Element> PROGRAM_VERTEX(RenderScript *rs); - static sp<const Element> PROGRAM_RASTER(RenderScript *rs); - static sp<const Element> PROGRAM_STORE(RenderScript *rs); - - static sp<const Element> A_8(RenderScript *rs); - static sp<const Element> RGB_565(RenderScript *rs); - static sp<const Element> RGB_888(RenderScript *rs); - static sp<const Element> RGBA_5551(RenderScript *rs); - static sp<const Element> RGBA_4444(RenderScript *rs); - static sp<const Element> RGBA_8888(RenderScript *rs); - - static sp<const Element> F32_2(RenderScript *rs); - static sp<const Element> F32_3(RenderScript *rs); - static sp<const Element> F32_4(RenderScript *rs); - static sp<const Element> F64_2(RenderScript *rs); - static sp<const Element> F64_3(RenderScript *rs); - static sp<const Element> F64_4(RenderScript *rs); - static sp<const Element> U8_2(RenderScript *rs); - static sp<const Element> U8_3(RenderScript *rs); - static sp<const Element> U8_4(RenderScript *rs); - static sp<const Element> I8_2(RenderScript *rs); - static sp<const Element> I8_3(RenderScript *rs); - static sp<const Element> I8_4(RenderScript *rs); - static sp<const Element> U16_2(RenderScript *rs); - static sp<const Element> U16_3(RenderScript *rs); - static sp<const Element> U16_4(RenderScript *rs); - static sp<const Element> I16_2(RenderScript *rs); - static sp<const Element> I16_3(RenderScript *rs); - static sp<const Element> I16_4(RenderScript *rs); - static sp<const Element> U32_2(RenderScript *rs); - static sp<const Element> U32_3(RenderScript *rs); - static sp<const Element> U32_4(RenderScript *rs); - static sp<const Element> I32_2(RenderScript *rs); - static sp<const Element> I32_3(RenderScript *rs); - static sp<const Element> I32_4(RenderScript *rs); - static sp<const Element> U64_2(RenderScript *rs); - static sp<const Element> U64_3(RenderScript *rs); - static sp<const Element> U64_4(RenderScript *rs); - static sp<const Element> I64_2(RenderScript *rs); - static sp<const Element> I64_3(RenderScript *rs); - static sp<const Element> I64_4(RenderScript *rs); - static sp<const Element> MATRIX_4X4(RenderScript *rs); - static sp<const Element> MATRIX_3X3(RenderScript *rs); - static sp<const Element> MATRIX_2X2(RenderScript *rs); - - Element(void *id, RenderScript *rs, - android::Vector<sp</*const*/ Element> > &elements, - android::Vector<android::String8> &elementNames, - android::Vector<uint32_t> &arraySizes); - Element(void *id, RenderScript *rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size); - Element(RenderScript *rs); - virtual ~Element(); - - void updateFromNative(); - static sp<const Element> createUser(RenderScript *rs, RsDataType dt); - static sp<const Element> createVector(RenderScript *rs, RsDataType dt, uint32_t size); - static sp<const Element> createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk); - bool isCompatible(sp<const Element>e); - - class Builder { - private: - RenderScript *mRS; - android::Vector<sp</*const*/ Element> > mElements; - android::Vector<android::String8> mElementNames; - android::Vector<uint32_t> mArraySizes; - bool mSkipPadding; - - public: - Builder(RenderScript *rs); - ~Builder(); - void add(sp</*const*/ Element>, android::String8 &name, uint32_t arraySize = 1); - sp<const Element> create(); - }; - -private: - void updateVisibleSubElements(); - - android::Vector<sp</*const*/ Element> > mElements; - android::Vector<android::String8> mElementNames; - android::Vector<uint32_t> mArraySizes; - android::Vector<uint32_t> mVisibleElementMap; - android::Vector<uint32_t> mOffsetInBytes; - - RsDataType mType; - RsDataKind mKind; - bool mNormalized; - size_t mSizeBytes; - size_t mVectorSize; -}; - -} -} -#endif
diff --git a/cpp/RenderScript.cpp b/cpp/RenderScript.cpp index 889f27b..3160b4d 100644 --- a/cpp/RenderScript.cpp +++ b/cpp/RenderScript.cpp
@@ -19,6 +19,7 @@ #include <utils/Log.h> #include <malloc.h> #include <string.h> +#include <pthread.h> #include "RenderScript.h" #include "rs.h" @@ -26,10 +27,10 @@ using namespace android; using namespace renderscriptCpp; -bool RenderScript::gInitialized = false; -pthread_mutex_t RenderScript::gInitMutex = PTHREAD_MUTEX_INITIALIZER; +bool RS::gInitialized = false; +pthread_mutex_t RS::gInitMutex = PTHREAD_MUTEX_INITIALIZER; -RenderScript::RenderScript() { +RS::RS() { mDev = NULL; mContext = NULL; mErrorFunc = NULL; @@ -39,7 +40,7 @@ memset(&mElements, 0, sizeof(mElements)); } -RenderScript::~RenderScript() { +RS::~RS() { mMessageRun = false; rsContextDeinitToClient(mContext); @@ -53,7 +54,11 @@ mDev = NULL; } -bool RenderScript::init(int targetApi) { +bool RS::init() { + return RS::init(RS_VERSION); +} + +bool RS::init(int targetApi) { mDev = rsDeviceCreate(); if (mDev == 0) { ALOGE("Device creation failed"); @@ -66,12 +71,11 @@ return false; } - pid_t mNativeMessageThreadId; int status = pthread_create(&mMessageThreadId, NULL, threadProc, this); if (status) { - ALOGE("Failed to start RenderScript message thread."); + ALOGE("Failed to start RS message thread."); return false; } // Wait for the message thread to be active. @@ -82,15 +86,15 @@ return true; } -void RenderScript::throwError(const char *err) const { +void RS::throwError(const char *err) const { ALOGE("RS CPP error: %s", err); int * v = NULL; v[0] = 0; } -void * RenderScript::threadProc(void *vrsc) { - RenderScript *rs = static_cast<RenderScript *>(vrsc); +void * RS::threadProc(void *vrsc) { + RS *rs = static_cast<RS *>(vrsc); size_t rbuf_size = 256; void * rbuf = malloc(rbuf_size); @@ -110,7 +114,7 @@ rbuf = realloc(rbuf, rbuf_size); } if (!rbuf) { - ALOGE("RenderScript::message handler realloc error %zu", rbuf_size); + ALOGE("RS::message handler realloc error %zu", rbuf_size); // No clean way to recover now? } rsContextGetMessage(rs->mContext, rbuf, rbuf_size, &receiveLen, sizeof(receiveLen), @@ -139,30 +143,21 @@ break; default: - ALOGE("RenderScript unknown message type %i", r); + ALOGE("RS unknown message type %i", r); } } if (rbuf) { free(rbuf); } - ALOGE("RenderScript Message thread exiting."); + ALOGE("RS Message thread exiting."); return NULL; } -void RenderScript::setErrorHandler(ErrorHandlerFunc_t func) { +void RS::setErrorHandler(ErrorHandlerFunc_t func) { mErrorFunc = func; } -void RenderScript::setMessageHandler(MessageHandlerFunc_t func) { +void RS::setMessageHandler(MessageHandlerFunc_t func) { mMessageFunc = func; } - -void RenderScript::contextDump() { -} - -void RenderScript::finish() { - -} - -
diff --git a/cpp/RenderScript.h b/cpp/RenderScript.h index e6e7279..9e74922 100644 --- a/cpp/RenderScript.h +++ b/cpp/RenderScript.h
@@ -17,145 +17,7 @@ #ifndef ANDROID_RENDERSCRIPT_H #define ANDROID_RENDERSCRIPT_H - -#include <pthread.h> -#include <utils/String8.h> -#include <utils/Vector.h> - #include "rsDefines.h" +#include "rsCppStructs.h" -namespace android { -namespace renderscriptCpp { - -class Element; -class Type; -class Allocation; - -class RenderScript { - friend class BaseObj; - friend class Allocation; - friend class Element; - friend class Type; - friend class Script; - friend class ScriptC; - -public: - RenderScript(); - virtual ~RenderScript(); - - typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText); - typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen); - - - void setErrorHandler(ErrorHandlerFunc_t func); - ErrorHandlerFunc_t getErrorHandler() {return mErrorFunc;} - - void setMessageHandler(MessageHandlerFunc_t func); - MessageHandlerFunc_t getMessageHandler() {return mMessageFunc;} - - bool init(int targetApi); - void contextDump(); - void finish(); - -private: - static bool gInitialized; - static pthread_mutex_t gInitMutex; - - pthread_t mMessageThreadId; - pid_t mNativeMessageThreadId; - bool mMessageRun; - - RsDevice mDev; - RsContext mContext; - - ErrorHandlerFunc_t mErrorFunc; - MessageHandlerFunc_t mMessageFunc; - - struct { - Element *U8; - Element *I8; - Element *U16; - Element *I16; - Element *U32; - Element *I32; - Element *U64; - Element *I64; - Element *F32; - Element *F64; - Element *BOOLEAN; - - Element *ELEMENT; - Element *TYPE; - Element *ALLOCATION; - Element *SAMPLER; - Element *SCRIPT; - Element *MESH; - Element *PROGRAM_FRAGMENT; - Element *PROGRAM_VERTEX; - Element *PROGRAM_RASTER; - Element *PROGRAM_STORE; - - Element *A_8; - Element *RGB_565; - Element *RGB_888; - Element *RGBA_5551; - Element *RGBA_4444; - Element *RGBA_8888; - - Element *FLOAT_2; - Element *FLOAT_3; - Element *FLOAT_4; - - Element *DOUBLE_2; - Element *DOUBLE_3; - Element *DOUBLE_4; - - Element *UCHAR_2; - Element *UCHAR_3; - Element *UCHAR_4; - - Element *CHAR_2; - Element *CHAR_3; - Element *CHAR_4; - - Element *USHORT_2; - Element *USHORT_3; - Element *USHORT_4; - - Element *SHORT_2; - Element *SHORT_3; - Element *SHORT_4; - - Element *UINT_2; - Element *UINT_3; - Element *UINT_4; - - Element *INT_2; - Element *INT_3; - Element *INT_4; - - Element *ULONG_2; - Element *ULONG_3; - Element *ULONG_4; - - Element *LONG_2; - Element *LONG_3; - Element *LONG_4; - - Element *MATRIX_4X4; - Element *MATRIX_3X3; - Element *MATRIX_2X2; - } mElements; - - - - void throwError(const char *err) const; - - static void * threadProc(void *); - -}; - -} -} #endif -
diff --git a/cpp/Script.cpp b/cpp/Script.cpp index 63d5fab..074c463 100644 --- a/cpp/Script.cpp +++ b/cpp/Script.cpp
@@ -14,22 +14,16 @@ * limitations under the License. */ -#define LOG_TAG "libRS_cpp" - #include <utils/Log.h> #include <malloc.h> #include "RenderScript.h" -#include "Element.h" -#include "Type.h" -#include "Allocation.h" -#include "Script.h" using namespace android; using namespace renderscriptCpp; void Script::invoke(uint32_t slot, const void *v, size_t len) const { - rsScriptInvokeV(mRS->mContext, getID(), slot, v, len); + rsScriptInvokeV(mRS->getContext(), getID(), slot, v, len); } void Script::forEach(uint32_t slot, sp<const Allocation> ain, sp<const Allocation> aout, @@ -39,34 +33,28 @@ } void *in_id = BaseObj::getObjID(ain); void *out_id = BaseObj::getObjID(aout); - rsScriptForEach(mRS->mContext, getID(), slot, in_id, out_id, usr, usrLen); + rsScriptForEach(mRS->getContext(), getID(), slot, in_id, out_id, usr, usrLen); } -Script::Script(void *id, RenderScript *rs) : BaseObj(id, rs) { +Script::Script(void *id, sp<RS> rs) : BaseObj(id, rs) { } void Script::bindAllocation(sp<Allocation> va, uint32_t slot) const { - rsScriptBindAllocation(mRS->mContext, getID(), BaseObj::getObjID(va), slot); + rsScriptBindAllocation(mRS->getContext(), getID(), BaseObj::getObjID(va), slot); } void Script::setVar(uint32_t index, sp<const BaseObj> o) const { - rsScriptSetVarObj(mRS->mContext, getID(), index, (o == NULL) ? 0 : o->getID()); + rsScriptSetVarObj(mRS->getContext(), getID(), index, (o == NULL) ? 0 : o->getID()); } void Script::setVar(uint32_t index, const void *v, size_t len) const { - rsScriptSetVarV(mRS->mContext, getID(), index, v, len); + rsScriptSetVarV(mRS->getContext(), getID(), index, v, len); } - - -void Script::FieldBase::init(RenderScript *rs, uint32_t dimx, uint32_t usages) { +void Script::FieldBase::init(sp<RS> rs, uint32_t dimx, uint32_t usages) { mAllocation = Allocation::createSized(rs, mElement, dimx, RS_ALLOCATION_USAGE_SCRIPT | usages); } -//Script::FieldBase::FieldBase() { -//} - -
diff --git a/cpp/Script.h b/cpp/Script.h deleted file mode 100644 index 235560a..0000000 --- a/cpp/Script.h +++ /dev/null
@@ -1,93 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 __ANDROID_SCRIPT_H__ -#define __ANDROID_SCRIPT_H__ - -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" -#include "Allocation.h" - -namespace android { -namespace renderscriptCpp { - - -class Type; -class Element; -class Allocation; - -class Script : public BaseObj { -private: - -protected: - Script(void *id, RenderScript *rs); - void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out, - const void *v, size_t) const; - void bindAllocation(sp<Allocation> va, uint32_t slot) const; - void setVar(uint32_t index, const void *, size_t len) const; - void setVar(uint32_t index, sp<const BaseObj> o) const; - void invoke(uint32_t slot, const void *v, size_t len) const; - - - void invoke(uint32_t slot) const { - invoke(slot, NULL, 0); - } - void setVar(uint32_t index, float v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, double v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, int32_t v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, int64_t v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, bool v) const { - setVar(index, &v, sizeof(v)); - } - -public: - class FieldBase { - protected: - sp<const Element> mElement; - sp<Allocation> mAllocation; - - void init(RenderScript *rs, uint32_t dimx, uint32_t usages = 0); - - public: - sp<const Element> getElement() { - return mElement; - } - - sp<const Type> getType() { - return mAllocation->getType(); - } - - sp<const Allocation> getAllocation() { - return mAllocation; - } - - //void updateAllocation(); - }; -}; - -} -} -#endif
diff --git a/cpp/ScriptC.cpp b/cpp/ScriptC.cpp index 39b17d4..3a1909d 100644 --- a/cpp/ScriptC.cpp +++ b/cpp/ScriptC.cpp
@@ -14,22 +14,20 @@ * limitations under the License. */ -#define LOG_TAG "libRS_cpp" - #include <utils/Log.h> #include <malloc.h> -#include "ScriptC.h" +#include "RenderScript.h" using namespace android; using namespace renderscriptCpp; -ScriptC::ScriptC(RenderScript *rs, +ScriptC::ScriptC(sp<RS> rs, const void *codeTxt, size_t codeLength, const char *cachedName, size_t cachedNameLength, const char *cacheDir, size_t cacheDirLength) : Script(NULL, rs) { - mID = rsScriptCCreate(rs->mContext, cachedName, cachedNameLength, + mID = rsScriptCCreate(rs->getContext(), cachedName, cachedNameLength, cacheDir, cacheDirLength, (const char *)codeTxt, codeLength); }
diff --git a/cpp/ScriptC.h b/cpp/ScriptC.h deleted file mode 100644 index 8711b8d..0000000 --- a/cpp/ScriptC.h +++ /dev/null
@@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 __ANDROID_SCRIPTC_H__ -#define __ANDROID_SCRIPTC_H__ - -#include <pthread.h> -#include <rs.h> - -#include "Script.h" - -namespace android { -namespace renderscriptCpp { - -class ScriptC : public Script { -protected: - ScriptC(RenderScript *rs, - const void *codeTxt, size_t codeLength, - const char *cachedName, size_t cachedNameLength, - const char *cacheDir, size_t cacheDirLength); - -}; - - -} -} -#endif
diff --git a/cpp/Type.cpp b/cpp/Type.cpp index 23327b0..1b64c30 100644 --- a/cpp/Type.cpp +++ b/cpp/Type.cpp
@@ -21,8 +21,6 @@ #include <string.h> #include "RenderScript.h" -#include "Element.h" -#include "Type.h" using namespace android; using namespace renderscriptCpp; @@ -64,7 +62,7 @@ } -Type::Type(void *id, RenderScript *rs) : BaseObj(id, rs) { +Type::Type(void *id, sp<RS> rs) : BaseObj(id, rs) { mDimX = 0; mDimY = 0; mDimZ = 0; @@ -96,7 +94,7 @@ */ } -Type::Builder::Builder(RenderScript *rs, sp<const Element> e) { +Type::Builder::Builder(sp<RS> rs, sp<const Element> e) { mRS = rs; mElement = e; mDimX = 0; @@ -148,7 +146,7 @@ } } - void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ, + void * id = rsTypeCreate(mRS->getContext(), mElement->getID(), mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces); Type *t = new Type(id, mRS); t->mElement = mElement;
diff --git a/cpp/Type.h b/cpp/Type.h deleted file mode 100644 index 0890c04..0000000 --- a/cpp/Type.h +++ /dev/null
@@ -1,104 +0,0 @@ -/* - * Copyright (C) 2012 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 __ANDROID_TYPE_H__ -#define __ANDROID_TYPE_H__ - -#include <rs.h> -#include "RenderScript.h" -#include "Element.h" - -namespace android { -namespace renderscriptCpp { - -class Type : public BaseObj { -protected: - friend class Allocation; - - uint32_t mDimX; - uint32_t mDimY; - uint32_t mDimZ; - bool mDimMipmaps; - bool mDimFaces; - size_t mElementCount; - sp<const Element> mElement; - - void calcElementCount(); - virtual void updateFromNative(); - -public: - - sp<const Element> getElement() const { - return mElement; - } - - uint32_t getX() const { - return mDimX; - } - - uint32_t getY() const { - return mDimY; - } - - uint32_t getZ() const { - return mDimZ; - } - - bool hasMipmaps() const { - return mDimMipmaps; - } - - bool hasFaces() const { - return mDimFaces; - } - - size_t getCount() const { - return mElementCount; - } - - size_t getSizeBytes() const { - return mElementCount * mElement->getSizeBytes(); - } - - - Type(void *id, RenderScript *rs); - - - class Builder { - protected: - RenderScript *mRS; - uint32_t mDimX; - uint32_t mDimY; - uint32_t mDimZ; - bool mDimMipmaps; - bool mDimFaces; - sp<const Element> mElement; - - public: - Builder(RenderScript *rs, sp<const Element> e); - - void setX(uint32_t value); - void setY(int value); - void setMipmaps(bool value); - void setFaces(bool value); - sp<const Type> create(); - }; - -}; - -} -} -#endif
diff --git a/cpp/rsCppStructs.h b/cpp/rsCppStructs.h new file mode 100644 index 0000000..6d0c89d --- /dev/null +++ b/cpp/rsCppStructs.h
@@ -0,0 +1,529 @@ +/* + * Copyright (C) 2012 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 ANDROID_RSCPPSTRUCTS_H +#define ANDROID_RSCPPSTRUCTS_H + +#include <utils/String8.h> +#include <utils/Vector.h> +#include "utils/RefBase.h" + +#include <rs.h> + +namespace android { +namespace renderscriptCpp { + +typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText); +typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen); + +class RS; +class BaseObj; +class Element; +class Type; +class Allocation; +class Script; +class ScriptC; + +class RS : public android::LightRefBase<RS> { + + public: + RS(); + virtual ~RS(); + + bool init(); + + void setErrorHandler(ErrorHandlerFunc_t func); + ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; } + + void setMessageHandler(MessageHandlerFunc_t func); + MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; } + + void throwError(const char *err) const; + + RsContext getContext() { return mContext; } + + private: + bool init(int targetApi); + static void * threadProc(void *); + + static bool gInitialized; + static pthread_mutex_t gInitMutex; + + pthread_t mMessageThreadId; + pid_t mNativeMessageThreadId; + bool mMessageRun; + + RsDevice mDev; + RsContext mContext; + + ErrorHandlerFunc_t mErrorFunc; + MessageHandlerFunc_t mMessageFunc; + + struct { + Element *U8; + Element *I8; + Element *U16; + Element *I16; + Element *U32; + Element *I32; + Element *U64; + Element *I64; + Element *F32; + Element *F64; + Element *BOOLEAN; + + Element *ELEMENT; + Element *TYPE; + Element *ALLOCATION; + Element *SAMPLER; + Element *SCRIPT; + Element *MESH; + Element *PROGRAM_FRAGMENT; + Element *PROGRAM_VERTEX; + Element *PROGRAM_RASTER; + Element *PROGRAM_STORE; + + Element *A_8; + Element *RGB_565; + Element *RGB_888; + Element *RGBA_5551; + Element *RGBA_4444; + Element *RGBA_8888; + + Element *FLOAT_2; + Element *FLOAT_3; + Element *FLOAT_4; + + Element *DOUBLE_2; + Element *DOUBLE_3; + Element *DOUBLE_4; + + Element *UCHAR_2; + Element *UCHAR_3; + Element *UCHAR_4; + + Element *CHAR_2; + Element *CHAR_3; + Element *CHAR_4; + + Element *USHORT_2; + Element *USHORT_3; + Element *USHORT_4; + + Element *SHORT_2; + Element *SHORT_3; + Element *SHORT_4; + + Element *UINT_2; + Element *UINT_3; + Element *UINT_4; + + Element *INT_2; + Element *INT_3; + Element *INT_4; + + Element *ULONG_2; + Element *ULONG_3; + Element *ULONG_4; + + Element *LONG_2; + Element *LONG_3; + Element *LONG_4; + + Element *MATRIX_4X4; + Element *MATRIX_3X3; + Element *MATRIX_2X2; + } mElements; + +}; + +class BaseObj : public android::LightRefBase<BaseObj> { +protected: + void *mID; + sp<RS> mRS; + String8 mName; + + BaseObj(void *id, sp<RS> rs); + void checkValid(); + + static void * getObjID(sp<const BaseObj> o); + +public: + + void * getID() const; + virtual ~BaseObj(); + virtual void updateFromNative(); + virtual bool equals(const BaseObj *obj); +}; + + +class Allocation : public BaseObj { +protected: + android::sp<const Type> mType; + uint32_t mUsage; + android::sp<Allocation> mAdaptedAllocation; + + bool mConstrainedLOD; + bool mConstrainedFace; + bool mConstrainedY; + bool mConstrainedZ; + bool mReadAllowed; + bool mWriteAllowed; + uint32_t mSelectedY; + uint32_t mSelectedZ; + uint32_t mSelectedLOD; + RsAllocationCubemapFace mSelectedFace; + + uint32_t mCurrentDimX; + uint32_t mCurrentDimY; + uint32_t mCurrentDimZ; + uint32_t mCurrentCount; + + void * getIDSafe() const; + void updateCacheInfo(sp<const Type> t); + + Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage); + + void validateIsInt32(); + void validateIsInt16(); + void validateIsInt8(); + void validateIsFloat32(); + void validateIsObject(); + + virtual void updateFromNative(); + + void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h); + +public: + android::sp<const Type> getType() { + return mType; + } + + void syncAll(RsAllocationUsageType srcLocation); + void ioSendOutput(); + void ioGetInput(); + + void generateMipmaps(); + void copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen); + void copy1DRangeFrom(uint32_t off, size_t count, const int32_t* d, size_t dataLen); + void copy1DRangeFrom(uint32_t off, size_t count, const int16_t* d, size_t dataLen); + void copy1DRangeFrom(uint32_t off, size_t count, const int8_t* d, size_t dataLen); + void copy1DRangeFrom(uint32_t off, size_t count, const float* d, size_t dataLen); + void copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff); + + void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, + const int32_t *data, size_t dataLen); + void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, + const int16_t *data, size_t dataLen); + void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, + const int8_t *data, size_t dataLen); + void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, + const float *data, size_t dataLen); + void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, + const Allocation *data, size_t dataLen, + uint32_t dataXoff, uint32_t dataYoff); + + void resize(int dimX); + void resize(int dimX, int dimY); + + static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type, + RsAllocationMipmapControl mips, uint32_t usage); + static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type, + RsAllocationMipmapControl mips, uint32_t usage, void * pointer); + + static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type, + uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); + static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count, + uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); + +}; + +class Element : public BaseObj { +public: + bool isComplex(); + size_t getSubElementCount() { + return mVisibleElementMap.size(); + } + + sp<const Element> getSubElement(uint32_t index); + const char * getSubElementName(uint32_t index); + size_t getSubElementArraySize(uint32_t index); + uint32_t getSubElementOffsetBytes(uint32_t index); + RsDataType getDataType() const { + return mType; + } + + RsDataKind getDataKind() const { + return mKind; + } + + size_t getSizeBytes() const { + return mSizeBytes; + } + + static sp<const Element> BOOLEAN(sp<RS> rs); + static sp<const Element> U8(sp<RS> rs); + static sp<const Element> I8(sp<RS> rs); + static sp<const Element> U16(sp<RS> rs); + static sp<const Element> I16(sp<RS> rs); + static sp<const Element> U32(sp<RS> rs); + static sp<const Element> I32(sp<RS> rs); + static sp<const Element> U64(sp<RS> rs); + static sp<const Element> I64(sp<RS> rs); + static sp<const Element> F32(sp<RS> rs); + static sp<const Element> F64(sp<RS> rs); + static sp<const Element> ELEMENT(sp<RS> rs); + static sp<const Element> TYPE(sp<RS> rs); + static sp<const Element> ALLOCATION(sp<RS> rs); + static sp<const Element> SAMPLER(sp<RS> rs); + static sp<const Element> SCRIPT(sp<RS> rs); + static sp<const Element> MESH(sp<RS> rs); + static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs); + static sp<const Element> PROGRAM_VERTEX(sp<RS> rs); + static sp<const Element> PROGRAM_RASTER(sp<RS> rs); + static sp<const Element> PROGRAM_STORE(sp<RS> rs); + + static sp<const Element> A_8(sp<RS> rs); + static sp<const Element> RGB_565(sp<RS> rs); + static sp<const Element> RGB_888(sp<RS> rs); + static sp<const Element> RGBA_5551(sp<RS> rs); + static sp<const Element> RGBA_4444(sp<RS> rs); + static sp<const Element> RGBA_8888(sp<RS> rs); + + static sp<const Element> F32_2(sp<RS> rs); + static sp<const Element> F32_3(sp<RS> rs); + static sp<const Element> F32_4(sp<RS> rs); + static sp<const Element> F64_2(sp<RS> rs); + static sp<const Element> F64_3(sp<RS> rs); + static sp<const Element> F64_4(sp<RS> rs); + static sp<const Element> U8_2(sp<RS> rs); + static sp<const Element> U8_3(sp<RS> rs); + static sp<const Element> U8_4(sp<RS> rs); + static sp<const Element> I8_2(sp<RS> rs); + static sp<const Element> I8_3(sp<RS> rs); + static sp<const Element> I8_4(sp<RS> rs); + static sp<const Element> U16_2(sp<RS> rs); + static sp<const Element> U16_3(sp<RS> rs); + static sp<const Element> U16_4(sp<RS> rs); + static sp<const Element> I16_2(sp<RS> rs); + static sp<const Element> I16_3(sp<RS> rs); + static sp<const Element> I16_4(sp<RS> rs); + static sp<const Element> U32_2(sp<RS> rs); + static sp<const Element> U32_3(sp<RS> rs); + static sp<const Element> U32_4(sp<RS> rs); + static sp<const Element> I32_2(sp<RS> rs); + static sp<const Element> I32_3(sp<RS> rs); + static sp<const Element> I32_4(sp<RS> rs); + static sp<const Element> U64_2(sp<RS> rs); + static sp<const Element> U64_3(sp<RS> rs); + static sp<const Element> U64_4(sp<RS> rs); + static sp<const Element> I64_2(sp<RS> rs); + static sp<const Element> I64_3(sp<RS> rs); + static sp<const Element> I64_4(sp<RS> rs); + static sp<const Element> MATRIX_4X4(sp<RS> rs); + static sp<const Element> MATRIX_3X3(sp<RS> rs); + static sp<const Element> MATRIX_2X2(sp<RS> rs); + + Element(void *id, sp<RS> rs, + android::Vector<sp<Element> > &elements, + android::Vector<android::String8> &elementNames, + android::Vector<uint32_t> &arraySizes); + Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size); + Element(sp<RS> rs); + virtual ~Element(); + + void updateFromNative(); + static sp<const Element> createUser(sp<RS> rs, RsDataType dt); + static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size); + static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk); + bool isCompatible(sp<const Element>e); + + class Builder { + private: + sp<RS> mRS; + android::Vector<sp<Element> > mElements; + android::Vector<android::String8> mElementNames; + android::Vector<uint32_t> mArraySizes; + bool mSkipPadding; + + public: + Builder(sp<RS> rs); + ~Builder(); + void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1); + sp<const Element> create(); + }; + +private: + void updateVisibleSubElements(); + + android::Vector<sp</*const*/ Element> > mElements; + android::Vector<android::String8> mElementNames; + android::Vector<uint32_t> mArraySizes; + android::Vector<uint32_t> mVisibleElementMap; + android::Vector<uint32_t> mOffsetInBytes; + + RsDataType mType; + RsDataKind mKind; + bool mNormalized; + size_t mSizeBytes; + size_t mVectorSize; +}; + +class Type : public BaseObj { +protected: + friend class Allocation; + + uint32_t mDimX; + uint32_t mDimY; + uint32_t mDimZ; + bool mDimMipmaps; + bool mDimFaces; + size_t mElementCount; + sp<const Element> mElement; + + void calcElementCount(); + virtual void updateFromNative(); + +public: + + sp<const Element> getElement() const { + return mElement; + } + + uint32_t getX() const { + return mDimX; + } + + uint32_t getY() const { + return mDimY; + } + + uint32_t getZ() const { + return mDimZ; + } + + bool hasMipmaps() const { + return mDimMipmaps; + } + + bool hasFaces() const { + return mDimFaces; + } + + size_t getCount() const { + return mElementCount; + } + + size_t getSizeBytes() const { + return mElementCount * mElement->getSizeBytes(); + } + + Type(void *id, sp<RS> rs); + + + class Builder { + protected: + sp<RS> mRS; + uint32_t mDimX; + uint32_t mDimY; + uint32_t mDimZ; + bool mDimMipmaps; + bool mDimFaces; + sp<const Element> mElement; + + public: + Builder(sp<RS> rs, sp<const Element> e); + + void setX(uint32_t value); + void setY(int value); + void setMipmaps(bool value); + void setFaces(bool value); + sp<const Type> create(); + }; + +}; + +class Script : public BaseObj { +private: + +protected: + Script(void *id, sp<RS> rs); + void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out, + const void *v, size_t) const; + void bindAllocation(sp<Allocation> va, uint32_t slot) const; + void setVar(uint32_t index, const void *, size_t len) const; + void setVar(uint32_t index, sp<const BaseObj> o) const; + void invoke(uint32_t slot, const void *v, size_t len) const; + + + void invoke(uint32_t slot) const { + invoke(slot, NULL, 0); + } + void setVar(uint32_t index, float v) const { + setVar(index, &v, sizeof(v)); + } + void setVar(uint32_t index, double v) const { + setVar(index, &v, sizeof(v)); + } + void setVar(uint32_t index, int32_t v) const { + setVar(index, &v, sizeof(v)); + } + void setVar(uint32_t index, int64_t v) const { + setVar(index, &v, sizeof(v)); + } + void setVar(uint32_t index, bool v) const { + setVar(index, &v, sizeof(v)); + } + +public: + class FieldBase { + protected: + sp<const Element> mElement; + sp<Allocation> mAllocation; + + void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0); + + public: + sp<const Element> getElement() { + return mElement; + } + + sp<const Type> getType() { + return mAllocation->getType(); + } + + sp<const Allocation> getAllocation() { + return mAllocation; + } + + //void updateAllocation(); + }; +}; + +class ScriptC : public Script { +protected: + ScriptC(sp<RS> rs, + const void *codeTxt, size_t codeLength, + const char *cachedName, size_t cachedNameLength, + const char *cacheDir, size_t cacheDirLength); + +}; + + +} +} + +#endif
diff --git a/rsScriptC.cpp b/rsScriptC.cpp index b291045..18e4af2 100644 --- a/rsScriptC.cpp +++ b/rsScriptC.cpp
@@ -250,8 +250,14 @@ bitcodeLen = BT->getTranslatedBitcodeSize(); #endif + if (!cacheDir) { + // MUST BE FIXED BEFORE ANYTHING USING C++ API IS RELEASED + cacheDir = getenv("EXTERNAL_STORAGE"); + ALOGV("Cache dir changed to %s", cacheDir); + } + // ensure that cache dir exists - if (!createCacheDir(cacheDir)) { + if (cacheDir && !createCacheDir(cacheDir)) { return false; }