rsProgramFragment.cpp revision 6e9342199959dc9beb5299fefc9775fe8c32620e
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h>
22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2ext.h>
23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else
24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h"
25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h>
26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/glext.h>
27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST
28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgramFragment.h"
301aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
357dad9c30a59c99b57269e1b498807b6f034d56e9Jason SamsProgramFragment::ProgramFragment(Context *rsc, const uint32_t * params,
367dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                                 uint32_t paramLength) :
374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Program(rsc)
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
39f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
40f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
416445e5210c6d7f8689e94be9026153d017c9545bJason Sams    rsAssert(paramLength == 6);
426445e5210c6d7f8689e94be9026153d017c9545bJason Sams
436445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[0] = 1.f;
446445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[1] = 1.f;
456445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[2] = 1.f;
466445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[3] = 1.f;
477dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams
487dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mEnvModes[0] = (RsTexEnvMode)params[0];
497dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mTextureFormats[0] = params[1];
507dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mEnvModes[1] = (RsTexEnvMode)params[2];
517dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mTextureFormats[1] = params[3];
527dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mPointSpriteEnable = params[4] != 0;
536445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mVaryingColor = false;
546445e5210c6d7f8689e94be9026153d017c9545bJason Sams    if (paramLength > 5)
556445e5210c6d7f8689e94be9026153d017c9545bJason Sams        mVaryingColor = params[5] != 0;
567dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureEnableMask = 0;
587dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    if (mEnvModes[0]) {
597dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        mTextureEnableMask |= 1;
607dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    }
617dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    if (mEnvModes[1]) {
627dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        mTextureEnableMask |= 2;
637dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    }
646445e5210c6d7f8689e94be9026153d017c9545bJason Sams
656445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformCount = 0;
666445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformNames[mUniformCount++].setTo("uni_Tex0");
676445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformNames[mUniformCount++].setTo("uni_Tex1");
686445e5210c6d7f8689e94be9026153d017c9545bJason Sams
696445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColorUniformIndex = -1;
706445e5210c6d7f8689e94be9026153d017c9545bJason Sams    //if (!mVaryingColor) {
716445e5210c6d7f8689e94be9026153d017c9545bJason Sams        mConstantColorUniformIndex = mUniformCount;
726445e5210c6d7f8689e94be9026153d017c9545bJason Sams        mUniformNames[mUniformCount++].setTo("uni_Color");
736445e5210c6d7f8689e94be9026153d017c9545bJason Sams    //}
746e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    init(rsc);
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
77f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
78f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                                 uint32_t shaderLength, const uint32_t * params,
79f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                                 uint32_t paramLength) :
80f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    Program(rsc, shaderText, shaderLength, params, paramLength)
81f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{
82f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mAllocFile = __FILE__;
83f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mAllocLine = __LINE__;
84f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
856445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[0] = 1.f;
866445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[1] = 1.f;
876445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[2] = 1.f;
886445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[3] = 1.f;
896445e5210c6d7f8689e94be9026153d017c9545bJason Sams
906445e5210c6d7f8689e94be9026153d017c9545bJason Sams    LOGE("Custom FP");
916445e5210c6d7f8689e94be9026153d017c9545bJason Sams
926445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformCount = 2;
936445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformNames[0].setTo("uni_Tex0");
946445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mUniformNames[1].setTo("uni_Tex1");
956445e5210c6d7f8689e94be9026153d017c9545bJason Sams
96f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mTextureEnableMask = (1 << mTextureCount) -1;
976e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk
986e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    init(rsc);
99f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams}
100f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
101f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
102326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragment::~ProgramFragment()
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1066445e5210c6d7f8689e94be9026153d017c9545bJason Samsvoid ProgramFragment::setConstantColor(float r, float g, float b, float a)
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
1086445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[0] = r;
1096445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[1] = g;
1106445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[2] = b;
1116445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mConstantColor[3] = a;
1126445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mDirty = true;
1136445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
114334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams
1156445e5210c6d7f8689e94be9026153d017c9545bJason Samsvoid ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state)
1166445e5210c6d7f8689e94be9026153d017c9545bJason Sams{
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc)
120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
1213eb28f07ab726a2e73063b95729abc191103b432Jason Sams
122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    //LOGE("sgl2 frag1 %x", glGetError());
123c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    if ((state->mLast.get() == this) && !mDirty) {
124e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams        return;
125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    state->mLast.set(this);
127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
1283eb28f07ab726a2e73063b95729abc191103b432Jason Sams    rsc->checkError("ProgramFragment::setupGL2 start");
1296445e5210c6d7f8689e94be9026153d017c9545bJason Sams
1306445e5210c6d7f8689e94be9026153d017c9545bJason Sams    if (!mVaryingColor &&
1316445e5210c6d7f8689e94be9026153d017c9545bJason Sams        (sc->fragUniformSlot(mConstantColorUniformIndex) >= 0)) {
1326445e5210c6d7f8689e94be9026153d017c9545bJason Sams        //LOGE("mConstantColorUniformIndex %i %i", mConstantColorUniformIndex, sc->fragUniformSlot(mConstantColorUniformIndex));
1336445e5210c6d7f8689e94be9026153d017c9545bJason Sams        glUniform4fv(sc->fragUniformSlot(mConstantColorUniformIndex), 1, mConstantColor);
1346445e5210c6d7f8689e94be9026153d017c9545bJason Sams        rsc->checkError("ProgramFragment::color setup");
1356445e5210c6d7f8689e94be9026153d017c9545bJason Sams    }
1366445e5210c6d7f8689e94be9026153d017c9545bJason Sams
1376e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    rsc->checkError("ProgramFragment::setupGL2 begin uniforms");
1386e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    setupUserConstants(sc, true);
1396e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk
140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
141c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glActiveTexture(GL_TEXTURE0 + ct);
142c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
143c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            continue;
144c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
145c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
146cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        mTextures[ct]->uploadCheck(rsc);
147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
1483eb28f07ab726a2e73063b95729abc191103b432Jason Sams        rsc->checkError("ProgramFragment::setupGL2 tex bind");
149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        if (mSamplers[ct].get()) {
150ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams            mSamplers[ct]->setupGL(rsc, mTextures[ct]->getType()->getIsNp2());
151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        } else {
152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
153c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1563eb28f07ab726a2e73063b95729abc191103b432Jason Sams            rsc->checkError("ProgramFragment::setupGL2 tex env");
157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glUniform1i(sc->fragUniformSlot(ct), ct);
1603eb28f07ab726a2e73063b95729abc191103b432Jason Sams        rsc->checkError("ProgramFragment::setupGL2 uniforms");
161c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
162c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    glActiveTexture(GL_TEXTURE0);
164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mDirty = false;
165433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    rsc->checkError("ProgramFragment::setupGL2");
166c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
167c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
168cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsvoid ProgramFragment::loadShader(Context *rsc) {
169cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams    Program::loadShader(rsc, GL_FRAGMENT_SHADER);
170c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
171c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
172c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::createShader()
173c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
174c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.setTo("precision mediump float;\n");
1750002a17db181f2276464fe5d6caaa9d869ef7e7bJason Sams    mShader.append("varying lowp vec4 varColor;\n");
176c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.append("varying vec4 varTex0;\n");
1776445e5210c6d7f8689e94be9026153d017c9545bJason Sams    mShader.append("uniform vec4 uni_Color;\n");
178c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
179f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    if (mUserShader.length() > 1) {
180f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        for (uint32_t ct=0; ct < mTextureCount; ct++) {
181f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            char buf[256];
182f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
183c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            mShader.append(buf);
184c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
1856e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk        appendUserConstants();
186f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append(mUserShader);
187f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    } else {
188f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        uint32_t mask = mTextureEnableMask;
189f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        uint32_t texNum = 0;
190f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        while (mask) {
191f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mask & 1) {
192f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                char buf[64];
193f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append("uniform sampler2D uni_Tex");
194f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                sprintf(buf, "%i", texNum);
195f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append(buf);
196f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append(";\n");
197f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            }
198f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            mask >>= 1;
199f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            texNum++;
200f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        }
201c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
202c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
203f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("void main() {\n");
2046445e5210c6d7f8689e94be9026153d017c9545bJason Sams        if (mVaryingColor) {
2050002a17db181f2276464fe5d6caaa9d869ef7e7bJason Sams            mShader.append("  lowp vec4 col = varColor;\n");
2066445e5210c6d7f8689e94be9026153d017c9545bJason Sams        } else {
2070002a17db181f2276464fe5d6caaa9d869ef7e7bJason Sams            mShader.append("  lowp vec4 col = uni_Color;\n");
2086445e5210c6d7f8689e94be9026153d017c9545bJason Sams        }
209f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams
210f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        if (mTextureEnableMask) {
211f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mPointSpriteEnable) {
212d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                mShader.append("  vec2 t0 = gl_PointCoord;\n");
213f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            } else {
214d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                mShader.append("  vec2 t0 = varTex0.xy;\n");
215c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            }
216f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        }
217f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
218f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mask = mTextureEnableMask;
219f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        texNum = 0;
220f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        while (mask) {
221f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mask & 1) {
222f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                switch(mEnvModes[texNum]) {
2237dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                case RS_TEX_ENV_MODE_NONE:
2247dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                    rsAssert(0);
2257dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                    break;
226f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                case RS_TEX_ENV_MODE_REPLACE:
227d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    switch(mTextureFormats[texNum]) {
228d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 1:
229d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.a = texture2D(uni_Tex0, t0).a;\n");
230d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
231d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 2:
232d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
233d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
234d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 3:
235d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgb = texture2D(uni_Tex0, t0).rgb;\n");
236d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
237d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 4:
238d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
239d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
240d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    }
241f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                    break;
242f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                case RS_TEX_ENV_MODE_MODULATE:
243d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    switch(mTextureFormats[texNum]) {
244d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 1:
245d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.a *= texture2D(uni_Tex0, t0).a;\n");
246d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
247d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 2:
248d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
249d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
250d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 3:
251d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgb *= texture2D(uni_Tex0, t0).rgb;\n");
252d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
253d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 4:
254d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
255d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
256d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    }
257f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                    break;
258f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                case RS_TEX_ENV_MODE_DECAL:
259d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    mShader.append("  col = texture2D(uni_Tex0, t0);\n");
260f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                    break;
261f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                }
262c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
263f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            }
264f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            mask >>= 1;
265f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            texNum++;
266c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
267c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
268f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        //mShader.append("  col.a = 1.0;\n");
269f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        //mShader.append("  col.r = 0.5;\n");
270c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
271f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("  gl_FragColor = col;\n");
272f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("}\n");
273f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    }
274c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
276c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::init(Context *rsc)
277c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
2786e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    if (mUserShader.size() > 0) {
2796e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk        for (uint32_t ct=0; ct < mConstantCount; ct++) {
2806e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk            initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
2816e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk        }
2826e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    }
2836e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk
2846e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk    createShader();
285c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
287fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid ProgramFragment::serialize(OStream *stream) const
288fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
289e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams
290fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
292fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream)
293fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
294fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return NULL;
295fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
297326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::ProgramFragmentState()
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPF = NULL;
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
302326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::~ProgramFragmentState()
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    delete mPF;
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
308771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramFragmentState::init(Context *rsc)
3098ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{
3106445e5210c6d7f8689e94be9026153d017c9545bJason Sams    uint32_t tmp[] = {
3117dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        RS_TEX_ENV_MODE_NONE, 0,
3127dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        RS_TEX_ENV_MODE_NONE, 0,
3136445e5210c6d7f8689e94be9026153d017c9545bJason Sams        0, 0
3147dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    };
3156445e5210c6d7f8689e94be9026153d017c9545bJason Sams    ProgramFragment *pf = new ProgramFragment(rsc, tmp, 6);
3168ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mDefault.set(pf);
3178ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams}
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
319f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramFragmentState::deinit(Context *rsc)
320f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
321f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mDefault.clear();
322f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mLast.clear();
323f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
324f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3297dad9c30a59c99b57269e1b498807b6f034d56e9Jason SamsRsProgramFragment rsi_ProgramFragmentCreate(Context *rsc,
3307dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                                            const uint32_t * params,
3317dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                                            uint32_t paramLength)
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3337dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
3349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    pf->incUserRef();
3355a27917966b3a5d0c978f2a096b409170b6b5d78Jason Sams    //LOGE("rsi_ProgramFragmentCreate %p", pf);
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return pf;
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
339f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsRsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
340f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                             uint32_t shaderLength, const uint32_t * params,
341f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                             uint32_t paramLength)
342f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{
343f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
344f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    pf->incUserRef();
3455a27917966b3a5d0c978f2a096b409170b6b5d78Jason Sams    //LOGE("rsi_ProgramFragmentCreate2 %p", pf);
346f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    return pf;
347f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams}
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
352