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