Merge "Move rs.h functions over to extern "C"."
diff --git a/driver/rsdGL.cpp b/driver/rsdGL.cpp
index 0a23a44..c421ade 100644
--- a/driver/rsdGL.cpp
+++ b/driver/rsdGL.cpp
@@ -43,7 +43,6 @@
#include "rsdFrameBufferObj.h"
#include <gui/Surface.h>
-#include <gui/DummyConsumer.h>
using namespace android;
using namespace android::renderscript;
@@ -326,18 +325,13 @@
}
gGLContextCount++;
- // Create a BufferQueue with a fake consumer
- sp<BufferQueue> bq = new BufferQueue();
- bq->consumerConnect(new DummyConsumer());
- sp<Surface> stc(new Surface(static_cast<sp<IGraphicBufferProducer> >(bq)));
-
- dc->gl.egl.surfaceDefault = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
- static_cast<ANativeWindow*>(stc.get()),
- NULL);
-
- checkEglError("eglCreateWindowSurface");
+ EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE };
+ rsc->setWatchdogGL("eglCreatePbufferSurface", __LINE__, __FILE__);
+ dc->gl.egl.surfaceDefault = eglCreatePbufferSurface(dc->gl.egl.display, dc->gl.egl.config,
+ pbuffer_attribs);
+ checkEglError("eglCreatePbufferSurface");
if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
- ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
+ ALOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
rsdGLShutdown(rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
return false;
diff --git a/driver/runtime/rs_core.c b/driver/runtime/rs_core.c
index 54fcccb..da51a9a 100644
--- a/driver/runtime/rs_core.c
+++ b/driver/runtime/rs_core.c
@@ -7,44 +7,6 @@
/* Implementation of Core Runtime */
-/*
-extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
-{
- uchar4 c;
- c.x = (uchar)(r * 255.f + 0.5f);
- c.y = (uchar)(g * 255.f + 0.5f);
- c.z = (uchar)(b * 255.f + 0.5f);
- c.w = 255;
- return c;
-}
-
-extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
-{
- uchar4 c;
- c.x = (uchar)(r * 255.f + 0.5f);
- c.y = (uchar)(g * 255.f + 0.5f);
- c.z = (uchar)(b * 255.f + 0.5f);
- c.w = (uchar)(a * 255.f + 0.5f);
- return c;
-}
-
-extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
-{
- color *= 255.f;
- color += 0.5f;
- uchar4 c = {color.x, color.y, color.z, 255};
- return c;
-}
-
-extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
-{
- color *= 255.f;
- color += 0.5f;
- uchar4 c = {color.x, color.y, color.z, color.w};
- return c;
-}
-*/
-
extern float4 rsUnpackColor8888(uchar4 c)
{
return convert_float4(c) * 0.003921569f;
diff --git a/java/tests/ImageProcessing/src/com/android/rs/image/convolve3x3.fs b/java/tests/ImageProcessing/src/com/android/rs/image/convolve3x3.fs
index 177e86e..4f8b4d8 100644
--- a/java/tests/ImageProcessing/src/com/android/rs/image/convolve3x3.fs
+++ b/java/tests/ImageProcessing/src/com/android/rs/image/convolve3x3.fs
@@ -28,6 +28,8 @@
uint32_t y1 = min((int32_t)y+1, gHeight-1);
uint32_t y2 = max((int32_t)y-1, 0);
+ float4 result;
+
float4 p00 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y1));
float4 p01 = convert_float4(rsGetElementAt_uchar4(gIn, x, y1));
float4 p02 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y1));
@@ -37,29 +39,19 @@
float4 p20 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y2));
float4 p21 = convert_float4(rsGetElementAt_uchar4(gIn, x, y2));
float4 p22 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y2));
- p00 *= gCoeffs[0];
- p01 *= gCoeffs[1];
- p02 *= gCoeffs[2];
- p10 *= gCoeffs[3];
- p11 *= gCoeffs[4];
- p12 *= gCoeffs[5];
- p20 *= gCoeffs[6];
- p21 *= gCoeffs[7];
- p22 *= gCoeffs[8];
- p00 += p01;
- p02 += p10;
- p11 += p12;
- p20 += p21;
+ result = p00 * gCoeffs[0];
+ result += p01 * gCoeffs[1];
+ result += p02 * gCoeffs[2];
+ result += p10 * gCoeffs[3];
+ result += p11 * gCoeffs[4];
+ result += p12 * gCoeffs[5];
+ result += p20 * gCoeffs[6];
+ result += p21 * gCoeffs[7];
+ result += p22 * gCoeffs[8];
- p22 += p00;
- p02 += p11;
-
- p20 += p22;
- p20 += p02;
-
- p20 = clamp(p20, 0.f, 255.f);
- return convert_uchar4(p20);
+ result = clamp(result, 0.f, 255.f);
+ return convert_uchar4(result);
}
diff --git a/rsAllocation.cpp b/rsAllocation.cpp
index 3a81e91..c861d09 100644
--- a/rsAllocation.cpp
+++ b/rsAllocation.cpp
@@ -236,13 +236,14 @@
void Allocation::dumpLOGV(const char *prefix) const {
ObjectBase::dumpLOGV(prefix);
+ char buf[1024];
- String8 s(prefix);
- s.append(" type ");
- if (mHal.state.type) {
- mHal.state.type->dumpLOGV(s.string());
+ if ((strlen(prefix) + 10) < sizeof(buf)) {
+ sprintf(buf, "%s type ", prefix);
+ if (mHal.state.type) {
+ mHal.state.type->dumpLOGV(buf);
+ }
}
-
ALOGV("%s allocation ptr=%p mUsageFlags=0x04%x, mMipmapControl=0x%04x",
prefix, mHal.drvState.lod[0].mallocPtr, mHal.state.usageFlags, mHal.state.mipmapControl);
}
@@ -327,9 +328,7 @@
void Allocation::serialize(Context *rsc, OStream *stream) const {
// Need to identify ourselves
stream->addU32((uint32_t)getClassId());
-
- String8 name(getName());
- stream->addString(&name);
+ stream->addString(getName());
// First thing we need to serialize is the type object since it will be needed
// to initialize the class
@@ -358,8 +357,7 @@
return NULL;
}
- String8 name;
- stream->loadString(&name);
+ const char *name = stream->loadString();
Type *type = Type::createFromStream(rsc, stream);
if (!type) {
@@ -382,8 +380,7 @@
return NULL;
}
- alloc->setName(name.string(), name.size());
-
+ alloc->assignName(name);
if (dataSize == type->getSizeBytes()) {
uint32_t count = dataSize / type->getElementSizeBytes();
// Read in all of our allocation data
diff --git a/rsElement.cpp b/rsElement.cpp
index 793b968..a81df48 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -44,7 +44,12 @@
}
void Element::clear() {
- delete [] mFields;
+ if (mFields) {
+ for (size_t i = 0; i < mFieldCount; i++) {
+ delete[] mFields[i].name;
+ }
+ delete [] mFields;
+ }
mFields = NULL;
mFieldCount = 0;
mHasReference = false;
@@ -87,7 +92,7 @@
for (uint32_t ct = 0; ct < mFieldCount; ct++) {
ALOGV("%s Element field index: %u ------------------", prefix, ct);
ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
- prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize);
+ prefix, mFields[ct].name, mFields[ct].offsetBits, mFields[ct].arraySize);
mFields[ct].e->dumpLOGV(prefix);
}
}
@@ -95,16 +100,14 @@
void Element::serialize(Context *rsc, OStream *stream) const {
// Need to identify ourselves
stream->addU32((uint32_t)getClassId());
-
- String8 name(getName());
- stream->addString(&name);
+ stream->addString(getName());
mComponent.serialize(stream);
// Now serialize all the fields
stream->addU32(mFieldCount);
for (uint32_t ct = 0; ct < mFieldCount; ct++) {
- stream->addString(&mFields[ct].name);
+ stream->addString(mFields[ct].name);
stream->addU32(mFields[ct].arraySize);
mFields[ct].e->serialize(rsc, stream);
}
@@ -118,8 +121,7 @@
return NULL;
}
- String8 name;
- stream->loadString(&name);
+ const char *name = stream->loadString();
Component component;
component.loadFromStream(stream);
@@ -138,13 +140,9 @@
size_t *subElemNamesLengths = new size_t[fieldCount];
uint32_t *arraySizes = new uint32_t[fieldCount];
- String8 elemName;
for (uint32_t ct = 0; ct < fieldCount; ct ++) {
- stream->loadString(&elemName);
- subElemNamesLengths[ct] = elemName.length();
- char *tmpName = new char[subElemNamesLengths[ct]];
- memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]);
- subElemNames[ct] = tmpName;
+ subElemNames[ct] = stream->loadString();
+ subElemNamesLengths[ct] = strlen(subElemNames[ct]);
arraySizes[ct] = stream->loadU32();
subElems[ct] = Element::createFromStream(rsc, stream);
}
@@ -155,6 +153,7 @@
delete [] subElemNames[ct];
subElems[ct]->decUserRef();
}
+ delete[] name;
delete[] subElems;
delete[] subElemNames;
delete[] subElemNamesLengths;
@@ -179,7 +178,7 @@
uint32_t noPaddingFieldCount = 0;
for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
- if (mFields[ct].name.string()[0] != '#') {
+ if (mFields[ct].name[0] != '#') {
noPaddingFieldCount ++;
}
}
@@ -203,14 +202,14 @@
mHasReference = true;
}
- if (mFields[ct].name.string()[0] == '#') {
+ if (mFields[ct].name[0] == '#') {
continue;
}
mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
- mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string();
- mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0
+ mHal.state.fieldNames[ctNoPadding] = mFields[ct].name;
+ mHal.state.fieldNameLengths[ctNoPadding] = strlen(mFields[ct].name) + 1; // to include 0
mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
ctNoPadding ++;
@@ -274,8 +273,8 @@
}
if ((ee->mFields[i].e.get() != ein[i]) ||
- (ee->mFields[i].name.length() != len) ||
- (ee->mFields[i].name != nin[i]) ||
+ (strlen(ee->mFields[i].name) != len) ||
+ strcmp(ee->mFields[i].name, nin[i]) ||
(ee->mFields[i].arraySize != asize)) {
match = false;
break;
@@ -307,7 +306,7 @@
}
e->mFields[ct].e.set(ein[ct]);
- e->mFields[ct].name.setTo(nin[ct], len);
+ e->mFields[ct].name = rsuCopyString(nin[ct], len);
e->mFields[ct].arraySize = asize;
}
e->compute();
diff --git a/rsElement.h b/rsElement.h
index 32cfda1..b97dfe5 100644
--- a/rsElement.h
+++ b/rsElement.h
@@ -83,7 +83,7 @@
uint32_t getFieldCount() const {return mFieldCount;}
const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
- const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
+ const char * getFieldName(uint32_t idx) const {return mFields[idx].name;}
uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;}
const Component & getComponent() const {return mComponent;}
@@ -137,7 +137,7 @@
void clear();
typedef struct {
- String8 name;
+ const char *name;
ObjectBaseRef<const Element> e;
uint32_t offsetBits;
uint32_t offsetBitsUnpadded;
diff --git a/rsFileA3D.cpp b/rsFileA3D.cpp
index c79d008..3b963fe 100644
--- a/rsFileA3D.cpp
+++ b/rsFileA3D.cpp
@@ -73,7 +73,8 @@
uint32_t numIndexEntries = headerStream->loadU32();
for (uint32_t i = 0; i < numIndexEntries; i ++) {
A3DIndexEntry *entry = new A3DIndexEntry();
- headerStream->loadString(&entry->mObjectName);
+ entry->mObjectName = headerStream->loadString();
+
//ALOGV("Header data, entry name = %s", entry->mObjectName.string());
entry->mType = (RsA3DClassID)headerStream->loadU32();
if (mUse64BitOffsets){
@@ -214,6 +215,10 @@
return mIndex.size();
}
+FileA3D::A3DIndexEntry::~A3DIndexEntry() {
+ delete[] mObjectName;
+}
+
const FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const {
if (index < mIndex.size()) {
return mIndex[index];
@@ -320,7 +325,7 @@
uint32_t writeIndexSize = mWriteIndex.size();
headerStream.addU32(writeIndexSize);
for (uint32_t i = 0; i < writeIndexSize; i ++) {
- headerStream.addString(&mWriteIndex[i]->mObjectName);
+ headerStream.addString(mWriteIndex[i]->mObjectName);
headerStream.addU32((uint32_t)mWriteIndex[i]->mType);
if (mUse64BitOffsets){
headerStream.addOffset(mWriteIndex[i]->mOffset);
@@ -334,8 +339,7 @@
}
// Write our magic string so we know we are reading the right file
- String8 magicString(A3D_MAGIC_KEY);
- fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle);
+ fwrite(A3D_MAGIC_KEY, sizeof(char), strlen(A3D_MAGIC_KEY), writeHandle);
// Store the size of the header to make it easier to parse when we read it
uint64_t headerSize = headerStream.getPos();
@@ -369,7 +373,7 @@
mWriteStream = new OStream(initialStreamSize, false);
}
A3DIndexEntry *indexEntry = new A3DIndexEntry();
- indexEntry->mObjectName.setTo(obj->getName());
+ indexEntry->mObjectName = rsuCopyString(obj->getName());
indexEntry->mType = obj->getClassId();
indexEntry->mOffset = mWriteStream->getPos();
indexEntry->mRsObj = obj;
@@ -420,7 +424,7 @@
for (uint32_t i = 0; i < numFileEntries; i ++) {
const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i);
fileEntries[i].classID = entry->getType();
- fileEntries[i].objectName = entry->getObjectName().string();
+ fileEntries[i].objectName = rsuCopyString(entry->getObjectName());
}
}
diff --git a/rsFileA3D.h b/rsFileA3D.h
index 06b90d7..8bf36b9 100644
--- a/rsFileA3D.h
+++ b/rsFileA3D.h
@@ -19,7 +19,6 @@
#include "rsMesh.h"
-#include <utils/String8.h>
#include "rsStream.h"
#include <stdio.h>
@@ -43,19 +42,21 @@
bool mUse64BitOffsets;
class A3DIndexEntry {
- String8 mObjectName;
+ const char *mObjectName;
RsA3DClassID mType;
uint64_t mOffset;
uint64_t mLength;
ObjectBase *mRsObj;
public:
friend class FileA3D;
- const String8 &getObjectName() const {
+ const char *getObjectName() const {
return mObjectName;
}
RsA3DClassID getType() const {
return mType;
}
+
+ ~A3DIndexEntry();
};
bool load(FILE *f);
diff --git a/rsFont.cpp b/rsFont.cpp
index a483359..d302182 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -58,7 +58,7 @@
return false;
}
- mFontName = name;
+ mFontName = rsuCopyString(name);
mFontSize = fontSize;
mDpi = dpi;
@@ -492,13 +492,13 @@
#endif //ANDROID_RS_SERIALIZE
void FontState::initRenderState() {
- String8 shaderString("varying vec2 varTex0;\n");
- shaderString.append("void main() {\n");
- shaderString.append(" lowp vec4 col = UNI_Color;\n");
- shaderString.append(" col.a = texture2D(UNI_Tex0, varTex0.xy).a;\n");
- shaderString.append(" col.a = pow(col.a, UNI_Gamma);\n");
- shaderString.append(" gl_FragColor = col;\n");
- shaderString.append("}\n");
+ const char *shaderString = "varying vec2 varTex0;\n"
+ "void main() {\n"
+ " lowp vec4 col = UNI_Color;\n"
+ " col.a = texture2D(UNI_Tex0, varTex0.xy).a;\n"
+ " col.a = pow(col.a, UNI_Gamma);\n"
+ " gl_FragColor = col;\n"
+ "}\n";
const char *textureNames[] = { "Tex0" };
const size_t textureNamesLengths[] = { 4 };
@@ -524,7 +524,7 @@
mFontShaderFConstant.set(Allocation::createAllocation(mRSC, inputType.get(),
RS_ALLOCATION_USAGE_SCRIPT |
RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS));
- ProgramFragment *pf = new ProgramFragment(mRSC, shaderString.string(), shaderString.length(),
+ ProgramFragment *pf = new ProgramFragment(mRSC, shaderString, strlen(shaderString),
textureNames, numTextures, textureNamesLengths,
tmp, 4);
mFontShaderF.set(pf);
@@ -757,11 +757,12 @@
Font *currentFont = mRSC->getFont();
if (!currentFont) {
if (!mDefault.get()) {
- String8 fontsDir("/fonts/Roboto-Regular.ttf");
- String8 fullPath(getenv("ANDROID_ROOT"));
- fullPath += fontsDir;
-
- mDefault.set(Font::create(mRSC, fullPath.string(), 8, mRSC->getDPI()));
+ char fullPath[1024];
+ const char * root = getenv("ANDROID_ROOT");
+ rsAssert(strlen(root) < 256);
+ strcpy(fullPath, root);
+ strcat(fullPath, "/fonts/Roboto-Regular.ttf");
+ mDefault.set(Font::create(mRSC, fullPath, 8, mRSC->getDPI()));
}
currentFont = mDefault.get();
}
diff --git a/rsFont.h b/rsFont.h
index f7ad3cd..7bac508 100644
--- a/rsFont.h
+++ b/rsFont.h
@@ -18,7 +18,6 @@
#define ANDROID_RS_FONT_H
#include "rsStream.h"
-#include <utils/String8.h>
#include <utils/Vector.h>
#include <utils/KeyedVector.h>
@@ -113,7 +112,7 @@
int32_t mBitmapTop;
};
- String8 mFontName;
+ const char *mFontName;
float mFontSize;
uint32_t mDpi;
diff --git a/rsMesh.cpp b/rsMesh.cpp
index 651a8f3..8decfc5 100644
--- a/rsMesh.cpp
+++ b/rsMesh.cpp
@@ -81,9 +81,7 @@
void Mesh::serialize(Context *rsc, OStream *stream) const {
// Need to identify ourselves
stream->addU32((uint32_t)getClassId());
-
- String8 name(getName());
- stream->addString(&name);
+ stream->addString(getName());
// Store number of vertex streams
stream->addU32(mHal.state.vertexBuffersCount);
@@ -113,8 +111,7 @@
return NULL;
}
- String8 name;
- stream->loadString(&name);
+ const char *name = stream->loadString();
uint32_t vertexBuffersCount = stream->loadU32();
ObjectBaseRef<Allocation> *vertexBuffers = NULL;
@@ -148,7 +145,7 @@
}
Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount);
- mesh->setName(name.string(), name.size());
+ mesh->assignName(name);
for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) {
mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount);
}
diff --git a/rsObjectBase.h b/rsObjectBase.h
index 12c89a3..85f8fd8 100644
--- a/rsObjectBase.h
+++ b/rsObjectBase.h
@@ -44,6 +44,7 @@
const char * getName() const {
return mName;
}
+ void assignName(const char *s) {mName = s;}
void setName(const char *);
void setName(const char *, uint32_t len);
diff --git a/rsStream.cpp b/rsStream.cpp
index b9df0cc..a9587c1 100644
--- a/rsStream.cpp
+++ b/rsStream.cpp
@@ -43,10 +43,11 @@
return loadU32();
}
-void IStream::loadString(String8 *s) {
+const char * IStream::loadString() {
uint32_t len = loadU32();
- s->setTo((const char *)&mData[mPos], len);
+ const char *s = rsuCopyString((const char *)&mData[mPos], len);
mPos += len;
+ return s;
}
// Output stream implementation
@@ -89,19 +90,20 @@
}
}
-void OStream::addString(String8 *s) {
- uint32_t len = s->size();
+void OStream::addString(const char *s, size_t len) {
addU32(len);
if (mPos + len*sizeof(char) >= mLength) {
growSize();
}
char *stringData = reinterpret_cast<char *>(&mData[mPos]);
- for (uint32_t i = 0; i < len; i ++) {
- stringData[i] = s->string()[i];
- }
+ memcpy(stringData, s, len);
mPos += len*sizeof(char);
}
+void OStream::addString(const char *s) {
+ addString(s, strlen(s));
+}
+
void OStream::growSize() {
uint8_t *newData = (uint8_t*)malloc(mLength*2);
memcpy(newData, mData, mLength*sizeof(uint8_t));
diff --git a/rsStream.h b/rsStream.h
index 8a192e6..d0ed62e 100644
--- a/rsStream.h
+++ b/rsStream.h
@@ -59,7 +59,7 @@
}
void loadByteArray(void *dest, size_t numBytes);
uint64_t loadOffset();
- void loadString(String8 *s);
+ const char * loadString();
uint64_t getPos() const {
return mPos;
}
@@ -132,7 +132,8 @@
}
void addByteArray(const void *src, size_t numBytes);
void addOffset(uint64_t v);
- void addString(String8 *s);
+ void addString(const char *name);
+ void addString(const char *name, size_t len);
uint64_t getPos() const {
return mPos;
}
diff --git a/rsType.cpp b/rsType.cpp
index da55ad1..15e2550 100644
--- a/rsType.cpp
+++ b/rsType.cpp
@@ -188,9 +188,7 @@
void Type::serialize(Context *rsc, OStream *stream) const {
// Need to identify ourselves
stream->addU32((uint32_t)getClassId());
-
- String8 name(getName());
- stream->addString(&name);
+ stream->addString(getName());
mElement->serialize(rsc, stream);
@@ -210,8 +208,7 @@
return NULL;
}
- String8 name;
- stream->loadString(&name);
+ const char *name = stream->loadString();
Element *elem = Element::createFromStream(rsc, stream);
if (!elem) {
@@ -225,6 +222,8 @@
uint8_t faces = stream->loadU8();
Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0, 0);
elem->decUserRef();
+
+ delete [] name;
return type;
}