From 4244afa87edf8f2dde0f053f31f39f54c0fa1783 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Thu, 2 Jul 2009 15:09:27 -0700 Subject: [PATCH] Add support for multitexture and fix allocation ref counting bug in RS. Add plaque to rollo and leave it disabled due to ugly appearance. --- libs/rs/java/Rollo/res/raw/rollo.c | 10 ++---- .../Rollo/src/com/android/rollo/RolloRS.java | 36 ++++++++++++++++++- libs/rs/rsAllocation.cpp | 1 + libs/rs/rsProgramFragment.cpp | 34 +++++++++++++----- libs/rs/rsScriptC.cpp | 11 ++++-- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c index 64a0d0fcd30c0..f181e4972f726 100644 --- a/libs/rs/java/Rollo/res/raw/rollo.c +++ b/libs/rs/java/Rollo/res/raw/rollo.c @@ -25,13 +25,13 @@ int main(void* con, int ft, int launchID) int pressure; - iconCount = 38;//loadI32(0, 1); rotStep = 20 * 0x10000; pressure = loadI32(0, 2); rowCount = 4; - rot = (-20 + loadI32(0, 0)) * 0x10000; + iconCount = loadI32(0, 1); + rot = (-20 + loadI32(0, 0)) * 0x10000; while (iconCount) { tmpSin = sinx(rot); tmpCos = cosx(rot); @@ -45,9 +45,7 @@ int main(void* con, int ft, int launchID) for (y = 0; (y < rowCount) && iconCount; y++) { ty1 = (y * 0x30000) - 0x48000; ty2 = ty1 + 0x20000; - pfBindTexture(NAMED_PF, 0, loadI32(1, y)); - drawQuad(tx1, ty1, tz1, tx2, ty1, tz2, tx2, ty2, tz2, @@ -57,8 +55,6 @@ int main(void* con, int ft, int launchID) rot = rot + rotStep; } - //renderTriangleMesh(con, NAMED_MeshCard); - //renderTriangleMesh(con, NAMED_MeshTab); - return 1; + return 0; } diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java index 003a2a06e54e1..91f25c2725bdf 100644 --- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java +++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java @@ -69,6 +69,7 @@ public class RolloRS { private RenderScript.ProgramVertex mPV; private ProgramVertexAlloc mPVAlloc; private RenderScript.Allocation[] mIcons; + private RenderScript.Allocation mIconPlate; private int[] mAllocStateBuf; private RenderScript.Allocation mAllocState; @@ -79,7 +80,9 @@ public class RolloRS { private void initNamed() { mRS.samplerBegin(); mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN, - RenderScript.SamplerValue.LINEAR_MIP_LINEAR); + RenderScript.SamplerValue.LINEAR);//_MIP_LINEAR); + mRS.samplerSet(RenderScript.SamplerParam.FILTER_MAG, + RenderScript.SamplerValue.LINEAR); mRS.samplerSet(RenderScript.SamplerParam.WRAP_MODE_S, RenderScript.SamplerValue.CLAMP); mRS.samplerSet(RenderScript.SamplerParam.WRAP_MODE_T, @@ -89,10 +92,13 @@ public class RolloRS { mRS.programFragmentBegin(null, null); mRS.programFragmentSetTexEnable(0, true); + //mRS.programFragmentSetTexEnable(1, true); //mRS.programFragmentSetEnvMode(0, RS_TEX_ENV_MODE_REPLACE); + //mRS.programFragmentSetEnvMode(1, RS_TEX_ENV_MODE_MODULATE); mPFImages = mRS.programFragmentCreate(); mPFImages.setName("PF"); mPFImages.bindSampler(mSampler, 0); + mPFImages.bindSampler(mSampler, 1); mRS.programFragmentStoreBegin(null, null); mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS); @@ -148,6 +154,34 @@ public class RolloRS { mAllocIconIDBuf[ct] = mIcons[ct].getID(); } mAllocIconID.data(mAllocIconIDBuf); + + RenderScript.Element e = mRS.elementGetPredefined(RenderScript.ElementPredefined.RGB_565); + mRS.typeBegin(e); + mRS.typeAdd(RenderScript.Dimension.X, 64); + mRS.typeAdd(RenderScript.Dimension.Y, 64); + RenderScript.Type t = mRS.typeCreate(); + mIconPlate = mRS.allocationCreateTyped(t); + //t.destroy(); + //e.destroy(); + + int tmp[] = new int[64 * 32]; + for(int ct = 0; ct < (64*32); ct++) { + tmp[ct] = 7 | (13 << 5) | (7 << 11); + tmp[ct] = tmp[ct] | (tmp[ct] << 16); + } + for(int ct = 0; ct < 32; ct++) { + tmp[ct] = 0; + tmp[ct + (63*32)] = 0; + } + for(int ct = 0; ct < 64; ct++) { + tmp[ct * 32] = 0; + tmp[ct * 32 + 31] = 0; + } + mIconPlate.data(tmp); + Log.e("xx", "plate"); + mIconPlate.uploadToTexture(0); + mIconPlate.setName("Plate"); + mPFImages.bindTexture(mIconPlate, 0); } } diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp index bc14eac9b17de..c143307bd5493 100644 --- a/libs/rs/rsAllocation.cpp +++ b/libs/rs/rsAllocation.cpp @@ -164,6 +164,7 @@ RsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype) const Type * type = static_cast(vtype); Allocation * alloc = new Allocation(type); + alloc->incRef(); return alloc; } diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp index f2e7095c22abf..628f93ec8d6df 100644 --- a/libs/rs/rsProgramFragment.cpp +++ b/libs/rs/rsProgramFragment.cpp @@ -32,6 +32,7 @@ ProgramFragment::ProgramFragment(Element *in, Element *out) : mTextureDimensions[ct] = 2; } mTextureEnableMask = 0; + mEnvModes[1] = RS_TEX_ENV_MODE_DECAL; } ProgramFragment::~ProgramFragment() @@ -42,10 +43,7 @@ void ProgramFragment::setupGL() { for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { glActiveTexture(GL_TEXTURE0 + ct); - if (!(mTextureEnableMask & (1 << ct)) || - //!mSamplers[ct].get() || - !mTextures[ct].get()) { - + if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { glDisable(GL_TEXTURE_2D); continue; } @@ -55,13 +53,13 @@ void ProgramFragment::setupGL() switch(mEnvModes[ct]) { case RS_TEX_ENV_MODE_REPLACE: - glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); break; case RS_TEX_ENV_MODE_MODULATE: - glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); break; case RS_TEX_ENV_MODE_DECAL: - glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_DECAL); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); break; } @@ -70,10 +68,29 @@ void ProgramFragment::setupGL() } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } + + // Gross hack. + if (ct == 2) { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + } } + + glActiveTexture(GL_TEXTURE0); } @@ -85,6 +102,7 @@ void ProgramFragment::bindTexture(uint32_t slot, Allocation *a) return; } + //LOGE("bindtex %i %p", slot, a); mTextures[slot].set(a); } diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 55daf7ec4ce3b..0ec6bafe97305 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -334,12 +334,19 @@ extern "C" void drawQuad(int32_t x1, int32_t y1, int32_t z1, //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]); glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FIXED, 0, vtx); + + glClientActiveTexture(GL_TEXTURE0); glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(2, GL_FIXED, 0, tex); + glClientActiveTexture(GL_TEXTURE1); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(2, GL_FIXED, 0, tex); + glClientActiveTexture(GL_TEXTURE0); + glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); - glVertexPointer(3, GL_FIXED, 0, vtx); - glTexCoordPointer(2, GL_FIXED, 0, tex); //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);