Move to smart pointers for refcounting RS contexts
Change-Id: I0dc6adc4e02c7427a4234c549d3555a501fe5f90
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);