Merge change 22163 into eclair

* changes:
  Point Sprites
This commit is contained in:
Android (Google) Code Review
2009-08-20 16:53:25 -07:00
14 changed files with 77 additions and 83 deletions

View File

@@ -111,7 +111,8 @@ public class Element extends BaseObj {
NX (15), NX (15),
NY (16), NY (16),
NZ (17), NZ (17),
INDEX (18); INDEX (18),
POINT_SIZE(19);
int mID; int mID;
DataKind(int id) { DataKind(int id) {
@@ -241,13 +242,18 @@ public class Element extends BaseObj {
add(DataType.FLOAT, DataKind.Z, false, 32, null); add(DataType.FLOAT, DataKind.Z, false, 32, null);
return this; return this;
} }
public Builder addFloatST() { public Builder addFloatST() {
add(DataType.FLOAT, DataKind.S, false, 32, null); add(DataType.FLOAT, DataKind.S, false, 32, null);
add(DataType.FLOAT, DataKind.T, false, 32, null); add(DataType.FLOAT, DataKind.T, false, 32, null);
return this; return this;
} }
public Builder addFloatPointSize() {
add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, null);
return this;
}
public Builder addFloatRGB() { public Builder addFloatRGB() {
add(DataType.FLOAT, DataKind.RED, false, 32, null); add(DataType.FLOAT, DataKind.RED, false, 32, null);
add(DataType.FLOAT, DataKind.GREEN, false, 32, null); add(DataType.FLOAT, DataKind.GREEN, false, 32, null);

View File

@@ -68,6 +68,7 @@ public class ProgramFragment extends BaseObj {
RenderScript mRS; RenderScript mRS;
Element mIn; Element mIn;
Element mOut; Element mOut;
boolean mPointSpriteEnable;
private class Slot { private class Slot {
Type mType; Type mType;
@@ -85,6 +86,7 @@ public class ProgramFragment extends BaseObj {
mIn = in; mIn = in;
mOut = out; mOut = out;
mSlots = new Slot[MAX_SLOT]; mSlots = new Slot[MAX_SLOT];
mPointSpriteEnable = false;
for(int ct=0; ct < MAX_SLOT; ct++) { for(int ct=0; ct < MAX_SLOT; ct++) {
mSlots[ct] = new Slot(); mSlots[ct] = new Slot();
} }
@@ -117,6 +119,9 @@ public class ProgramFragment extends BaseObj {
mSlots[slot].mEnv = env; mSlots[slot].mEnv = env;
} }
public void setPointSpriteTexCoordinateReplacement(boolean enable) {
mPointSpriteEnable = enable;
}
static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) { static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) {
int inID = 0; int inID = 0;
@@ -127,21 +132,18 @@ public class ProgramFragment extends BaseObj {
if (b.mOut != null) { if (b.mOut != null) {
outID = b.mOut.mID; outID = b.mOut.mID;
} }
rs.nProgramFragmentBegin(inID, outID); rs.nProgramFragmentBegin(inID, outID, b.mPointSpriteEnable);
for(int ct=0; ct < MAX_SLOT; ct++) { for(int ct=0; ct < MAX_SLOT; ct++) {
if(b.mSlots[ct].mTexEnable) { if(b.mSlots[ct].mTexEnable) {
Slot s = b.mSlots[ct]; Slot s = b.mSlots[ct];
int typeID = 0;
if(s.mType != null) { if(s.mType != null) {
rs.nProgramFragmentSetType(ct, s.mType.mID); typeID = s.mType.mID;
}
rs.nProgramFragmentSetTexEnable(ct, true);
if(s.mEnv != null) {
rs.nProgramFragmentSetEnvMode(ct, s.mEnv.mID);
} }
rs.nProgramFragmentSetSlot(ct, true, s.mEnv.mID, typeID);
} }
} }
int id = rs.nProgramFragmentCreate(); int id = rs.nProgramFragmentCreate();
return new ProgramFragment(id, rs); return new ProgramFragment(id, rs);
} }

View File

@@ -158,12 +158,10 @@ public class RenderScript {
native void nProgramFragmentStoreDither(boolean enable); native void nProgramFragmentStoreDither(boolean enable);
native int nProgramFragmentStoreCreate(); native int nProgramFragmentStoreCreate();
native void nProgramFragmentBegin(int in, int out); native void nProgramFragmentBegin(int in, int out, boolean pointSpriteEnable);
native void nProgramFragmentBindTexture(int vpf, int slot, int a); native void nProgramFragmentBindTexture(int vpf, int slot, int a);
native void nProgramFragmentBindSampler(int vpf, int slot, int s); native void nProgramFragmentBindSampler(int vpf, int slot, int s);
native void nProgramFragmentSetType(int slot, int vt); native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
native void nProgramFragmentSetEnvMode(int slot, int env);
native void nProgramFragmentSetTexEnable(int slot, boolean enable);
native int nProgramFragmentCreate(); native int nProgramFragmentCreate();
native void nProgramVertexBindAllocation(int pv, int mID); native void nProgramVertexBindAllocation(int pv, int mID);

View File

@@ -952,11 +952,11 @@ nProgramFragmentStoreCreate(JNIEnv *_env, jobject _this)
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
static void static void
nProgramFragmentBegin(JNIEnv *_env, jobject _this, jint in, jint out) nProgramFragmentBegin(JNIEnv *_env, jobject _this, jint in, jint out, jboolean pointSpriteEnable)
{ {
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out); LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p) PointSprite(%i)", con, (RsElement)in, (RsElement)out, pointSpriteEnable);
rsProgramFragmentBegin(con, (RsElement)in, (RsElement)out); rsProgramFragmentBegin(con, (RsElement)in, (RsElement)out, pointSpriteEnable);
} }
static void static void
@@ -976,27 +976,11 @@ nProgramFragmentBindSampler(JNIEnv *_env, jobject _this, jint vpf, jint slot, ji
} }
static void static void
nProgramFragmentSetType(JNIEnv *_env, jobject _this, jint slot, jint vt) nProgramFragmentSetSlot(JNIEnv *_env, jobject _this, jint slot, jboolean enable, jint env, jint vt)
{ {
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
LOG_API("nProgramFragmentSetType, con(%p), slot(%i), vt(%p)", con, slot, (RsType)vt); LOG_API("nProgramFragmentSetType, con(%p), slot(%i), enable(%i), env(%i), vt(%p)", con, slot, enable, env, (RsType)vt);
rsProgramFragmentSetType(con, slot, (RsType)vt); rsProgramFragmentSetSlot(con, slot, enable, (RsTexEnvMode)env, (RsType)vt);
}
static void
nProgramFragmentSetEnvMode(JNIEnv *_env, jobject _this, jint slot, jint env)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
LOG_API("nProgramFragmentSetEnvMode, con(%p), slot(%i), vt(%i)", con, slot, env);
rsProgramFragmentSetEnvMode(con, slot, (RsTexEnvMode)env);
}
static void
nProgramFragmentSetTexEnable(JNIEnv *_env, jobject _this, jint slot, jboolean enable)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
LOG_API("nProgramFragmentSetTexEnable, con(%p), slot(%i), enable(%i)", con, slot, enable);
rsProgramFragmentSetTexEnable(con, slot, enable);
} }
static jint static jint
@@ -1305,12 +1289,10 @@ static JNINativeMethod methods[] = {
{"nProgramFragmentStoreDither", "(Z)V", (void*)nProgramFragmentStoreDither }, {"nProgramFragmentStoreDither", "(Z)V", (void*)nProgramFragmentStoreDither },
{"nProgramFragmentStoreCreate", "()I", (void*)nProgramFragmentStoreCreate }, {"nProgramFragmentStoreCreate", "()I", (void*)nProgramFragmentStoreCreate },
{"nProgramFragmentBegin", "(II)V", (void*)nProgramFragmentBegin }, {"nProgramFragmentBegin", "(IIZ)V", (void*)nProgramFragmentBegin },
{"nProgramFragmentBindTexture", "(III)V", (void*)nProgramFragmentBindTexture }, {"nProgramFragmentBindTexture", "(III)V", (void*)nProgramFragmentBindTexture },
{"nProgramFragmentBindSampler", "(III)V", (void*)nProgramFragmentBindSampler }, {"nProgramFragmentBindSampler", "(III)V", (void*)nProgramFragmentBindSampler },
{"nProgramFragmentSetType", "(II)V", (void*)nProgramFragmentSetType }, {"nProgramFragmentSetSlot", "(IZII)V", (void*)nProgramFragmentSetSlot },
{"nProgramFragmentSetEnvMode", "(II)V", (void*)nProgramFragmentSetEnvMode },
{"nProgramFragmentSetTexEnable", "(IZ)V", (void*)nProgramFragmentSetTexEnable },
{"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate }, {"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate },
{"nProgramVertexBindAllocation", "(II)V", (void*)nProgramVertexBindAllocation }, {"nProgramVertexBindAllocation", "(II)V", (void*)nProgramVertexBindAllocation },

View File

@@ -80,7 +80,8 @@ enum RsDataKind {
RS_KIND_NX, RS_KIND_NX,
RS_KIND_NY, RS_KIND_NY,
RS_KIND_NZ, RS_KIND_NZ,
RS_KIND_INDEX RS_KIND_INDEX,
RS_KIND_POINT_SIZE
}; };
enum RsElementPredefined { enum RsElementPredefined {

View File

@@ -361,6 +361,7 @@ ProgramFragmentStoreCreate {
ProgramFragmentBegin { ProgramFragmentBegin {
param RsElement in param RsElement in
param RsElement out param RsElement out
param bool pointSpriteEnable
} }
ProgramFragmentBindTexture { ProgramFragmentBindTexture {
@@ -375,19 +376,11 @@ ProgramFragmentBindSampler {
param RsSampler s param RsSampler s
} }
ProgramFragmentSetType { ProgramFragmentSetSlot {
param uint32_t slot
param RsType t
}
ProgramFragmentSetEnvMode {
param uint32_t slot
param RsTexEnvMode env
}
ProgramFragmentSetTexEnable {
param uint32_t slot param uint32_t slot
param bool enable param bool enable
param RsTexEnvMode env
param RsType t
} }
ProgramFragmentCreate { ProgramFragmentCreate {

View File

@@ -24,7 +24,7 @@ using namespace android::renderscript;
Component::Component() Component::Component()
{ {
mType = FLOAT; mType = FLOAT;
mKind = NONE; mKind = USER;
mIsNormalized = false; mIsNormalized = false;
mBits = 0; mBits = 0;
} }

View File

@@ -34,13 +34,13 @@ public:
}; };
enum DataKind { enum DataKind {
NONE, USER,
RED, GREEN, BLUE, ALPHA, LUMINANCE, INTENSITY, RED, GREEN, BLUE, ALPHA, LUMINANCE, INTENSITY,
X, Y, Z, W, X, Y, Z, W,
S, T, Q, R, S, T, Q, R,
NX, NY, NZ, NX, NY, NZ,
INDEX, INDEX,
USER POINT_SIZE
}; };

View File

@@ -24,7 +24,7 @@ using namespace android;
using namespace android::renderscript; using namespace android::renderscript;
ProgramFragment::ProgramFragment(Element *in, Element *out) : ProgramFragment::ProgramFragment(Element *in, Element *out, bool pointSpriteEnable) :
Program(in, out) Program(in, out)
{ {
for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
@@ -32,6 +32,7 @@ ProgramFragment::ProgramFragment(Element *in, Element *out) :
mTextureDimensions[ct] = 2; mTextureDimensions[ct] = 2;
} }
mTextureEnableMask = 0; mTextureEnableMask = 0;
mPointSpriteEnable = pointSpriteEnable;
mEnvModes[1] = RS_TEX_ENV_MODE_DECAL; mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
} }
@@ -54,6 +55,7 @@ void ProgramFragment::setupGL(ProgramFragmentState *state)
} }
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
//glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
switch(mEnvModes[ct]) { switch(mEnvModes[ct]) {
@@ -94,7 +96,6 @@ void ProgramFragment::setupGL(ProgramFragmentState *state)
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
} }
} }
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
mDirty = false; mDirty = false;
} }
@@ -178,7 +179,7 @@ ProgramFragmentState::~ProgramFragmentState()
void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h) void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
{ {
ProgramFragment *pf = new ProgramFragment(NULL, NULL); ProgramFragment *pf = new ProgramFragment(NULL, NULL, false);
mDefault.set(pf); mDefault.set(pf);
} }
@@ -186,10 +187,10 @@ void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
namespace android { namespace android {
namespace renderscript { namespace renderscript {
void rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out) void rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out, bool pointSpriteEnable)
{ {
delete rsc->mStateFragment.mPF; delete rsc->mStateFragment.mPF;
rsc->mStateFragment.mPF = new ProgramFragment((Element *)in, (Element *)out); rsc->mStateFragment.mPF = new ProgramFragment((Element *)in, (Element *)out, pointSpriteEnable);
} }
void rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a) void rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a)
@@ -204,27 +205,20 @@ void rsi_ProgramFragmentBindSampler(Context *rsc, RsProgramFragment vpf, uint32_
pf->bindSampler(slot, static_cast<Sampler *>(s)); pf->bindSampler(slot, static_cast<Sampler *>(s));
} }
void rsi_ProgramFragmentSetType(Context *rsc, uint32_t slot, RsType vt) void rsi_ProgramFragmentSetSlot(Context *rsc, uint32_t slot, bool enable, RsTexEnvMode env, RsType vt)
{ {
const Type *t = static_cast<const Type *>(vt); const Type *t = static_cast<const Type *>(vt);
uint32_t dim = 1; if (t) {
if (t->getDimY()) { uint32_t dim = 1;
dim ++; if (t->getDimY()) {
if (t->getDimZ()) {
dim ++; dim ++;
if (t->getDimZ()) {
dim ++;
}
} }
rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim);
} }
rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim);
}
void rsi_ProgramFragmentSetEnvMode(Context *rsc, uint32_t slot, RsTexEnvMode env)
{
rsc->mStateFragment.mPF->setEnvMode(slot, env); rsc->mStateFragment.mPF->setEnvMode(slot, env);
}
void rsi_ProgramFragmentSetTexEnable(Context *rsc, uint32_t slot, bool enable)
{
rsc->mStateFragment.mPF->setTexEnable(slot, enable); rsc->mStateFragment.mPF->setTexEnable(slot, enable);
} }

