diff options
author | Alex Sakhartchouk <alexst@google.com> | 2012-01-25 17:58:56 -0800 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2012-01-25 17:59:14 -0800 |
commit | 99b93819f12f18b8559f702d7a303c31fe05205a (patch) | |
tree | 4c176c18dcf714e14e35202e2382b0f8c480e20c /tests/RenderScriptTests/SceneGraph/src | |
parent | 4c281dae6cd307e6b1f31b2b3a1da877353b0569 (diff) | |
download | frameworks_base-99b93819f12f18b8559f702d7a303c31fe05205a.zip frameworks_base-99b93819f12f18b8559f702d7a303c31fe05205a.tar.gz frameworks_base-99b93819f12f18b8559f702d7a303c31fe05205a.tar.bz2 |
Adding shader textures and removing specialized code.
Change-Id: Ie42928f9f7c1cee51ee2e0206b75e8239b75960a
Diffstat (limited to 'tests/RenderScriptTests/SceneGraph/src')
9 files changed, 78 insertions, 57 deletions
diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java index fb81f73..0c6312f 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java @@ -56,9 +56,15 @@ public class FragmentShader extends Shader { return this; } + public Builder addShaderTexture(Program.TextureType texType, String name) { + mShader.mShaderTextureNames.add(name); + mShader.mShaderTextureTypes.add(texType); + return this; + } + public Builder addTexture(Program.TextureType texType, String name) { - mBuilder.addTexture(texType); mShader.mTextureNames.add(name); + mShader.mTextureTypes.add(texType); return this; } @@ -69,6 +75,13 @@ public class FragmentShader extends Shader { if (mShader.mPerObjConstants != null) { mBuilder.addConstant(mShader.mPerObjConstants); } + for (int i = 0; i < mShader.mTextureTypes.size(); i ++) { + mBuilder.addTexture(mShader.mTextureTypes.get(i)); + } + for (int i = 0; i < mShader.mShaderTextureTypes.size(); i ++) { + mBuilder.addTexture(mShader.mShaderTextureTypes.get(i)); + } + mShader.mProgram = mBuilder.create(); return mShader; } @@ -77,7 +90,18 @@ public class FragmentShader extends Shader { FragmentShader() { } - public ScriptField_FragmentShader_s getRSData(RenderScriptGL rs) { + public void updateTextures(RenderScriptGL rs, Resources res) { + int shaderTextureStart = mTextureTypes.size(); + for (int i = 0; i < mShaderTextureNames.size(); i ++) { + ShaderParam sp = mSourceParams.get(mShaderTextureNames.get(i)); + if (sp != null && sp instanceof TextureParam) { + TextureParam p = (TextureParam)sp; + mProgram.bindTexture(p.getTexture().getRsData(rs, res), shaderTextureStart + i); + } + } + } + + public ScriptField_FragmentShader_s getRSData(RenderScriptGL rs, Resources res) { if (mField != null) { return mField; } @@ -85,7 +109,7 @@ public class FragmentShader extends Shader { ScriptField_FragmentShader_s.Item item = new ScriptField_FragmentShader_s.Item(); item.program = mProgram; - linkConstants(rs); + linkConstants(rs, res); if (mPerShaderConstants != null) { item.shaderConst = mConstantBuffer; item.shaderConstParams = mConstantBufferParams; diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/RenderState.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/RenderState.java index 2cc8c6b..8546e95 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/RenderState.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/RenderState.java @@ -18,6 +18,7 @@ package com.android.scenegraph; import java.lang.Math; import java.util.ArrayList; +import android.content.res.Resources; import android.renderscript.Allocation; import android.renderscript.Element; @@ -75,14 +76,14 @@ public class RenderState extends SceneGraphBase { mRaster = pr; } - public ScriptField_RenderState_s getRSData(RenderScriptGL rs) { + public ScriptField_RenderState_s getRSData(RenderScriptGL rs, Resources res) { if (mField != null) { return mField; } ScriptField_RenderState_s.Item item = new ScriptField_RenderState_s.Item(); - item.pv = mVertex.getRSData(rs).getAllocation(); - item.pf = mFragment.getRSData(rs).getAllocation(); + item.pv = mVertex.getRSData(rs, res).getAllocation(); + item.pf = mFragment.getRSData(rs, res).getAllocation(); item.ps = mStore; item.pr = mRaster; diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java index c73b32e..cf4a846 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java @@ -231,7 +231,7 @@ public class Renderable extends RenderableBase { mRsFieldItem.transformMatrix = mTransform.getRSData(rs).getAllocation(); } mRsFieldItem.name = SceneManager.getStringAsAllocation(rs, getName()); - mRsFieldItem.render_state = mRenderState.getRSData(rs).getAllocation(); + mRsFieldItem.render_state = mRenderState.getRSData(rs, res).getAllocation(); mRsFieldItem.bVolInitialized = 0; mRsFieldItem.cullType = mCullType; } diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java index 3d48547..653ce51 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java @@ -51,6 +51,22 @@ public class Scene extends SceneGraphBase { } } + private class ShaderImageLoader extends AsyncTask<ArrayList<FragmentShader>, Void, Boolean> { + protected Boolean doInBackground(ArrayList<FragmentShader>... objects) { + long start = System.currentTimeMillis(); + for (int i = 0; i < objects[0].size(); i ++) { + FragmentShader sI = objects[0].get(i); + sI.updateTextures(mRS, mRes); + } + long end = System.currentTimeMillis(); + Log.v(TIMER_TAG, "Shader texture init time: " + (end - start)); + return new Boolean(true); + } + + protected void onPostExecute(Boolean result) { + } + } + CompoundTransform mRootTransforms; HashMap<String, Transform> mTransformMap; ArrayList<RenderPass> mRenderPasses; @@ -210,6 +226,7 @@ public class Scene extends SceneGraphBase { } public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) { + new ShaderImageLoader().execute(mFragmentShaders); if (mRenderPasses.size() != 0) { mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size()); for (int i = 0; i < mRenderPasses.size(); i ++) { @@ -246,7 +263,7 @@ public class Scene extends SceneGraphBase { Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()]; for (int i = 0; i < mVertexShaders.size(); i ++) { VertexShader sI = mVertexShaders.get(i); - shaderAllocs[i] = sI.getRSData(rs).getAllocation(); + shaderAllocs[i] = sI.getRSData(rs, res).getAllocation(); } shaderData.copyFrom(shaderAllocs); sceneManager.mRenderLoop.set_gVertexShaders(shaderData); @@ -255,7 +272,7 @@ public class Scene extends SceneGraphBase { shaderAllocs = new Allocation[mFragmentShaders.size()]; for (int i = 0; i < mFragmentShaders.size(); i ++) { FragmentShader sI = mFragmentShaders.get(i); - shaderAllocs[i] = sI.getRSData(rs).getAllocation(); + shaderAllocs[i] = sI.getRSData(rs, res).getAllocation(); } shaderData.copyFrom(shaderAllocs); sceneManager.mRenderLoop.set_gFragmentShaders(shaderData); diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Shader.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Shader.java index 9713eb5..7541115 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Shader.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Shader.java @@ -22,6 +22,7 @@ import java.util.HashMap; import android.content.res.Resources; import android.renderscript.*; +import android.renderscript.ProgramFragment.Builder; import android.util.Log; /** @@ -33,7 +34,10 @@ public abstract class Shader extends SceneGraphBase { protected HashMap<String, ShaderParam> mSourceParams; protected ArrayList<ShaderParam> mParamList; + protected ArrayList<String> mShaderTextureNames; + protected ArrayList<Program.TextureType > mShaderTextureTypes; protected ArrayList<String> mTextureNames; + protected ArrayList<Program.TextureType > mTextureTypes; protected Allocation mConstantBuffer; protected Allocation mConstantBufferParams; @@ -41,7 +45,10 @@ public abstract class Shader extends SceneGraphBase { public Shader() { mSourceParams = new HashMap<String, ShaderParam>(); mParamList = new ArrayList<ShaderParam>(); + mShaderTextureNames = new ArrayList<String>(); + mShaderTextureTypes = new ArrayList<Program.TextureType>(); mTextureNames = new ArrayList<String>(); + mTextureTypes = new ArrayList<Program.TextureType>(); } public void appendSourceParams(ShaderParam p) { @@ -56,7 +63,7 @@ public abstract class Shader extends SceneGraphBase { return mPerObjConstants; } - void linkConstants(RenderScriptGL rs) { + void linkConstants(RenderScriptGL rs, Resources res) { if (mPerShaderConstants == null) { return; } diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java index b334b0a..087b776 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java @@ -78,9 +78,8 @@ public class TestAppRS { private VertexShader mPaintV; private Allocation mDefaultCube; - private Allocation mAllocPV; - private Allocation mEnvCube; - private Allocation mDiffCube; + private TextureCube mEnvCube; + private TextureCube mDiffCube; Scene mActiveScene; @@ -135,35 +134,6 @@ public class TestAppRS { mSceneManager.loadModel(path, mLoadedCallback); } - // We use this to laod environment maps off the UI thread - private class ImageLoaderTask extends AsyncTask<String, Void, Boolean> { - Allocation tempEnv; - Allocation tempDiff; - - protected Boolean doInBackground(String... names) { - long start = System.currentTimeMillis(); - - tempEnv = SceneManager.loadCubemap("sdcard/scenegraph/cube_env.png", mRS, mRes); - tempDiff = SceneManager.loadCubemap("sdcard/scenegraph/cube_spec.png", mRS, mRes); - - long end = System.currentTimeMillis(); - Log.v("TIMER", "Image load time: " + (end - start)); - return new Boolean(true); - } - - protected void onPostExecute(Boolean result) { - if (tempEnv != null) { - mEnvCube = tempEnv; - mPaintF.mProgram.bindTexture(mEnvCube, 1); - } - - if (tempDiff != null) { - mDiffCube = tempDiff; - mAluminumF.mProgram.bindTexture(mDiffCube, 1); - } - } - } - public void onActionDown(float x, float y) { mTouchHandler.onActionDown(x, y); @@ -184,7 +154,7 @@ public class TestAppRS { fb.setShader(mRes, id); fb.addTexture(TextureType.TEXTURE_2D, "diffuse"); if (addCubemap) { - fb.addTexture(TextureType.TEXTURE_CUBE, "reflection"); + fb.addShaderTexture(TextureType.TEXTURE_CUBE, "reflection"); } FragmentShader pf = fb.create(); pf.mProgram.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); @@ -209,7 +179,9 @@ public class TestAppRS { mFsConst2 = new ScriptField_FShaderLightParams_s(mRS, 1); mPaintF = createFromResource(R.raw.paintf, true); + mPaintF.appendSourceParams(new TextureParam("reflection", mEnvCube)); mAluminumF = createFromResource(R.raw.metal, true); + mAluminumF.appendSourceParams(new TextureParam("reflection", mDiffCube)); mPlasticF = createFromResource(R.raw.plastic, false); mDiffuseF = createFromResource(R.raw.diffuse, false); @@ -307,15 +279,10 @@ public class TestAppRS { private void initRS() { FullscreenBlur.createRenderTargets(mRS, mWidth, mHeight); - initPaintShaders(); - - Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.defaultcube); - mDefaultCube = Allocation.createCubemapFromBitmap(mRS, b); - mPaintF.mProgram.bindTexture(mDefaultCube, 1); - mAluminumF.mProgram.bindTexture(mDefaultCube, 1); - // Reflection maps from SD card - new ImageLoaderTask().execute(); + mEnvCube = new TextureCube("sdcard/scenegraph/", "cube_env.png"); + mDiffCube = new TextureCube("sdcard/scenegraph/", "cube_spec.png"); + initPaintShaders(); ScriptC_render renderLoop = mSceneManager.getRenderLoop(); diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureCube.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureCube.java index fad52d0..e338be4 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureCube.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureCube.java @@ -39,6 +39,11 @@ public class TextureCube extends TextureBase { setTexture(tex); } + public TextureCube(String dir, String file) { + setFileDir(dir); + setFileName(file); + } + public void setFileDir(String dir) { mFileDir = dir; } diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureParam.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureParam.java index df7147a..d7d196b 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureParam.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TextureParam.java @@ -34,22 +34,22 @@ import android.util.Log; */ public class TextureParam extends ShaderParam { - Texture2D mTexture; + TextureBase mTexture; public TextureParam(String name) { super(name); } - public TextureParam(String name, Texture2D t) { + public TextureParam(String name, TextureBase t) { super(name); setTexture(t); } - public void setTexture(Texture2D t) { + public void setTexture(TextureBase t) { mTexture = t; } - public Texture2D getTexture() { + public TextureBase getTexture() { return mTexture; } diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/VertexShader.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/VertexShader.java index 7bf806e..4351f66 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/VertexShader.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/VertexShader.java @@ -74,7 +74,7 @@ public class VertexShader extends Shader { VertexShader() { } - public ScriptField_VertexShader_s getRSData(RenderScriptGL rs) { + public ScriptField_VertexShader_s getRSData(RenderScriptGL rs, Resources res) { if (mField != null) { return mField; } @@ -82,7 +82,7 @@ public class VertexShader extends Shader { ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item(); item.program = mProgram; - linkConstants(rs); + linkConstants(rs, res); if (mPerShaderConstants != null) { item.shaderConst = mConstantBuffer; item.shaderConstParams = mConstantBufferParams; |