rsProgramFragment.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
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__;
417dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    rsAssert(paramLength = 5);
427dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams
437dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mEnvModes[0] = (RsTexEnvMode)params[0];
447dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mTextureFormats[0] = params[1];
457dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mEnvModes[1] = (RsTexEnvMode)params[2];
467dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mTextureFormats[1] = params[3];
477dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    mPointSpriteEnable = params[4] != 0;
487dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureEnableMask = 0;
507dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    if (mEnvModes[0]) {
517dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        mTextureEnableMask |= 1;
527dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    }
537dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    if (mEnvModes[1]) {
547dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        mTextureEnableMask |= 2;
557dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    }
567dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    init(rsc);
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
60f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                                 uint32_t shaderLength, const uint32_t * params,
61f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                                 uint32_t paramLength) :
62f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    Program(rsc, shaderText, shaderLength, params, paramLength)
63f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{
64f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mAllocFile = __FILE__;
65f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mAllocLine = __LINE__;
66f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
67f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    init(rsc);
68f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    mTextureEnableMask = (1 << mTextureCount) -1;
69f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams}
70f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
71f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
72326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragment::~ProgramFragment()
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
76afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samsvoid ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state)
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
78cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    if ((state->mLast.get() == this) && !mDirty) {
79cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams        return;
80cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    }
81cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    state->mLast.set(this);
82cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glActiveTexture(GL_TEXTURE0 + ct);
85334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams        if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            glDisable(GL_TEXTURE_2D);
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            continue;
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glEnable(GL_TEXTURE_2D);
91afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        if (rsc->checkVersion1_1()) {
92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST // These are GLES only
93e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy            if (mPointSpriteEnable) {
94e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy                glEnable(GL_POINT_SPRITE_OES);
95e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy            } else {
96e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy                glDisable(GL_POINT_SPRITE_OES);
97e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy            }
98afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams            glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST
100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
101afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams        }
102cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        mTextures[ct]->uploadCheck(rsc);
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        switch(mEnvModes[ct]) {
1067dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        case RS_TEX_ENV_MODE_NONE:
1077dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams            rsAssert(0);
1087dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams            break;
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case RS_TEX_ENV_MODE_REPLACE:
110334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            break;
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case RS_TEX_ENV_MODE_MODULATE:
113334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            break;
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case RS_TEX_ENV_MODE_DECAL:
116334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            break;
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
12039c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        if (mSamplers[ct].get()) {
121ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams            mSamplers[ct]->setupGL(rsc, mTextures[ct]->getType()->getIsNp2());
12239c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        } else {
1236678e9b2568ad041429a2477177133fe4932159fJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1246678e9b2568ad041429a2477177133fe4932159fJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
125334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1266678e9b2568ad041429a2477177133fe4932159fJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
12739c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        }
128334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams
129334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams        // Gross hack.
130334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams        if (ct == 2) {
131334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
132334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams
133334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
134334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
135334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
136334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
137334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
138334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams
139334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);
140334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
141334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
142334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
143334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
144334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams        }
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glActiveTexture(GL_TEXTURE0);
147cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    mDirty = false;
148433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    rsc->checkError("ProgramFragment::setupGL");
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc)
152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
1533eb28f07ab726a2e73063b95729abc191103b432Jason Sams
154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    //LOGE("sgl2 frag1 %x", glGetError());
155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    if ((state->mLast.get() == this) && !mDirty) {
156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        //return;
157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    state->mLast.set(this);
159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
1603eb28f07ab726a2e73063b95729abc191103b432Jason Sams    rsc->checkError("ProgramFragment::setupGL2 start");
161c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
162c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glActiveTexture(GL_TEXTURE0 + ct);
163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            continue;
165c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
166c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
167cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        mTextures[ct]->uploadCheck(rsc);
168c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
1693eb28f07ab726a2e73063b95729abc191103b432Jason Sams        rsc->checkError("ProgramFragment::setupGL2 tex bind");
170c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        if (mSamplers[ct].get()) {
171ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams            mSamplers[ct]->setupGL(rsc, mTextures[ct]->getType()->getIsNp2());
172c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        } else {
173c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
174c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
175c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
176c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1773eb28f07ab726a2e73063b95729abc191103b432Jason Sams            rsc->checkError("ProgramFragment::setupGL2 tex env");
178c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
179c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
180c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glUniform1i(sc->fragUniformSlot(ct), ct);
1813eb28f07ab726a2e73063b95729abc191103b432Jason Sams        rsc->checkError("ProgramFragment::setupGL2 uniforms");
182c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
183c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
184c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    glActiveTexture(GL_TEXTURE0);
185c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mDirty = false;
186433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    rsc->checkError("ProgramFragment::setupGL2");
187c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
188c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
189cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsvoid ProgramFragment::loadShader(Context *rsc) {
190cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams    Program::loadShader(rsc, GL_FRAGMENT_SHADER);
191c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
192c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
193c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::createShader()
194c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
195c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.setTo("precision mediump float;\n");
196c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.append("varying vec4 varColor;\n");
197c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.append("varying vec4 varTex0;\n");
198c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
199f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    if (mUserShader.length() > 1) {
200f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        for (uint32_t ct=0; ct < mTextureCount; ct++) {
201f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            char buf[256];
202f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
203c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            mShader.append(buf);
204c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
205c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
206f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append(mUserShader);
207f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    } else {
208f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        uint32_t mask = mTextureEnableMask;
209f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        uint32_t texNum = 0;
210f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        while (mask) {
211f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mask & 1) {
212f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                char buf[64];
213f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append("uniform sampler2D uni_Tex");
214f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                sprintf(buf, "%i", texNum);
215f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append(buf);
216f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                mShader.append(";\n");
217f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            }
218f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            mask >>= 1;
219f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            texNum++;
220f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        }
221c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
222c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
223f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("void main() {\n");
224f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("  vec4 col = varColor;\n");
225f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams
226f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        if (mTextureEnableMask) {
227f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mPointSpriteEnable) {
228d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                mShader.append("  vec2 t0 = gl_PointCoord;\n");
229f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            } else {
230d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                mShader.append("  vec2 t0 = varTex0.xy;\n");
231c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            }
232f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        }
233f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams
234f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mask = mTextureEnableMask;
235f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        texNum = 0;
236f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        while (mask) {
237f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            if (mask & 1) {
238f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                switch(mEnvModes[texNum]) {
2397dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                case RS_TEX_ENV_MODE_NONE:
2407dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                    rsAssert(0);
2417dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                    break;
242f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                case RS_TEX_ENV_MODE_REPLACE:
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_MODULATE:
259d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    switch(mTextureFormats[texNum]) {
260d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 1:
261d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.a *= texture2D(uni_Tex0, t0).a;\n");
262d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
263d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 2:
264d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
265d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
266d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 3:
267d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgb *= texture2D(uni_Tex0, t0).rgb;\n");
268d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
269d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    case 4:
270d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        mShader.append("  col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
271d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                        break;
272d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    }
273f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                    break;
274f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                case RS_TEX_ENV_MODE_DECAL:
275d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                    mShader.append("  col = texture2D(uni_Tex0, t0);\n");
276f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                    break;
277f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                }
278c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
279f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            }
280f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            mask >>= 1;
281f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams            texNum++;
282c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
283c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
284f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        //mShader.append("  col.a = 1.0;\n");
285f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        //mShader.append("  col.r = 0.5;\n");
286c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
287f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("  gl_FragColor = col;\n");
288f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams        mShader.append("}\n");
289f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    }
290c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
292c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::init(Context *rsc)
293c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
294c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformCount = 2;
295c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformNames[0].setTo("uni_Tex0");
296c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformNames[1].setTo("uni_Tex1");
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
298c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    createShader();
299c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
301fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid ProgramFragment::serialize(OStream *stream) const
302fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
303fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
305fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
306fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream)
307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
308fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return NULL;
309fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
310fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
311326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::ProgramFragmentState()
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPF = NULL;
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
316326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::~ProgramFragmentState()
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    delete mPF;
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
322771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramFragmentState::init(Context *rsc)
3238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{
3247dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    uint32_t tmp[5] = {
3257dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        RS_TEX_ENV_MODE_NONE, 0,
3267dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        RS_TEX_ENV_MODE_NONE, 0,
3277dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams        0
3287dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    };
3297dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    ProgramFragment *pf = new ProgramFragment(rsc, tmp, 5);
3308ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mDefault.set(pf);
331c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    pf->init(rsc);
3328ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams}
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
334f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramFragmentState::deinit(Context *rsc)
335f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
336f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mDefault.clear();
337f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mLast.clear();
338f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
339f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3447dad9c30a59c99b57269e1b498807b6f034d56e9Jason SamsRsProgramFragment rsi_ProgramFragmentCreate(Context *rsc,
3457dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                                            const uint32_t * params,
3467dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams                                            uint32_t paramLength)
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3487dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams    ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
3499397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    pf->incUserRef();
3505a27917966b3a5d0c978f2a096b409170b6b5d78Jason Sams    //LOGE("rsi_ProgramFragmentCreate %p", pf);
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return pf;
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
354f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsRsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
355f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                             uint32_t shaderLength, const uint32_t * params,
356f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams                             uint32_t paramLength)
357f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{
358f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
359f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    pf->incUserRef();
3605a27917966b3a5d0c978f2a096b409170b6b5d78Jason Sams    //LOGE("rsi_ProgramFragmentCreate2 %p", pf);
361f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams    return pf;
362f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams}
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
367