Add matrix component types.
Fix potental overflow in script -> java messages. Change-Id: Ie6fd9dc376be4043fc938a1517106936937689c8
This commit is contained in:
@@ -54,16 +54,20 @@ public class Element extends BaseObj {
|
||||
UNSIGNED_5_5_5_1 (14, 2),
|
||||
UNSIGNED_4_4_4_4 (15, 2),
|
||||
|
||||
RS_ELEMENT (16, 4),
|
||||
RS_TYPE (17, 4),
|
||||
RS_ALLOCATION (18, 4),
|
||||
RS_SAMPLER (19, 4),
|
||||
RS_SCRIPT (20, 4),
|
||||
RS_MESH (21, 4),
|
||||
RS_PROGRAM_FRAGMENT (22, 4),
|
||||
RS_PROGRAM_VERTEX (23, 4),
|
||||
RS_PROGRAM_RASTER (24, 4),
|
||||
RS_PROGRAM_STORE (25, 4);
|
||||
MATRIX_4X4 (16, 64),
|
||||
MATRIX_3X3 (17, 36),
|
||||
MATRIX_2X2 (18, 16),
|
||||
|
||||
RS_ELEMENT (1000, 4),
|
||||
RS_TYPE (1001, 4),
|
||||
RS_ALLOCATION (1002, 4),
|
||||
RS_SAMPLER (1003, 4),
|
||||
RS_SCRIPT (1004, 4),
|
||||
RS_MESH (1005, 4),
|
||||
RS_PROGRAM_FRAGMENT (1006, 4),
|
||||
RS_PROGRAM_VERTEX (1007, 4),
|
||||
RS_PROGRAM_RASTER (1008, 4),
|
||||
RS_PROGRAM_STORE (1009, 4);
|
||||
|
||||
int mID;
|
||||
int mSize;
|
||||
@@ -285,6 +289,29 @@ public class Element extends BaseObj {
|
||||
return rs.mElement_UCHAR_4;
|
||||
}
|
||||
|
||||
public static Element MATRIX_4X4(RenderScript rs) {
|
||||
if(rs.mElement_MATRIX_4X4 == null) {
|
||||
rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
|
||||
}
|
||||
return rs.mElement_MATRIX_4X4;
|
||||
}
|
||||
public static Element MATRIX4X4(RenderScript rs) {
|
||||
return MATRIX_4X4(rs);
|
||||
}
|
||||
|
||||
public static Element MATRIX_3X3(RenderScript rs) {
|
||||
if(rs.mElement_MATRIX_3X3 == null) {
|
||||
rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
|
||||
}
|
||||
return rs.mElement_MATRIX_4X4;
|
||||
}
|
||||
|
||||
public static Element MATRIX_2X2(RenderScript rs) {
|
||||
if(rs.mElement_MATRIX_2X2 == null) {
|
||||
rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
|
||||
}
|
||||
return rs.mElement_MATRIX_2X2;
|
||||
}
|
||||
|
||||
Element(int id, RenderScript rs, Element[] e, String[] n) {
|
||||
super(id, rs);
|
||||
|
||||
@@ -248,6 +248,24 @@ public class FieldPacker {
|
||||
addU32(v.w);
|
||||
}
|
||||
|
||||
public void addObj(Matrix4f v) {
|
||||
for (int i=0; i < v.mMat.length; i++) {
|
||||
addF32(v.mMat[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void addObj(Matrix3f v) {
|
||||
for (int i=0; i < v.mMat.length; i++) {
|
||||
addF32(v.mMat[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void addObj(Matrix2f v) {
|
||||
for (int i=0; i < v.mMat.length; i++) {
|
||||
addF32(v.mMat[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void addBoolean(boolean v) {
|
||||
addI8((byte)(v ? 1 : 0));
|
||||
}
|
||||
|
||||
@@ -542,6 +542,10 @@ public class RenderScript {
|
||||
Element mElement_FLOAT_4;
|
||||
Element mElement_UCHAR_4;
|
||||
|
||||
Element mElement_MATRIX_4X4;
|
||||
Element mElement_MATRIX_3X3;
|
||||
Element mElement_MATRIX_2X2;
|
||||
|
||||
Sampler mSampler_CLAMP_NEAREST;
|
||||
Sampler mSampler_CLAMP_LINEAR;
|
||||
Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
|
||||
@@ -614,15 +618,22 @@ public class RenderScript {
|
||||
int[] rbuf = new int[16];
|
||||
mRS.nContextInitToClient(mRS.mContext);
|
||||
while(mRun) {
|
||||
rbuf[0] = 0;
|
||||
int msg = mRS.nContextGetMessage(mRS.mContext, rbuf, true);
|
||||
if (msg == 0) {
|
||||
// Should only happen during teardown.
|
||||
// But we want to avoid starving other threads during
|
||||
// teardown by yielding until the next line in the destructor
|
||||
// can execute to set mRun = false
|
||||
try {
|
||||
sleep(1, 0);
|
||||
} catch(InterruptedException e) {
|
||||
// Can happen for two reasons
|
||||
if (rbuf[0] > 0) {
|
||||
// 1: Buffer needs to be enlarged.
|
||||
rbuf = new int[rbuf[0] + 2];
|
||||
} else {
|
||||
// 2: teardown.
|
||||
// But we want to avoid starving other threads during
|
||||
// teardown by yielding until the next line in the destructor
|
||||
// can execute to set mRun = false
|
||||
try {
|
||||
sleep(1, 0);
|
||||
} catch(InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if(mRS.mMessageCallback != null) {
|
||||
|
||||
@@ -228,7 +228,8 @@ nContextGetMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data, j
|
||||
size_t receiveLen;
|
||||
int id = rsContextGetMessage(con, ptr, &receiveLen, len * 4, wait);
|
||||
if (!id && receiveLen) {
|
||||
LOGE("message receive buffer too small. %i", receiveLen);
|
||||
LOGV("message receive buffer too small. %i", receiveLen);
|
||||
*ptr = (jint)receiveLen;
|
||||
}
|
||||
_env->ReleaseIntArrayElements(data, ptr, 0);
|
||||
return id;
|
||||
|
||||
@@ -91,7 +91,11 @@ enum RsDataType {
|
||||
RS_TYPE_UNSIGNED_5_5_5_1,
|
||||
RS_TYPE_UNSIGNED_4_4_4_4,
|
||||
|
||||
RS_TYPE_ELEMENT,
|
||||
RS_TYPE_MATRIX_4X4,
|
||||
RS_TYPE_MATRIX_3X3,
|
||||
RS_TYPE_MATRIX_2X2,
|
||||
|
||||
RS_TYPE_ELEMENT = 1000,
|
||||
RS_TYPE_TYPE,
|
||||
RS_TYPE_ALLOCATION,
|
||||
RS_TYPE_SAMPLER,
|
||||
@@ -100,7 +104,7 @@ enum RsDataType {
|
||||
RS_TYPE_PROGRAM_FRAGMENT,
|
||||
RS_TYPE_PROGRAM_VERTEX,
|
||||
RS_TYPE_PROGRAM_RASTER,
|
||||
RS_TYPE_PROGRAM_STORE
|
||||
RS_TYPE_PROGRAM_STORE,
|
||||
};
|
||||
|
||||
enum RsDataKind {
|
||||
|
||||
@@ -82,15 +82,8 @@ public class SgTransform {
|
||||
|
||||
void setData() {
|
||||
|
||||
mTransformData.globalMat_Row0 = new Float4(1, 0, 0, 0);
|
||||
mTransformData.globalMat_Row1 = new Float4(0, 1, 0, 0);
|
||||
mTransformData.globalMat_Row2 = new Float4(0, 0, 1, 0);
|
||||
mTransformData.globalMat_Row3 = new Float4(0, 0, 0, 1);
|
||||
|
||||
mTransformData.localMat_Row0 = new Float4(1, 0, 0, 0);
|
||||
mTransformData.localMat_Row1 = new Float4(0, 1, 0, 0);
|
||||
mTransformData.localMat_Row2 = new Float4(0, 0, 1, 0);
|
||||
mTransformData.localMat_Row3 = new Float4(0, 0, 0, 1);
|
||||
mTransformData.globalMat = new Matrix4f();
|
||||
mTransformData.localMat = new Matrix4f();
|
||||
|
||||
mTransformData.transforms0 = mTransforms[0];
|
||||
mTransformData.transforms1 = mTransforms[1];
|
||||
|
||||
@@ -76,10 +76,10 @@ int root(int launchID) {
|
||||
rsgBindProgramStore(gPFSBackground);
|
||||
rsgBindTexture(gPFBackground, 0, gTGrid);
|
||||
|
||||
rsgProgramVertexLoadModelMatrix((rs_matrix4x4 *)&robot1Ptr->globalMat_Row0);
|
||||
rsgProgramVertexLoadModelMatrix(&robot1Ptr->globalMat);
|
||||
rsgDrawMesh(gTestMesh);
|
||||
|
||||
rsgProgramVertexLoadModelMatrix((rs_matrix4x4 *)&robot2Ptr->globalMat_Row0);
|
||||
rsgProgramVertexLoadModelMatrix(&robot2Ptr->globalMat);
|
||||
rsgDrawMesh(gTestMesh);
|
||||
|
||||
color(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
|
||||
@@ -52,8 +52,8 @@ void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32
|
||||
//rsDebug("Transform data", (int)data);
|
||||
//rsDebug("Entering parent", (int)parent);
|
||||
|
||||
rs_matrix4x4 *localMat = (rs_matrix4x4*)&data->localMat_Row0;
|
||||
rs_matrix4x4 *globalMat = (rs_matrix4x4*)&data->globalMat_Row0;
|
||||
rs_matrix4x4 *localMat = &data->localMat;
|
||||
rs_matrix4x4 *globalMat = &data->globalMat;
|
||||
|
||||
ParentData toChild;
|
||||
toChild.changed = 0;
|
||||
|
||||
@@ -22,15 +22,8 @@
|
||||
#define TRANSFORM_SCALE 3
|
||||
|
||||
typedef struct {
|
||||
float4 globalMat_Row0;
|
||||
float4 globalMat_Row1;
|
||||
float4 globalMat_Row2;
|
||||
float4 globalMat_Row3;
|
||||
|
||||
float4 localMat_Row0;
|
||||
float4 localMat_Row1;
|
||||
float4 localMat_Row2;
|
||||
float4 localMat_Row3;
|
||||
rs_matrix4x4 globalMat;
|
||||
rs_matrix4x4 localMat;
|
||||
|
||||
float4 transforms0;
|
||||
float4 transforms1;
|
||||
|
||||
@@ -95,6 +95,26 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize)
|
||||
mNormalized = true;
|
||||
rsAssert(mKind == RS_KIND_PIXEL_RGBA);
|
||||
return;
|
||||
|
||||
case RS_TYPE_MATRIX_4X4:
|
||||
mTypeBits = 16 * 32;
|
||||
rsAssert(mVectorSize == 1);
|
||||
rsAssert(mNormalized == false);
|
||||
rsAssert(mKind == RS_KIND_USER);
|
||||
break;
|
||||
case RS_TYPE_MATRIX_3X3:
|
||||
mTypeBits = 9 * 32;
|
||||
rsAssert(mVectorSize == 1);
|
||||
rsAssert(mNormalized == false);
|
||||
rsAssert(mKind == RS_KIND_USER);
|
||||
break;
|
||||
case RS_TYPE_MATRIX_2X2:
|
||||
mTypeBits = 4 * 32;
|
||||
rsAssert(mVectorSize == 1);
|
||||
rsAssert(mNormalized == false);
|
||||
rsAssert(mKind == RS_KIND_USER);
|
||||
break;
|
||||
|
||||
case RS_TYPE_ELEMENT:
|
||||
case RS_TYPE_TYPE:
|
||||
case RS_TYPE_ALLOCATION:
|
||||
@@ -218,10 +238,19 @@ String8 Component::getGLSLType() const
|
||||
case 4: return String8("vec4");
|
||||
}
|
||||
}
|
||||
if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) {
|
||||
return String8("mat4");
|
||||
}
|
||||
if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) {
|
||||
return String8("mat3");
|
||||
}
|
||||
if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) {
|
||||
return String8("mat2");
|
||||
}
|
||||
return String8();
|
||||
}
|
||||
|
||||
static const char * gTypeStrings[] = {
|
||||
static const char * gTypeBasicStrings[] = {
|
||||
"NONE",
|
||||
"F16",
|
||||
"F32",
|
||||
@@ -238,6 +267,12 @@ static const char * gTypeStrings[] = {
|
||||
"UP_565",
|
||||
"UP_5551",
|
||||
"UP_4444",
|
||||
"MATRIX_4X4",
|
||||
"MATRIX_3X3",
|
||||
"MATRIX_2X2",
|
||||
};
|
||||
|
||||
static const char * gTypeObjStrings[] = {
|
||||
"ELEMENT",
|
||||
"TYPE",
|
||||
"ALLOCATION",
|
||||
@@ -267,8 +302,13 @@ static const char * gKindStrings[] = {
|
||||
|
||||
void Component::dumpLOGV(const char *prefix) const
|
||||
{
|
||||
LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
|
||||
prefix, gTypeStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
|
||||
if (mType >= RS_TYPE_ELEMENT) {
|
||||
LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
|
||||
prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
|
||||
} else {
|
||||
LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
|
||||
prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
|
||||
}
|
||||
}
|
||||
|
||||
void Component::serialize(OStream *stream) const
|
||||
|
||||
@@ -713,10 +713,10 @@ void Context::removeName(ObjectBase *obj)
|
||||
uint32_t Context::getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait)
|
||||
{
|
||||
//LOGE("getMessageToClient %i %i", bufferLen, wait);
|
||||
*receiveLen = 0;
|
||||
if (!wait) {
|
||||
if (mIO.mToClient.isEmpty()) {
|
||||
// No message to get and not going to wait for one.
|
||||
receiveLen = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user