View File

@@ -32,7 +32,7 @@ public:
ProgramFragment(Element *in, Element *out); ProgramFragment(Element *in, Element *out, bool pointSpriteEnable);
virtual ~ProgramFragment(); virtual ~ProgramFragment();
virtual void setupGL(ProgramFragmentState *); virtual void setupGL(ProgramFragmentState *);
@@ -64,6 +64,7 @@ protected:
// Hacks to create a program for now // Hacks to create a program for now
RsTexEnvMode mEnvModes[MAX_TEXTURE]; RsTexEnvMode mEnvModes[MAX_TEXTURE];
uint32_t mTextureEnableMask; uint32_t mTextureEnableMask;
bool mPointSpriteEnable;
}; };
class ProgramFragmentState class ProgramFragmentState

View File

@@ -143,6 +143,7 @@ RsSampler rsi_SamplerCreate(Context *rsc)
ss->mWrapS, ss->mWrapS,
ss->mWrapT, ss->mWrapT,
ss->mWrapR); ss->mWrapR);
s->incRef();
return s; return s;
} }

View File

@@ -199,6 +199,7 @@ RsTriangleMesh rsi_TriangleMeshCreate(Context *rsc)
memcpy(tm->mIndexData, tmc->mIndexData.array(), tm->mIndexDataSize); memcpy(tm->mIndexData, tmc->mIndexData.array(), tm->mIndexDataSize);
tm->analyzeElement(); tm->analyzeElement();
tm->incRef();
return tm; return tm;
} }
@@ -248,16 +249,16 @@ void rsi_TriangleMeshRenderRange(Context *rsc, RsTriangleMesh vtm, uint32_t firs
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(tm->mSizeCoord, glVertexPointer(tm->mSizeCoord,
GL_FLOAT, GL_FLOAT,
tm->mVertexElement->getSizeBytes(), tm->mVertexElement->getSizeBytes(),
(void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetCoord)); (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetCoord));
if (tm->mSizeTex) { if (tm->mSizeTex) {
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(tm->mSizeTex, glTexCoordPointer(tm->mSizeTex,
GL_FLOAT, GL_FLOAT,
tm->mVertexElement->getSizeBytes(), tm->mVertexElement->getSizeBytes(),
(void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetTex)); (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetTex));
} else { } else {
glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -265,8 +266,8 @@ void rsi_TriangleMeshRenderRange(Context *rsc, RsTriangleMesh vtm, uint32_t firs
if (tm->mSizeNorm) { if (tm->mSizeNorm) {
glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, glNormalPointer(GL_FLOAT,
tm->mVertexElement->getSizeBytes(), tm->mVertexElement->getSizeBytes(),
(void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetNorm)); (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetNorm));
} else { } else {
glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);

View File

@@ -230,6 +230,13 @@ void Type::makeGLComponents()
mGL.mTex[texNum].size = 4; mGL.mTex[texNum].size = 4;
break; break;
case Component::POINT_SIZE:
rsAssert(!mGL.mPointSize.size);
mGL.mPointSize.size = 1;
mGL.mPointSize.offset = mElement->getComponentOffsetBytes(ct);
mGL.mPointSize.type = c->getGLType();
break;
default: default:
break; break;
} }
@@ -280,6 +287,13 @@ void Type::enableGLVertexBuffer() const
} }
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);
if (mGL.mPointSize.size) {
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(mGL.mPointSize.type,
stride,
(void *)mGL.mPointSize.offset);
}
} }

View File

@@ -118,6 +118,7 @@ protected:
VertexComponent_t mNorm; VertexComponent_t mNorm;
VertexComponent_t mColor; VertexComponent_t mColor;
VertexComponent_t mTex[RS_MAX_TEXTURE]; VertexComponent_t mTex[RS_MAX_TEXTURE];
VertexComponent_t mPointSize;
}; };
GLState_t mGL; GLState_t mGL;
void makeGLComponents(); void makeGLComponents();