FragmentShader.java revision 99b93819f12f18b8559f702d7a303c31fe05205a
14fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/* 24fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 34fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * 44fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 54fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * you may not use this file except in compliance with the License. 64fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * You may obtain a copy of the License at 74fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * 84fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 94fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * 104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 124fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * See the License for the specific language governing permissions and 144fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * limitations under the License. 154fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */ 164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 174fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpackage com.android.scenegraph; 184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport java.lang.Math; 204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport java.util.ArrayList; 214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.content.res.Resources; 234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.*; 244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.ProgramFragment.Builder; 254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.util.Log; 264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 274fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/** 284fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * @hide 294fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */ 304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpublic class FragmentShader extends Shader { 314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ProgramFragment mProgram; 324fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ScriptField_FragmentShader_s mField; 334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 344fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public static class Builder { 354fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 364fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk FragmentShader mShader; 374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ProgramFragment.Builder mBuilder; 384fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 394fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder(RenderScriptGL rs) { 404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader = new FragmentShader(); 414fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder = new ProgramFragment.Builder(rs); 424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setShader(Resources resources, int resourceID) { 454fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.setShader(resources, resourceID); 464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 484fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 494fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setObjectConst(Type type) { 504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerObjConstants = type; 514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setShaderConst(Type type) { 554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerShaderConstants = type; 564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 5999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk public Builder addShaderTexture(Program.TextureType texType, String name) { 6099b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mShader.mShaderTextureNames.add(name); 6199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mShader.mShaderTextureTypes.add(texType); 6299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk return this; 6399b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 6499b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk 654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder addTexture(Program.TextureType texType, String name) { 664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mTextureNames.add(name); 6799b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mShader.mTextureTypes.add(texType); 684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk FragmentShader create() { 724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerShaderConstants != null) { 734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerShaderConstants); 744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerObjConstants != null) { 764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerObjConstants); 774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 7899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk for (int i = 0; i < mShader.mTextureTypes.size(); i ++) { 7999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mBuilder.addTexture(mShader.mTextureTypes.get(i)); 8099b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 8199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk for (int i = 0; i < mShader.mShaderTextureTypes.size(); i ++) { 8299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mBuilder.addTexture(mShader.mShaderTextureTypes.get(i)); 8399b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 8499b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk 854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mProgram = mBuilder.create(); 864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mShader; 874fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 884fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 894fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 904fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk FragmentShader() { 914fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 924fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 9399b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk public void updateTextures(RenderScriptGL rs, Resources res) { 9499b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk int shaderTextureStart = mTextureTypes.size(); 9599b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk for (int i = 0; i < mShaderTextureNames.size(); i ++) { 9699b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk ShaderParam sp = mSourceParams.get(mShaderTextureNames.get(i)); 9799b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk if (sp != null && sp instanceof TextureParam) { 9899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk TextureParam p = (TextureParam)sp; 9999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk mProgram.bindTexture(p.getTexture().getRsData(rs, res), shaderTextureStart + i); 10099b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 10199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 10299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk } 10399b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk 10499b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk public ScriptField_FragmentShader_s getRSData(RenderScriptGL rs, Resources res) { 1054fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mField != null) { 1064fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 1074fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1084fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1094fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ScriptField_FragmentShader_s.Item item = new ScriptField_FragmentShader_s.Item(); 1104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.program = mProgram; 1114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 11299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk linkConstants(rs, res); 1134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerShaderConstants != null) { 1144fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.shaderConst = mConstantBuffer; 1154fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.shaderConstParams = mConstantBufferParams; 1164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mProgram.bindConstants(item.shaderConst, 0); 1174fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = -1; 1204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerObjConstants != null) { 1214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = mPerShaderConstants != null ? 1 : 0; 1224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField = new ScriptField_FragmentShader_s(rs, 1); 1254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField.set(item, 0, true); 1264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 1274fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1284fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk} 129