diff options
author | Romain Guy <romainguy@android.com> | 2009-08-04 17:19:48 -0700 |
---|---|---|
committer | Romain Guy <romainguy@android.com> | 2009-08-04 18:50:24 -0700 |
commit | a2136d6b18a26ff34f2e5cd3f6c9413f0c96a5ba (patch) | |
tree | 631c877639776d069542af05afebe7ba99b5e544 | |
parent | ead2758ce2103ab7b7c95c6aff91b239bb566099 (diff) | |
download | frameworks_base-a2136d6b18a26ff34f2e5cd3f6c9413f0c96a5ba.zip frameworks_base-a2136d6b18a26ff34f2e5cd3f6c9413f0c96a5ba.tar.gz frameworks_base-a2136d6b18a26ff34f2e5cd3f6c9413f0c96a5ba.tar.bz2 |
Add ability to load arrays in RenderScript.
-rw-r--r-- | libs/rs/java/Fall/Android.mk | 25 | ||||
-rw-r--r-- | libs/rs/java/Fall/AndroidManifest.xml | 20 | ||||
-rw-r--r-- | libs/rs/java/Fall/res/raw/fall.c | 0 | ||||
-rw-r--r-- | libs/rs/java/Fall/src/com/android/fall/rs/Fall.java | 47 | ||||
-rw-r--r-- | libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java | 216 | ||||
-rw-r--r-- | libs/rs/java/Fall/src/com/android/fall/rs/FallView.java | 44 | ||||
-rw-r--r-- | libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java | 56 | ||||
-rw-r--r-- | libs/rs/java/Grass/src/com/android/grass/rs/GrassView.java | 11 | ||||
-rw-r--r-- | libs/rs/rsScriptC_Lib.cpp | 20 |
9 files changed, 417 insertions, 22 deletions
diff --git a/libs/rs/java/Fall/Android.mk b/libs/rs/java/Fall/Android.mk new file mode 100644 index 0000000..6366f63 --- /dev/null +++ b/libs/rs/java/Fall/Android.mk @@ -0,0 +1,25 @@ +# +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-java-files-under, src) +#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript + +LOCAL_PACKAGE_NAME := FallRS + +include $(BUILD_PACKAGE) diff --git a/libs/rs/java/Fall/AndroidManifest.xml b/libs/rs/java/Fall/AndroidManifest.xml new file mode 100644 index 0000000..f4f96a1 --- /dev/null +++ b/libs/rs/java/Fall/AndroidManifest.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.fall.rs"> + + <application android:label="FallRS"> + + <activity + android:name="Fall" + android:theme="@android:style/Theme.NoTitleBar"> + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + </activity> + + </application> + +</manifest> diff --git a/libs/rs/java/Fall/res/raw/fall.c b/libs/rs/java/Fall/res/raw/fall.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libs/rs/java/Fall/res/raw/fall.c diff --git a/libs/rs/java/Fall/src/com/android/fall/rs/Fall.java b/libs/rs/java/Fall/src/com/android/fall/rs/Fall.java new file mode 100644 index 0000000..b1d9b1d --- /dev/null +++ b/libs/rs/java/Fall/src/com/android/fall/rs/Fall.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.android.fall.rs; + +import android.app.Activity; +import android.os.Bundle; + +public class Fall extends Activity { + private FallView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + mView = new FallView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + super.onResume(); + mView.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + mView.onPause(); + + Runtime.getRuntime().exit(0); + } +} diff --git a/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java new file mode 100644 index 0000000..9b950df --- /dev/null +++ b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.fall.rs; + +import android.content.res.Resources; +import android.renderscript.RenderScript; +import android.renderscript.ScriptC; +import android.renderscript.ProgramFragment; +import android.renderscript.ProgramStore; +import android.renderscript.ProgramVertexAlloc; +import android.renderscript.Allocation; +import android.renderscript.Sampler; +import static android.renderscript.Sampler.Value.LINEAR; +import static android.renderscript.Sampler.Value.CLAMP; +import static android.renderscript.ProgramStore.DepthFunc.*; +import static android.renderscript.ProgramStore.BlendDstFunc; +import static android.renderscript.ProgramStore.BlendSrcFunc; +import static android.renderscript.ProgramFragment.EnvMode.*; +import static android.renderscript.Element.*; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; + +import java.util.TimeZone; + +class FallRS { + private static final int MESH_RESOLUTION = 64; + + private static final int RSID_STATE = 0; + private static final int RSID_STATE_FRAMECOUNT = 0; + private static final int RSID_STATE_WIDTH = 1; + private static final int RSID_STATE_HEIGHT = 2; + + private static final int RSID_TEXTURES = 1; + private static final int TEXTURES_COUNT = 0; + + private Resources mResources; + private RenderScript mRS; + private final BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); + + private final int mWidth; + private final int mHeight; + + private ScriptC mScript; + private Sampler mSampler; + private ProgramFragment mPfBackground; + private ProgramStore mPfsBackground; + private RenderScript.ProgramVertex mPvBackground; + private ProgramVertexAlloc mPvOrthoAlloc; + + private Allocation mTexturesIDs; + private Allocation[] mTextures; + private int[] mTextureBufferIDs; + + private Allocation mState; + + public FallRS(int width, int height) { + mWidth = width; + mHeight = height; + mBitmapOptions.inScaled = false; + mBitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; + } + + public void init(RenderScript rs, Resources res) { + mRS = rs; + mResources = res; + initRS(); + } + + public void destroy() { + mScript.destroy(); + mSampler.destroy(); + mPfBackground.destroy(); + mPfsBackground.destroy(); + mPvBackground.destroy(); + mPvOrthoAlloc.mAlloc.destroy(); + mTexturesIDs.destroy(); + for (Allocation a : mTextures) { + a.destroy(); + } + mState.destroy(); + mTextureBufferIDs = null; + } + + @Override + protected void finalize() throws Throwable { + try { + destroy(); + } finally { + super.finalize(); + } + } + + private void initRS() { + createProgramVertex(); + createProgramFragmentStore(); + createProgramFragment(); + createScriptStructures(); + createMesh(); + + ScriptC.Builder sb = new ScriptC.Builder(mRS); + sb.setScript(mResources, R.raw.fall); + sb.setRoot(true); + mScript = sb.create(); + mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); + mScript.setTimeZone(TimeZone.getDefault().getID()); + + loadSkyTextures(); + mScript.bindAllocation(mState, RSID_STATE); + mScript.bindAllocation(mTexturesIDs, RSID_TEXTURES); + + mRS.contextBindRootScript(mScript); + } + + private void createMesh() { + + } + + private void createScriptStructures() { + final int[] data = new int[3]; + mState = Allocation.createSized(mRS, USER_I32, data.length); + data[RSID_STATE_FRAMECOUNT] = 0; + data[RSID_STATE_WIDTH] = mWidth; + data[RSID_STATE_HEIGHT] = mHeight; + mState.data(data); + } + + private void loadSkyTextures() { + mTextureBufferIDs = new int[TEXTURES_COUNT]; + mTextures = new Allocation[TEXTURES_COUNT]; + mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, TEXTURES_COUNT); + + final Allocation[] textures = mTextures; + // TOOD: Load textures + + final int[] bufferIds = mTextureBufferIDs; + final int count = textures.length; + + for (int i = 0; i < count; i++) { + final Allocation texture = textures[i]; + texture.uploadToTexture(0); + bufferIds[i] = texture.getID(); + } + + mTexturesIDs.data(bufferIds); + } + + private Allocation loadTexture(int id, String name) { + final Allocation allocation = Allocation.createFromBitmapResource(mRS, mResources, + id, RGB_565, false); + allocation.setName(name); + return allocation; + } + + private Allocation loadTextureARGB(int id, String name) { + // Forces ARGB 32 bits, because pngcrush sometimes optimize our PNGs to + // indexed pictures, which are not well supported + final Bitmap b = BitmapFactory.decodeResource(mResources, id, mBitmapOptions); + final Allocation allocation = Allocation.createFromBitmap(mRS, b, RGBA_8888, false); + allocation.setName(name); + return allocation; + } + + private void createProgramFragment() { + Sampler.Builder bs = new Sampler.Builder(mRS); + bs.setMin(LINEAR); + bs.setMag(LINEAR); + bs.setWrapS(CLAMP); + bs.setWrapT(CLAMP); + mSampler = bs.create(); + + ProgramFragment.Builder b; + b = new ProgramFragment.Builder(mRS, null, null); + b.setTexEnable(true, 0); + b.setTexEnvMode(REPLACE, 0); + mPfBackground = b.create(); + mPfBackground.setName("PFBackground"); + mPfBackground.bindSampler(mSampler, 0); + } + + private void createProgramFragmentStore() { + ProgramStore.Builder b; + b = new ProgramStore.Builder(mRS, null, null); + + b.setDepthFunc(ALWAYS); + b.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA); + b.setDitherEnable(true); + b.setDepthMask(false); + mPfsBackground = b.create(); + mPfsBackground.setName("PFSBackground"); + } + + private void createProgramVertex() { + mPvOrthoAlloc = new ProgramVertexAlloc(mRS); + mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight); + + mRS.programVertexBegin(null, null); + mRS.programVertexSetTextureMatrixEnable(true); + mPvBackground = mRS.programVertexCreate(); + mPvBackground.bindAllocation(0, mPvOrthoAlloc.mAlloc); + mPvBackground.setName("PVBackground"); + } +} diff --git a/libs/rs/java/Fall/src/com/android/fall/rs/FallView.java b/libs/rs/java/Fall/src/com/android/fall/rs/FallView.java new file mode 100644 index 0000000..ebbdba5 --- /dev/null +++ b/libs/rs/java/Fall/src/com/android/fall/rs/FallView.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.android.fall.rs; + +import android.content.Context; +import android.view.SurfaceHolder; +import android.renderscript.RenderScript; +import android.renderscript.RSSurfaceView; + +class FallView extends RSSurfaceView { + private FallRS mRender; + + public FallView(Context context) { + super(context); + } + + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + super.surfaceChanged(holder, format, w, h); + + RenderScript RS = createRenderScript(); + mRender = new FallRS(w, h); + mRender.init(RS, getResources()); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + if (mRender != null) mRender.destroy(); + } +} diff --git a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java index e9aa3cc..309c940 100644 --- a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java +++ b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java @@ -18,7 +18,6 @@ package com.android.grass.rs; import android.content.res.Resources; import android.renderscript.Sampler; -import static android.renderscript.Sampler.Value.*; import static android.renderscript.ProgramFragment.EnvMode.*; import static android.renderscript.ProgramStore.DepthFunc.*; import static android.renderscript.ProgramStore.BlendSrcFunc; @@ -33,6 +32,7 @@ import static android.util.MathUtils.*; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.renderscript.ScriptC; +import static android.renderscript.Sampler.Value.*; import java.util.TimeZone; @@ -43,8 +43,8 @@ class GrassRS { private static final int RSID_STATE_WIDTH = 2; private static final int RSID_STATE_HEIGHT = 3; - private static final int RSID_SKY_TEXTURES = 1; - private static final int SKY_TEXTURES_COUNT = 5; + private static final int RSID_TEXTURES = 1; + private static final int TEXTURES_COUNT = 5; private static final int RSID_BLADES = 2; private static final int BLADES_COUNT = 100; @@ -69,32 +69,21 @@ class GrassRS { private final int mWidth; private final int mHeight; - @SuppressWarnings({"FieldCanBeLocal"}) private ScriptC mScript; - @SuppressWarnings({"FieldCanBeLocal"}) private Sampler mSampler; - @SuppressWarnings({"FieldCanBeLocal"}) private ProgramFragment mPfBackground; - @SuppressWarnings({"FieldCanBeLocal"}) private ProgramStore mPfsBackground; - @SuppressWarnings({"FieldCanBeLocal"}) private RenderScript.ProgramVertex mPvBackground; - @SuppressWarnings({"FieldCanBeLocal"}) private ProgramVertexAlloc mPvOrthoAlloc; - @SuppressWarnings({"FieldCanBeLocal"}) private Allocation mTexturesIDs; - @SuppressWarnings({"FieldCanBeLocal"}) private Allocation[] mTextures; - @SuppressWarnings({"FieldCanBeLocal"}) private int[] mTextureBufferIDs; - @SuppressWarnings({"FieldCanBeLocal"}) + private Allocation mState; - @SuppressWarnings({"FieldCanBeLocal"}) private Allocation mBlades; - @SuppressWarnings({"FieldCanBeLocal"}) + private ProgramFragment mPfGrass; - @SuppressWarnings({"FieldCanBeLocal"}) private ProgramStore mPfsGrass; public GrassRS(int width, int height) { @@ -109,6 +98,33 @@ class GrassRS { mResources = res; initRS(); } + + public void destroy() { + mScript.destroy(); + mSampler.destroy(); + mPfBackground.destroy(); + mPfsBackground.destroy(); + mPvBackground.destroy(); + mPvOrthoAlloc.mAlloc.destroy(); + mTexturesIDs.destroy(); + for (Allocation a : mTextures) { + a.destroy(); + } + mState.destroy(); + mBlades.destroy(); + mPfGrass.destroy(); + mPfsGrass.destroy(); + mTextureBufferIDs = null; + } + + @Override + protected void finalize() throws Throwable { + try { + destroy(); + } finally { + super.finalize(); + } + } private void initRS() { createProgramVertex(); @@ -125,7 +141,7 @@ class GrassRS { loadSkyTextures(); mScript.bindAllocation(mState, RSID_STATE); - mScript.bindAllocation(mTexturesIDs, RSID_SKY_TEXTURES); + mScript.bindAllocation(mTexturesIDs, RSID_TEXTURES); mScript.bindAllocation(mBlades, RSID_BLADES); mRS.contextBindRootScript(mScript); @@ -165,9 +181,9 @@ class GrassRS { } private void loadSkyTextures() { - mTextureBufferIDs = new int[SKY_TEXTURES_COUNT]; - mTextures = new Allocation[SKY_TEXTURES_COUNT]; - mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, SKY_TEXTURES_COUNT); + mTextureBufferIDs = new int[TEXTURES_COUNT]; + mTextures = new Allocation[TEXTURES_COUNT]; + mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, TEXTURES_COUNT); final Allocation[] textures = mTextures; textures[0] = loadTexture(R.drawable.night, "night"); diff --git a/libs/rs/java/Grass/src/com/android/grass/rs/GrassView.java b/libs/rs/java/Grass/src/com/android/grass/rs/GrassView.java index 44d5b08..c2b9a66 100644 --- a/libs/rs/java/Grass/src/com/android/grass/rs/GrassView.java +++ b/libs/rs/java/Grass/src/com/android/grass/rs/GrassView.java @@ -22,6 +22,8 @@ import android.renderscript.RenderScript; import android.view.SurfaceHolder; class GrassView extends RSSurfaceView { + private GrassRS mRender; + public GrassView(Context context) { super(context); } @@ -30,7 +32,12 @@ class GrassView extends RSSurfaceView { super.surfaceChanged(holder, format, w, h); RenderScript RS = createRenderScript(); - GrassRS render = new GrassRS(w, h); - render.init(RS, getResources()); + mRender = new GrassRS(w, h); + mRender.init(RS, getResources()); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + if (mRender != null) mRender.destroy(); } } diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp index 561cde6..8a29be34 100644 --- a/libs/rs/rsScriptC_Lib.cpp +++ b/libs/rs/rsScriptC_Lib.cpp @@ -59,6 +59,22 @@ static int32_t SC_loadI32(uint32_t bank, uint32_t offset) return i[offset]; } +static float* SC_loadArrayF(uint32_t bank) +{ + GET_TLS(); + void *vp = sc->mSlots[bank]->getPtr(); + float *f = static_cast<float *>(vp); + return f; +} + +static int32_t* SC_loadArrayI32(uint32_t bank) +{ + GET_TLS(); + void *vp = sc->mSlots[bank]->getPtr(); + int32_t *i = static_cast<int32_t *>(vp); + return i; +} + static uint32_t SC_loadU32(uint32_t bank, uint32_t offset) { GET_TLS(); @@ -678,6 +694,10 @@ ScriptCState::SymbolTable_t ScriptCState::gSyms[] = { //{ "loadU32", (void *)&SC_loadU32, "unsigned int", "(int, int)" }, { "loadF", (void *)&SC_loadF, "float", "(int, int)" }, + { "loadArrayF", (void *)&SC_loadArrayF, + "float*", "(int)" }, + { "loadArrayI32", (void *)&SC_loadArrayI32, + "int*", "(int)" }, { "loadVec4", (void *)&SC_loadVec4, "void", "(int, int, float *)" }, { "loadMatrix", (void *)&SC_loadMatrix, |