VertexShader.java revision c71343acc469db7ec351db2344032801e0e1b30a
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.util.Log; 254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/** 274fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * @hide 284fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */ 294fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpublic class VertexShader extends Shader { 304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ProgramVertex mProgram; 314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ScriptField_VertexShader_s mField; 324fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public static class Builder { 344fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk VertexShader mShader; 354fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ProgramVertex.Builder mBuilder; 364fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder(RenderScriptGL rs) { 384fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader = new VertexShader(); 394fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder = new ProgramVertex.Builder(rs); 404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 414fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setShader(Resources resources, int resourceID) { 434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.setShader(resources, resourceID); 444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 454fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 47c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk public Builder setShader(String code) { 48c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk mBuilder.setShader(code); 49c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk return this; 50c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 51c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk 524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setObjectConst(Type type) { 534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerObjConstants = type; 544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setShaderConst(Type type) { 584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerShaderConstants = type; 594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 624fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder addInput(Element e) { 634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addInput(e); 644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 67d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk public VertexShader create() { 684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerShaderConstants != null) { 694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerShaderConstants); 704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerObjConstants != null) { 724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerObjConstants); 734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mProgram = mBuilder.create(); 754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mShader; 764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 79d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk public ProgramVertex getProgram() { 80d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk return mProgram; 81d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk } 82d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk 83e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk ScriptField_VertexShader_s getRSData() { 844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mField != null) { 854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 874fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk RenderScriptGL rs = SceneManager.getRS(); 89e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk Resources res = SceneManager.getRes(); 90e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (rs == null || res == null) { 91e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk return null; 92e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 93e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk 944fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item(); 954fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.program = mProgram; 964fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 97e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk linkConstants(rs); 984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerShaderConstants != null) { 994fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.shaderConst = mConstantBuffer; 1000c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk item.shaderConstParams = mConstantBufferParams.getAllocation(); 1014fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mProgram.bindConstants(item.shaderConst, 0); 1024fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1034fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1044fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = -1; 1054fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerObjConstants != null) { 1064fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = mPerShaderConstants != null ? 1 : 0; 1074fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1084fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1094fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField = new ScriptField_VertexShader_s(rs, 1); 1104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField.set(item, 0, true); 1114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 1124fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk} 114