diff options
author | Jason Sams <rjsams@android.com> | 2009-08-20 16:10:36 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2009-08-20 16:11:03 -0700 |
commit | 25ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9fae (patch) | |
tree | 37bac4daba3c96307217faea840754cdbd9d5cba | |
parent | ac81c42971ddcd0726c4f2050fd82942914d0e1c (diff) | |
download | frameworks_base-25ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9fae.zip frameworks_base-25ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9fae.tar.gz frameworks_base-25ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9fae.tar.bz2 |
Point Sprites
-rw-r--r-- | graphics/java/android/renderscript/Element.java | 10 | ||||
-rw-r--r-- | graphics/java/android/renderscript/ProgramFragment.java | 16 | ||||
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 6 | ||||
-rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 34 | ||||
-rw-r--r-- | libs/rs/RenderScript.h | 3 | ||||
-rw-r--r-- | libs/rs/rs.spec | 15 | ||||
-rw-r--r-- | libs/rs/rsComponent.cpp | 2 | ||||
-rw-r--r-- | libs/rs/rsComponent.h | 4 | ||||
-rw-r--r-- | libs/rs/rsProgramFragment.cpp | 34 | ||||
-rw-r--r-- | libs/rs/rsProgramFragment.h | 3 | ||||
-rw-r--r-- | libs/rs/rsSampler.cpp | 1 | ||||
-rw-r--r-- | libs/rs/rsTriangleMesh.cpp | 17 | ||||
-rw-r--r-- | libs/rs/rsType.cpp | 14 | ||||
-rw-r--r-- | libs/rs/rsType.h | 1 |
14 files changed, 77 insertions, 83 deletions
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java index 3f75069..aeec739 100644 --- a/graphics/java/android/renderscript/Element.java +++ b/graphics/java/android/renderscript/Element.java @@ -111,7 +111,8 @@ public class Element extends BaseObj { NX (15), NY (16), NZ (17), - INDEX (18); + INDEX (18), + POINT_SIZE(19); int mID; DataKind(int id) { @@ -241,13 +242,18 @@ public class Element extends BaseObj { add(DataType.FLOAT, DataKind.Z, false, 32, null); return this; } - + public Builder addFloatST() { add(DataType.FLOAT, DataKind.S, false, 32, null); add(DataType.FLOAT, DataKind.T, false, 32, null); return this; } + public Builder addFloatPointSize() { + add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, null); + return this; + } + public Builder addFloatRGB() { add(DataType.FLOAT, DataKind.RED, false, 32, null); add(DataType.FLOAT, DataKind.GREEN, false, 32, null); diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java index aad09f6..392d93d 100644 --- a/graphics/java/android/renderscript/ProgramFragment.java +++ b/graphics/java/android/renderscript/ProgramFragment.java @@ -68,6 +68,7 @@ public class ProgramFragment extends BaseObj { RenderScript mRS; Element mIn; Element mOut; + boolean mPointSpriteEnable; private class Slot { Type mType; @@ -85,6 +86,7 @@ public class ProgramFragment extends BaseObj { mIn = in; mOut = out; mSlots = new Slot[MAX_SLOT]; + mPointSpriteEnable = false; for(int ct=0; ct < MAX_SLOT; ct++) { mSlots[ct] = new Slot(); } @@ -117,6 +119,9 @@ public class ProgramFragment extends BaseObj { mSlots[slot].mEnv = env; } + public void setPointSpriteTexCoordinateReplacement(boolean enable) { + mPointSpriteEnable = enable; + } static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) { int inID = 0; @@ -127,21 +132,18 @@ public class ProgramFragment extends BaseObj { if (b.mOut != null) { outID = b.mOut.mID; } - rs.nProgramFragmentBegin(inID, outID); + rs.nProgramFragmentBegin(inID, outID, b.mPointSpriteEnable); for(int ct=0; ct < MAX_SLOT; ct++) { if(b.mSlots[ct].mTexEnable) { Slot s = b.mSlots[ct]; + int typeID = 0; if(s.mType != null) { - rs.nProgramFragmentSetType(ct, s.mType.mID); - } - rs.nProgramFragmentSetTexEnable(ct, true); - if(s.mEnv != null) { - rs.nProgramFragmentSetEnvMode(ct, s.mEnv.mID); + typeID = s.mType.mID; } + rs.nProgramFragmentSetSlot(ct, true, s.mEnv.mID, typeID); } } - int id = rs.nProgramFragmentCreate(); return new ProgramFragment(id, rs); } diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index fca1c7a..076a5d4 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -158,12 +158,10 @@ public class RenderScript { native void nProgramFragmentStoreDither(boolean enable); 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 nProgramFragmentBindSampler(int vpf, int slot, int s); - native void nProgramFragmentSetType(int slot, int vt); - native void nProgramFragmentSetEnvMode(int slot, int env); - native void nProgramFragmentSetTexEnable(int slot, boolean enable); + native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt); native int nProgramFragmentCreate(); native void nProgramVertexBindAllocation(int pv, int mID); diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index 001ecd0..fede0e5 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -952,11 +952,11 @@ nProgramFragmentStoreCreate(JNIEnv *_env, jobject _this) // --------------------------------------------------------------------------- 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)); - LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out); - rsProgramFragmentBegin(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, pointSpriteEnable); } static void @@ -976,27 +976,11 @@ nProgramFragmentBindSampler(JNIEnv *_env, jobject _this, jint vpf, jint slot, ji } 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)); - LOG_API("nProgramFragmentSetType, con(%p), slot(%i), vt(%p)", con, slot, (RsType)vt); - rsProgramFragmentSetType(con, slot, (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); + LOG_API("nProgramFragmentSetType, con(%p), slot(%i), enable(%i), env(%i), vt(%p)", con, slot, enable, env, (RsType)vt); + rsProgramFragmentSetSlot(con, slot, enable, (RsTexEnvMode)env, (RsType)vt); } static jint @@ -1305,12 +1289,10 @@ static JNINativeMethod methods[] = { {"nProgramFragmentStoreDither", "(Z)V", (void*)nProgramFragmentStoreDither }, {"nProgramFragmentStoreCreate", "()I", (void*)nProgramFragmentStoreCreate }, -{"nProgramFragmentBegin", "(II)V", (void*)nProgramFragmentBegin }, +{"nProgramFragmentBegin", "(IIZ)V", (void*)nProgramFragmentBegin }, {"nProgramFragmentBindTexture", "(III)V", (void*)nProgramFragmentBindTexture }, {"nProgramFragmentBindSampler", "(III)V", (void*)nProgramFragmentBindSampler }, -{"nProgramFragmentSetType", "(II)V", (void*)nProgramFragmentSetType }, -{"nProgramFragmentSetEnvMode", "(II)V", (void*)nProgramFragmentSetEnvMode }, -{"nProgramFragmentSetTexEnable", "(IZ)V", (void*)nProgramFragmentSetTexEnable }, +{"nProgramFragmentSetSlot", "(IZII)V", (void*)nProgramFragmentSetSlot }, {"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate }, {"nProgramVertexBindAllocation", "(II)V", (void*)nProgramVertexBindAllocation }, diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h index e4cf00f..2f60c9f 100644 --- a/libs/rs/RenderScript.h +++ b/libs/rs/RenderScript.h @@ -80,7 +80,8 @@ enum RsDataKind { RS_KIND_NX, RS_KIND_NY, RS_KIND_NZ, - RS_KIND_INDEX + RS_KIND_INDEX, + RS_KIND_POINT_SIZE }; enum RsElementPredefined { diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 1a81021..e275f27 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -361,6 +361,7 @@ ProgramFragmentStoreCreate { ProgramFragmentBegin { param RsElement in param RsElement out + param bool pointSpriteEnable } ProgramFragmentBindTexture { @@ -375,19 +376,11 @@ ProgramFragmentBindSampler { param RsSampler s } -ProgramFragmentSetType { - param uint32_t slot - param RsType t - } - -ProgramFragmentSetEnvMode { - param uint32_t slot - param RsTexEnvMode env - } - -ProgramFragmentSetTexEnable { +ProgramFragmentSetSlot { param uint32_t slot param bool enable + param RsTexEnvMode env + param RsType t } ProgramFragmentCreate { diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp index b88710c..4a043f3 100644 --- a/libs/rs/rsComponent.cpp +++ b/libs/rs/rsComponent.cpp @@ -24,7 +24,7 @@ using namespace android::renderscript; Component::Component() { mType = FLOAT; - mKind = NONE; + mKind = USER; mIsNormalized = false; mBits = 0; } diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h index 6342f1b..5856524 100644 --- a/libs/rs/rsComponent.h +++ b/libs/rs/rsComponent.h @@ -34,13 +34,13 @@ public: }; enum DataKind { - NONE, + USER, RED, GREEN, BLUE, ALPHA, LUMINANCE, INTENSITY, X, Y, Z, W, S, T, Q, R, NX, NY, NZ, INDEX, - USER + POINT_SIZE }; diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp index 9df07bf..4ef6835 100644 --- a/libs/rs/rsProgramFragment.cpp +++ b/libs/rs/rsProgramFragment.cpp @@ -24,7 +24,7 @@ using namespace android; using namespace android::renderscript; -ProgramFragment::ProgramFragment(Element *in, Element *out) : +ProgramFragment::ProgramFragment(Element *in, Element *out, bool pointSpriteEnable) : Program(in, out) { for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { @@ -32,6 +32,7 @@ ProgramFragment::ProgramFragment(Element *in, Element *out) : mTextureDimensions[ct] = 2; } mTextureEnableMask = 0; + mPointSpriteEnable = pointSpriteEnable; mEnvModes[1] = RS_TEX_ENV_MODE_DECAL; } @@ -54,6 +55,7 @@ void ProgramFragment::setupGL(ProgramFragmentState *state) } glEnable(GL_TEXTURE_2D); + //glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); switch(mEnvModes[ct]) { @@ -94,7 +96,6 @@ void ProgramFragment::setupGL(ProgramFragmentState *state) glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); } } - glActiveTexture(GL_TEXTURE0); mDirty = false; } @@ -178,7 +179,7 @@ ProgramFragmentState::~ProgramFragmentState() 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); } @@ -186,10 +187,10 @@ void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h) namespace android { 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; - 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) @@ -204,27 +205,20 @@ void rsi_ProgramFragmentBindSampler(Context *rsc, RsProgramFragment vpf, uint32_ 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); - uint32_t dim = 1; - if (t->getDimY()) { - dim ++; - if (t->getDimZ()) { + if (t) { + uint32_t dim = 1; + if (t->getDimY()) { 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); -} - -void rsi_ProgramFragmentSetTexEnable(Context *rsc, uint32_t slot, bool enable) -{ rsc->mStateFragment.mPF->setTexEnable(slot, enable); } diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h index 57fb6a5..bd45342 100644 --- a/libs/rs/rsProgramFragment.h +++ b/libs/rs/rsProgramFragment.h @@ -32,7 +32,7 @@ public: - ProgramFragment(Element *in, Element *out); + ProgramFragment(Element *in, Element *out, bool pointSpriteEnable); virtual ~ProgramFragment(); virtual void setupGL(ProgramFragmentState *); @@ -64,6 +64,7 @@ protected: // Hacks to create a program for now RsTexEnvMode mEnvModes[MAX_TEXTURE]; uint32_t mTextureEnableMask; + bool mPointSpriteEnable; }; class ProgramFragmentState diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp index c14c371..332d532 100644 --- a/libs/rs/rsSampler.cpp +++ b/libs/rs/rsSampler.cpp @@ -143,6 +143,7 @@ RsSampler rsi_SamplerCreate(Context *rsc) ss->mWrapS, ss->mWrapT, ss->mWrapR); + s->incRef(); return s; } diff --git a/libs/rs/rsTriangleMesh.cpp b/libs/rs/rsTriangleMesh.cpp index 8c7bc92..99f8adb 100644 --- a/libs/rs/rsTriangleMesh.cpp +++ b/libs/rs/rsTriangleMesh.cpp @@ -199,6 +199,7 @@ RsTriangleMesh rsi_TriangleMeshCreate(Context *rsc) memcpy(tm->mIndexData, tmc->mIndexData.array(), tm->mIndexDataSize); tm->analyzeElement(); + tm->incRef(); return tm; } @@ -248,16 +249,16 @@ void rsi_TriangleMeshRenderRange(Context *rsc, RsTriangleMesh vtm, uint32_t firs glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]); glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(tm->mSizeCoord, - GL_FLOAT, - tm->mVertexElement->getSizeBytes(), + glVertexPointer(tm->mSizeCoord, + GL_FLOAT, + tm->mVertexElement->getSizeBytes(), (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetCoord)); if (tm->mSizeTex) { glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(tm->mSizeTex, - GL_FLOAT, - tm->mVertexElement->getSizeBytes(), + glTexCoordPointer(tm->mSizeTex, + GL_FLOAT, + tm->mVertexElement->getSizeBytes(), (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetTex)); } else { glDisableClientState(GL_TEXTURE_COORD_ARRAY); @@ -265,8 +266,8 @@ void rsi_TriangleMeshRenderRange(Context *rsc, RsTriangleMesh vtm, uint32_t firs if (tm->mSizeNorm) { glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, - tm->mVertexElement->getSizeBytes(), + glNormalPointer(GL_FLOAT, + tm->mVertexElement->getSizeBytes(), (void *)tm->mVertexElement->getComponentOffsetBytes(tm->mOffsetNorm)); } else { glDisableClientState(GL_NORMAL_ARRAY); diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp index a40a152..5a9090e 100644 --- a/libs/rs/rsType.cpp +++ b/libs/rs/rsType.cpp @@ -230,6 +230,13 @@ void Type::makeGLComponents() mGL.mTex[texNum].size = 4; 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: break; } @@ -280,6 +287,13 @@ void Type::enableGLVertexBuffer() const } glClientActiveTexture(GL_TEXTURE0); + if (mGL.mPointSize.size) { + glEnableClientState(GL_POINT_SIZE_ARRAY_OES); + glPointSizePointerOES(mGL.mPointSize.type, + stride, + (void *)mGL.mPointSize.offset); + } + } diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h index 60d75d7..6c39a4c 100644 --- a/libs/rs/rsType.h +++ b/libs/rs/rsType.h @@ -118,6 +118,7 @@ protected: VertexComponent_t mNorm; VertexComponent_t mColor; VertexComponent_t mTex[RS_MAX_TEXTURE]; + VertexComponent_t mPointSize; }; GLState_t mGL; void makeGLComponents(); |