VertexShader.java revision 0c9523357f48a26c8214ccff0b0d95c6927ac0d3
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 474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setObjectConst(Type type) { 484fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerObjConstants = type; 494fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder setShaderConst(Type type) { 534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mPerShaderConstants = type; 544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public Builder addInput(Element e) { 584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addInput(e); 594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return this; 604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 62d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk public VertexShader create() { 634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerShaderConstants != null) { 644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerShaderConstants); 654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mShader.mPerObjConstants != null) { 674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mBuilder.addConstant(mShader.mPerObjConstants); 684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mShader.mProgram = mBuilder.create(); 704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mShader; 714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 74d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk public ProgramVertex getProgram() { 75d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk return mProgram; 76d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk } 77d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk 78e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk ScriptField_VertexShader_s getRSData() { 794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mField != null) { 804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 814fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 83e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk RenderScriptGL rs = SceneManager.getRS(); 84e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk Resources res = SceneManager.getRes(); 85e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (rs == null || res == null) { 86e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk return null; 87e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk 894fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item(); 904fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.program = mProgram; 914fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 92e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk linkConstants(rs); 934fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerShaderConstants != null) { 944fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.shaderConst = mConstantBuffer; 950c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk item.shaderConstParams = mConstantBufferParams.getAllocation(); 964fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mProgram.bindConstants(item.shaderConst, 0); 974fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 994fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = -1; 1004fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk if (mPerObjConstants != null) { 1014fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk item.objectConstIndex = mPerShaderConstants != null ? 1 : 0; 1024fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1034fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1044fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField = new ScriptField_VertexShader_s(rs, 1); 1054fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mField.set(item, 0, true); 1064fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk return mField; 1074fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1084fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk} 109