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