summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Sakhartchouk <alexst@google.com> 2011-12-15 09:56:10 -0800
committer Alex Sakhartchouk <alexst@google.com> 2011-12-15 09:56:28 -0800
commitd24b1bb040da73f98556c9d4ec3a5c07b91cc412 (patch)
tree4bcbd8617a08ad10b68d642a6ae09620ad7ef091
parentb98f6d3466f15a250e4f2851bbae16c66b014cf1 (diff)
Element HAL sturct, script side getters
Change-Id: If98dd4c22bce58dca2c9739c8aee935a2dd0b493
-rw-r--r--libs/rs/rsElement.cpp26
-rw-r--r--libs/rs/rsElement.h21
-rw-r--r--libs/rs/rsMesh.h18
-rw-r--r--libs/rs/scriptc/rs_allocation.rsh24
-rw-r--r--libs/rs/scriptc/rs_types.rsh9
5 files changed, 89 insertions, 9 deletions
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 56c31b66405d..8b60701769ce 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -47,6 +47,12 @@ void Element::clear() {
mFields = NULL;
mFieldCount = 0;
mHasReference = false;
+
+ delete [] mHal.state.fields;
+ delete [] mHal.state.fieldArraySizes;
+ delete [] mHal.state.fieldNames;
+ delete [] mHal.state.fieldNameLengths;
+ delete [] mHal.state.fieldOffsetBytes;
}
size_t Element::getSizeBits() const {
@@ -157,13 +163,26 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) {
}
void Element::compute() {
+ mHal.state.dataType = mComponent.getType();
+ mHal.state.dataKind = mComponent.getKind();
+ mHal.state.vectorSize = mComponent.getVectorSize();
+
if (mFieldCount == 0) {
mBits = mComponent.getBits();
mBitsUnpadded = mComponent.getBitsUnpadded();
mHasReference = mComponent.isReference();
+
+ mHal.state.elementSizeBytes = getSizeBytes();
return;
}
+ mHal.state.fields = new const Element*[mFieldCount];
+ mHal.state.fieldArraySizes = new uint32_t[mFieldCount];
+ mHal.state.fieldNames = new const char*[mFieldCount];
+ mHal.state.fieldNameLengths = new uint32_t[mFieldCount];
+ mHal.state.fieldOffsetBytes = new uint32_t[mFieldCount];
+ mHal.state.fieldsCount = mFieldCount;
+
size_t bits = 0;
size_t bitsUnpadded = 0;
for (size_t ct=0; ct < mFieldCount; ct++) {
@@ -175,8 +194,15 @@ void Element::compute() {
if (mFields[ct].e->mHasReference) {
mHasReference = true;
}
+
+ 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.fieldOffsetBytes[ct] = mFields[ct].offsetBits >> 3;
}
+ mHal.state.elementSizeBytes = getSizeBytes();
}
ObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
diff --git a/libs/rs/rsElement.h b/libs/rs/rsElement.h
index 04010faafac8..010c6122ad71 100644
--- a/libs/rs/rsElement.h
+++ b/libs/rs/rsElement.h
@@ -28,6 +28,27 @@ namespace renderscript {
// An element is a group of Components that occupies one cell in a structure.
class Element : public ObjectBase {
public:
+ struct Hal {
+ mutable void *drv;
+
+ struct State {
+ RsDataType dataType;
+ RsDataKind dataKind;
+ uint32_t vectorSize;
+ uint32_t elementSizeBytes;
+
+ // Subelements
+ const Element **fields;
+ uint32_t *fieldArraySizes;
+ const char **fieldNames;
+ uint32_t *fieldNameLengths;
+ uint32_t *fieldOffsetBytes;
+ uint32_t fieldsCount;
+ };
+ State state;
+ };
+ Hal mHal;
+
class Builder {
public:
Builder();
diff --git a/libs/rs/rsMesh.h b/libs/rs/rsMesh.h
index 0fc73fba5c95..84a57ca50f7a 100644
--- a/libs/rs/rsMesh.h
+++ b/libs/rs/rsMesh.h
@@ -28,15 +28,6 @@ namespace renderscript {
// An element is a group of Components that occupies one cell in a structure.
class Mesh : public ObjectBase {
public:
- Mesh(Context *);
- Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
- ~Mesh();
-
- virtual void serialize(OStream *stream) const;
- virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
- static Mesh *createFromStream(Context *rsc, IStream *stream);
- void init();
-
struct Hal {
mutable void *drv;
@@ -57,6 +48,15 @@ public:
};
Hal mHal;
+ Mesh(Context *);
+ Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
+ ~Mesh();
+
+ virtual void serialize(OStream *stream) const;
+ virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
+ static Mesh *createFromStream(Context *rsc, IStream *stream);
+ void init();
+
void setVertexBuffer(Allocation *vb, uint32_t index) {
mVertexBuffers[index].set(vb);
mHal.state.vertexBuffers[index] = vb;
diff --git a/libs/rs/scriptc/rs_allocation.rsh b/libs/rs/scriptc/rs_allocation.rsh
index 1cb3a99a7f89..4d62bfb4dfba 100644
--- a/libs/rs/scriptc/rs_allocation.rsh
+++ b/libs/rs/scriptc/rs_allocation.rsh
@@ -168,5 +168,29 @@ extern const void * __attribute__((overloadable))
extern const void * __attribute__((overloadable))
rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z);
+extern const rs_element __attribute__((overloadable))
+ rsAllocationGetElement(rs_allocation);
+
+extern const uint32_t __attribute__((overloadable))
+ rsMeshGetVertexAllocationCount(rs_mesh);
+
+extern const uint32_t __attribute__((overloadable))
+ rsMeshGetPrimitiveCount(rs_mesh);
+
+extern const uint32_t __attribute__((overloadable))
+ rsMeshGetVertexAllocationCount(rs_mesh);
+
+extern const rs_allocation __attribute__((overloadable))
+ rsMeshGetVertexAllocation(rs_mesh, uint32_t index);
+
+extern const uint32_t __attribute__((overloadable))
+ rsMeshGetPrimitiveCount(rs_mesh);
+
+extern const rs_allocation __attribute__((overloadable))
+ rsMeshGetIndexAllocation(rs_mesh, uint32_t index);
+
+extern const rs_primitive __attribute__((overloadable))
+ rsMeshGetPrimitive(rs_mesh, uint32_t index);
+
#endif
diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh
index a01807e2a15b..5c468bfa31df 100644
--- a/libs/rs/scriptc/rs_types.rsh
+++ b/libs/rs/scriptc/rs_types.rsh
@@ -400,6 +400,15 @@ typedef enum {
RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010
} rs_allocation_usage_type;
+typedef enum {
+ RS_PRIMITIVE_POINT,
+ RS_PRIMITIVE_LINE,
+ RS_PRIMITIVE_LINE_STRIP,
+ RS_PRIMITIVE_TRIANGLE,
+ RS_PRIMITIVE_TRIANGLE_STRIP,
+ RS_PRIMITIVE_TRIANGLE_FAN
+} rs_primitive;
+
#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
#endif