rsProgramFragment.cpp revision f2e4fa215c420cf0f8d226e9a59acb1f312e5e40
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 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsProgramFragment.h" 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h> 211aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h> 22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h> 23c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2ext.h> 241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsProgramFragment::ProgramFragment(Context *rsc, Element *in, Element *out, bool pointSpriteEnable) : 304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Program(rsc) 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 32f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 33f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mEnvModes[ct] = RS_TEX_ENV_MODE_REPLACE; 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureDimensions[ct] = 2; 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureEnableMask = 0; 39e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams mPointSpriteEnable = pointSpriteEnable; 40334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams mEnvModes[1] = RS_TEX_ENV_MODE_DECAL; 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, 44f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t shaderLength, const uint32_t * params, 45f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t paramLength) : 46f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams Program(rsc, shaderText, shaderLength, params, paramLength) 47f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{ 48f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mAllocFile = __FILE__; 49f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mAllocLine = __LINE__; 50f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams 51f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams init(rsc); 52f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mTextureEnableMask = (1 << mTextureCount) -1; 53f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams} 54f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams 55f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams 56326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragment::~ProgramFragment() 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 60afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samsvoid ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 62cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams if ((state->mLast.get() == this) && !mDirty) { 63cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams return; 64cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams } 65cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams state->mLast.set(this); 66cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glActiveTexture(GL_TEXTURE0 + ct); 69334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glDisable(GL_TEXTURE_2D); 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams continue; 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glEnable(GL_TEXTURE_2D); 75afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams if (rsc->checkVersion1_1()) { 76e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy if (mPointSpriteEnable) { 77e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy glEnable(GL_POINT_SPRITE_OES); 78e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy } else { 79e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy glDisable(GL_POINT_SPRITE_OES); 80e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy } 81afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); 82afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams } 83cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mTextures[ct]->uploadCheck(rsc); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch(mEnvModes[ct]) { 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_REPLACE: 88334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_MODULATE: 91334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_DECAL: 94334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 9839c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams if (mSamplers[ct].get()) { 9939c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams mSamplers[ct]->setupGL(); 10039c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams } else { 1016678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1026678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 103334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1046678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 10539c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams } 106334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 107334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams // Gross hack. 108334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams if (ct == 2) { 109334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 110334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 111334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 112334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 113334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); 114334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 115334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 116334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 117334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); 118334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); 119334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE); 120334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 121334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 122334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams } 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glActiveTexture(GL_TEXTURE0); 125cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = false; 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc) 129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 130c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 frag1 %x", glGetError()); 131c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 132c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //return; 133c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 134c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 135c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 136c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { 137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glActiveTexture(GL_TEXTURE0 + ct); 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glDisable(GL_TEXTURE_2D); 140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams continue; 141c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 142c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 143cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mTextures[ct]->uploadCheck(rsc); 144c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); 145c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (mSamplers[ct].get()) { 146c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mSamplers[ct]->setupGL(); 147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } else { 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 150c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 153c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glEnable(GL_TEXTURE_2D); 155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glUniform1i(sc->fragUniformSlot(ct), ct); 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glActiveTexture(GL_TEXTURE0); 159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mDirty = false; 160c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 161c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 frag2 %x", glGetError()); 162c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::loadShader() { 165c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams Program::loadShader(GL_FRAGMENT_SHADER); 166c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 167c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 168c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::createShader() 169c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 170c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.setTo("precision mediump float;\n"); 171c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("varying vec4 varColor;\n"); 172c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("varying vec4 varTex0;\n"); 173c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 174f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams if (mUserShader.length() > 1) { 175f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams for (uint32_t ct=0; ct < mTextureCount; ct++) { 176f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams char buf[256]; 177f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct); 178c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(buf); 179c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 180c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 181f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(mUserShader); 182f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } else { 183f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t mask = mTextureEnableMask; 184f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t texNum = 0; 185f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams while (mask) { 186f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams if (mask & 1) { 187f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams char buf[64]; 188f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append("uniform sampler2D uni_Tex"); 189f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams sprintf(buf, "%i", texNum); 190f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(buf); 191f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(";\n"); 192f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 193f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mask >>= 1; 194f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams texNum++; 195f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 196c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 197c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 198f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append("void main() {\n"); 199f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" vec4 col = varColor;\n"); 200f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams 201f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams if (mTextureEnableMask) { 202f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams if (mPointSpriteEnable) { 203f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" vec2 tex0 = gl_PointCoord;\n"); 204f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } else { 205f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" vec2 tex0 = varTex0.xy;\n"); 206c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 207f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 208f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams 209f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mask = mTextureEnableMask; 210f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams texNum = 0; 211f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams while (mask) { 212f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams if (mask & 1) { 213f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams switch(mEnvModes[texNum]) { 214f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams case RS_TEX_ENV_MODE_REPLACE: 215f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" col = texture2D(uni_Tex0, tex0);\n"); 216f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams break; 217f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams case RS_TEX_ENV_MODE_MODULATE: 218f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" col *= texture2D(uni_Tex0, tex0);\n"); 219f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams break; 220f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams case RS_TEX_ENV_MODE_DECAL: 221f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" col = texture2D(uni_Tex0, tex0);\n"); 222f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams break; 223f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 224c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 225f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 226f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mask >>= 1; 227f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams texNum++; 228c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 229c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 230f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams //mShader.append(" col.a = 1.0;\n"); 231f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams //mShader.append(" col.r = 0.5;\n"); 232c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 233f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append(" gl_FragColor = col;\n"); 234f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams mShader.append("}\n"); 235f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams } 236c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::bindTexture(uint32_t slot, Allocation *a) 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to bind a texture to a slot > MAX_TEXTURE"); 242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 245334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams //LOGE("bindtex %i %p", slot, a); 246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextures[slot].set(a); 247cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 250326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::bindSampler(uint32_t slot, Sampler *s) 251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to bind a Sampler to a slot > MAX_TEXTURE"); 254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 255326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mSamplers[slot].set(s); 258cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 261326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setType(uint32_t slot, const Element *e, uint32_t dim) 262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setType to a slot > MAX_TEXTURE"); 265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (dim >= 4) { 269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setType to a dimension > 3"); 270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 271326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureFormats[slot].set(e); 274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureDimensions[slot] = dim; 275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setEnvMode(uint32_t slot, RsTexEnvMode env) 278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE"); 281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mEnvModes[slot] = env; 285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 287326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setTexEnable(uint32_t slot, bool enable) 288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE"); 291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t bit = 1 << slot; 295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureEnableMask &= ~bit; 296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (enable) { 297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureEnableMask |= bit; 298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 301c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::init(Context *rsc) 302c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 303c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformCount = 2; 304c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformNames[0].setTo("uni_Tex0"); 305c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformNames[1].setTo("uni_Tex1"); 306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 307c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams createShader(); 308c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 310326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::ProgramFragmentState() 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPF = NULL; 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 315326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::~ProgramFragmentState() 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete mPF; 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3218ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Samsvoid ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h) 3228ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{ 323e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams ProgramFragment *pf = new ProgramFragment(rsc, NULL, NULL, false); 3248ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pf); 325c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams pf->init(rsc); 3268ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 328f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramFragmentState::deinit(Context *rsc) 329f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 330f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 331f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 332f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 333f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 335326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 336326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 338e0158410a2fedef43f5a2848c28393ad611e8cadJason Samsvoid rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out, bool pointSpriteEnable) 339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete rsc->mStateFragment.mPF; 341e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsc->mStateFragment.mPF = new ProgramFragment(rsc, (Element *)in, (Element *)out, pointSpriteEnable); 342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 344326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a) 345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams pf->bindTexture(slot, static_cast<Allocation *>(a)); 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ProgramFragmentBindSampler(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsSampler s) 351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams pf->bindSampler(slot, static_cast<Sampler *>(s)); 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 356e0158410a2fedef43f5a2848c28393ad611e8cadJason Samsvoid rsi_ProgramFragmentSetSlot(Context *rsc, uint32_t slot, bool enable, RsTexEnvMode env, RsType vt) 357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const Type *t = static_cast<const Type *>(vt); 359e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t) { 360e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams uint32_t dim = 1; 361e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t->getDimY()) { 362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams dim ++; 363e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t->getDimZ()) { 364e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams dim ++; 365e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams } 366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 367e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim); 368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF->setEnvMode(slot, env); 370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF->setTexEnable(slot, enable); 371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 373f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Samsvoid rsi_ProgramFragmentSetShader(Context *rsc, const char *txt, uint32_t len) 374f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams{ 375f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams rsc->mStateFragment.mPF->setShader(txt, len); 376f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams} 377f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams 378326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsProgramFragment rsi_ProgramFragmentCreate(Context *rsc) 379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = rsc->mStateFragment.mPF; 3819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams pf->incUserRef(); 382c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams pf->init(rsc); 383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF = 0; 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return pf; 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 387f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsRsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText, 388f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t shaderLength, const uint32_t * params, 389f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t paramLength) 390f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams{ 391f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength); 392f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams pf->incUserRef(); 393f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams return pf; 394f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams} 395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 398326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 399