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 Sakhartchoukimport java.util.HashMap;
224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
230c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchoukimport com.android.scenegraph.SceneGraphBase;
240c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchoukimport com.android.scenegraph.ShaderParam;
250c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.*;
2799b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchoukimport android.renderscript.ProgramFragment.Builder;
284fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.util.Log;
294fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/**
314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * @hide
324fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */
334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpublic abstract class Shader extends SceneGraphBase {
344fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    protected Type mPerObjConstants;
354fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    protected Type mPerShaderConstants;
364fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    protected HashMap<String, ShaderParam> mSourceParams;
3899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk    protected ArrayList<String> mShaderTextureNames;
3999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk    protected ArrayList<Program.TextureType > mShaderTextureTypes;
404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    protected ArrayList<String> mTextureNames;
4199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk    protected ArrayList<Program.TextureType > mTextureTypes;
424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    protected Allocation mConstantBuffer;
440c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    protected ScriptField_ShaderParam_s mConstantBufferParams;
454fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public Shader() {
474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mSourceParams = new HashMap<String, ShaderParam>();
4899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        mShaderTextureNames = new ArrayList<String>();
4999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        mShaderTextureTypes = new ArrayList<Program.TextureType>();
504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mTextureNames = new ArrayList<String>();
5199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        mTextureTypes = new ArrayList<Program.TextureType>();
524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendSourceParams(ShaderParam p) {
554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mSourceParams.put(p.getParamName(), p);
564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public Type getObjectConstants() {
594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        return mPerObjConstants;
604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
624fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public Type getShaderConstants() {
634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        return mPerObjConstants;
644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
66e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    void linkConstants(RenderScriptGL rs) {
674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        if (mPerShaderConstants == null) {
684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return;
694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Element constElem = mPerShaderConstants.getElement();
720c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk        mConstantBufferParams  = ShaderParam.fillInParams(constElem, mSourceParams, null);
734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mConstantBuffer = Allocation.createTyped(rs, mPerShaderConstants);
754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk}
77