From eb4b031804f42d52645d0d74f8ebc806f85a043b Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Thu, 12 Nov 2009 16:09:45 -0800 Subject: [PATCH] Make default vertex program correctly track surface size. --- .../com/android/fountain/FountainView.java | 28 ++++++++----------- libs/rs/rsContext.cpp | 1 + libs/rs/rsProgramVertex.cpp | 9 ++++-- libs/rs/rsProgramVertex.h | 1 + 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java index cda005e06930d..1e7c5a2f047e2 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java @@ -48,28 +48,24 @@ public class FountainView extends RSSurfaceView { private RenderScript mRS; private FountainRS mRender; - private void destroyRS() { + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + super.surfaceChanged(holder, format, w, h); + if (mRS == null) { + mRS = createRenderScript(false, true); + mRS.contextSetSurface(w, h, holder.getSurface()); + mRender = new FountainRS(); + mRender.init(mRS, getResources(), w, h); + } + } + + @Override + protected void onDetachedFromWindow() { if(mRS != null) { mRS = null; destroyRenderScript(); } - java.lang.System.gc(); } - public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - super.surfaceChanged(holder, format, w, h); - destroyRS(); - mRS = createRenderScript(false, true); - mRender = new FountainRS(); - mRender.init(mRS, getResources(), w, h); - } - - public void surfaceDestroyed(SurfaceHolder holder) { - // Surface will be destroyed when we return - destroyRS(); - } - - @Override public boolean onTouchEvent(MotionEvent ev) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index ab3809de655ce..c835dda760118 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -443,6 +443,7 @@ void Context::setSurface(uint32_t w, uint32_t h, Surface *sur) eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight); mWidth = w; mHeight = h; + mStateVertex.updateSize(this, w, h); if ((int)mWidth != mEGL.mWidth || (int)mHeight != mEGL.mHeight) { LOGE("EGL/Surface mismatch EGL (%i x %i) SF (%i x %i)", mEGL.mWidth, mEGL.mHeight, mWidth, mHeight); diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp index eea8b3b670684..68f589f45f828 100644 --- a/libs/rs/rsProgramVertex.cpp +++ b/libs/rs/rsProgramVertex.cpp @@ -157,12 +157,17 @@ void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h) pv->bindAllocation(alloc); + updateSize(rsc, w, h); +} + +void ProgramVertexState::updateSize(Context *rsc, int32_t w, int32_t h) +{ Matrix m; m.loadOrtho(0,w, h,0, -1,1); - alloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4); + mDefaultAlloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4); m.loadIdentity(); - alloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4); + mDefaultAlloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4); } void ProgramVertexState::deinit(Context *rsc) diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h index 493668c083a14..a97ba3825ff0f 100644 --- a/libs/rs/rsProgramVertex.h +++ b/libs/rs/rsProgramVertex.h @@ -63,6 +63,7 @@ public: void init(Context *rsc, int32_t w, int32_t h); void deinit(Context *rsc); + void updateSize(Context *rsc, int32_t w, int32_t h); ObjectBaseRef mDefault; ObjectBaseRef mLast;