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