rsProgramFragment.cpp revision c460e55d78cbe8bee95c5c947dfe541218142a5b
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) : 30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Program(rsc, in, out) 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 43326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragment::~ProgramFragment() 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 47afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samsvoid ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 49cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams if ((state->mLast.get() == this) && !mDirty) { 50cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams return; 51cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams } 52cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams state->mLast.set(this); 53cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glActiveTexture(GL_TEXTURE0 + ct); 56334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glDisable(GL_TEXTURE_2D); 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams continue; 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glEnable(GL_TEXTURE_2D); 62afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams if (rsc->checkVersion1_1()) { 63e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy if (mPointSpriteEnable) { 64e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy glEnable(GL_POINT_SPRITE_OES); 65e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy } else { 66e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy glDisable(GL_POINT_SPRITE_OES); 67e62cc90ba67bbc21ba06145490cd3838092c3492Romain Guy } 68afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); 69afcb25c65e8145d15aaf50a0ca38333954a97000Jason Sams } 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch(mEnvModes[ct]) { 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_REPLACE: 74334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_MODULATE: 77334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_TEX_ENV_MODE_DECAL: 80334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 8439c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams if (mSamplers[ct].get()) { 8539c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams mSamplers[ct]->setupGL(); 8639c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams } else { 876678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 886678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 89334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 906678e9b2568ad041429a2477177133fe4932159fJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 9139c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams } 92334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 93334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams // Gross hack. 94334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams if (ct == 2) { 95334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 96334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 97334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 98334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 99334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); 100334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 101334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 102334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 103334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); 104334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); 105334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE); 106334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 107334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 108334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams } 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glActiveTexture(GL_TEXTURE0); 111cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = false; 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 114c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc) 115c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 116c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 frag1 %x", glGetError()); 117c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 118c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //return; 119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { 123c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glActiveTexture(GL_TEXTURE0 + ct); 124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) { 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glDisable(GL_TEXTURE_2D); 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams continue; 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); 130c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (mSamplers[ct].get()) { 131c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mSamplers[ct]->setupGL(); 132c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } else { 133c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 134c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 135c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 136c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glEnable(GL_TEXTURE_2D); 140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glUniform1i(sc->fragUniformSlot(ct), ct); 141c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 142c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 143c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glActiveTexture(GL_TEXTURE0); 144c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mDirty = false; 145c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 146c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 frag2 %x", glGetError()); 147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::loadShader() { 150c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams Program::loadShader(GL_FRAGMENT_SHADER); 151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 153c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::createShader() 154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.setTo("precision mediump float;\n"); 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("varying vec4 varColor;\n"); 157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("varying vec4 varTex0;\n"); 158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t mask = mTextureEnableMask; 160c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t texNum = 0; 161c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams while (mask) { 162c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (mask & 1) { 163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams char buf[64]; 164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("uniform sampler2D uni_Tex"); 165c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams sprintf(buf, "%i", texNum); 166c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(buf); 167c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(";\n"); 168c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 169c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mask >>= 1; 170c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams texNum++; 171c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 172c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 173c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 174c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("void main() {\n"); 175c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //mShader.append(" gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"); 176c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(" vec4 col = varColor;\n"); 177c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 178c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mask = mTextureEnableMask; 179c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams texNum = 0; 180c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams while (mask) { 181c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (mask & 1) { 182c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams switch(mEnvModes[texNum]) { 183c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams case RS_TEX_ENV_MODE_REPLACE: 184c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(" col = texture2D(uni_Tex0, varTex0.xy);\n"); 185c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams break; 186c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams case RS_TEX_ENV_MODE_MODULATE: 187c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(" col *= texture2D(uni_Tex0, varTex0.xy);\n"); 188c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams break; 189c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams case RS_TEX_ENV_MODE_DECAL: 190c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(" col = texture2D(uni_Tex0, varTex0.xy);\n"); 191c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams break; 192c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 193c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 194c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 195c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mask >>= 1; 196c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams texNum++; 197c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 198c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 199c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //mShader.append(" col.a = 1.0;\n"); 200c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //mShader.append(" col.r = 0.5;\n"); 201c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 202c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append(" gl_FragColor = col;\n"); 203c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mShader.append("}\n"); 204c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::bindTexture(uint32_t slot, Allocation *a) 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to bind a texture to a slot > MAX_TEXTURE"); 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 213334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams //LOGE("bindtex %i %p", slot, a); 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextures[slot].set(a); 215cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::bindSampler(uint32_t slot, Sampler *s) 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to bind a Sampler to a slot > MAX_TEXTURE"); 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mSamplers[slot].set(s); 226cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setType(uint32_t slot, const Element *e, uint32_t dim) 230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setType to a slot > MAX_TEXTURE"); 233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (dim >= 4) { 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setType to a dimension > 3"); 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureFormats[slot].set(e); 242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureDimensions[slot] = dim; 243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 245326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setEnvMode(uint32_t slot, RsTexEnvMode env) 246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE"); 249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 250326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mEnvModes[slot] = env; 253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 255326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ProgramFragment::setTexEnable(uint32_t slot, bool enable) 256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (slot >= MAX_TEXTURE) { 258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE"); 259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t bit = 1 << slot; 263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureEnableMask &= ~bit; 264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (enable) { 265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mTextureEnableMask |= bit; 266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 269c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramFragment::init(Context *rsc) 270c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 271c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformCount = 2; 272c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformNames[0].setTo("uni_Tex0"); 273c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mUniformNames[1].setTo("uni_Tex1"); 274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 275c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams createShader(); 276c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 278326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::ProgramFragmentState() 279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPF = NULL; 281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 283326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramFragmentState::~ProgramFragmentState() 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete mPF; 286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2898ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Samsvoid ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h) 2908ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{ 291e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams ProgramFragment *pf = new ProgramFragment(rsc, NULL, NULL, false); 2928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pf); 293c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams pf->init(rsc); 2948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 296f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramFragmentState::deinit(Context *rsc) 297f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 298f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 299f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 300f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 301f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 303326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 304326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 306e0158410a2fedef43f5a2848c28393ad611e8cadJason Samsvoid rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out, bool pointSpriteEnable) 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete rsc->mStateFragment.mPF; 309e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsc->mStateFragment.mPF = new ProgramFragment(rsc, (Element *)in, (Element *)out, pointSpriteEnable); 310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a) 313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams pf->bindTexture(slot, static_cast<Allocation *>(a)); 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ProgramFragmentBindSampler(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsSampler s) 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams pf->bindSampler(slot, static_cast<Sampler *>(s)); 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 324e0158410a2fedef43f5a2848c28393ad611e8cadJason Samsvoid rsi_ProgramFragmentSetSlot(Context *rsc, uint32_t slot, bool enable, RsTexEnvMode env, RsType vt) 325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const Type *t = static_cast<const Type *>(vt); 327e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t) { 328e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams uint32_t dim = 1; 329e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t->getDimY()) { 330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams dim ++; 331e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams if (t->getDimZ()) { 332e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams dim ++; 333e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams } 334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 335e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim); 336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF->setEnvMode(slot, env); 338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF->setTexEnable(slot, enable); 339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 341326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsProgramFragment rsi_ProgramFragmentCreate(Context *rsc) 342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ProgramFragment *pf = rsc->mStateFragment.mPF; 3449397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams pf->incUserRef(); 345c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams pf->init(rsc); 346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateFragment.mPF = 0; 347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return pf; 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 354