blob: ec9c569fcadd8680011251704108f2159653bcbd [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -070017#ifndef ANDROID_RS_BUILD_FOR_HOST
Jason Samsd19f10d2009-05-22 14:03:28 -070018#include "rsContext.h"
Jason Sams4b962e52009-06-22 17:15:15 -070019#include <GLES/gl.h>
20#include <GLES/glext.h>
Jason Samsbb51c402009-11-25 13:22:07 -080021#include <GLES2/gl2.h>
22#include <GLES2/gl2ext.h>
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -070023#else
24#include "rsContextHostStub.h"
25#include <OpenGL/gl.h>
26#include <OpenGL/glext.h>
27#endif //ANDROID_RS_BUILD_FOR_HOST
28
29#include "rsProgramFragment.h"
Jason Sams4b962e52009-06-22 17:15:15 -070030
Jason Samsd19f10d2009-05-22 14:03:28 -070031using namespace android;
32using namespace android::renderscript;
33
34
Jason Sams68afd012009-12-17 16:55:08 -080035ProgramFragment::ProgramFragment(Context *rsc, const uint32_t * params,
36 uint32_t paramLength) :
Jason Sams0011bcf2009-12-15 12:58:36 -080037 Program(rsc)
Jason Samsd19f10d2009-05-22 14:03:28 -070038{
Jason Sams61f08d62009-09-25 16:37:33 -070039 mAllocFile = __FILE__;
40 mAllocLine = __LINE__;
Jason Sams442a6472010-08-04 17:50:20 -070041 rsAssert(paramLength == 6);
42
43 mConstantColor[0] = 1.f;
44 mConstantColor[1] = 1.f;
45 mConstantColor[2] = 1.f;
46 mConstantColor[3] = 1.f;
Jason Sams68afd012009-12-17 16:55:08 -080047
48 mEnvModes[0] = (RsTexEnvMode)params[0];
49 mTextureFormats[0] = params[1];
50 mEnvModes[1] = (RsTexEnvMode)params[2];
51 mTextureFormats[1] = params[3];
52 mPointSpriteEnable = params[4] != 0;
Jason Sams442a6472010-08-04 17:50:20 -070053 mVaryingColor = false;
54 if (paramLength > 5)
55 mVaryingColor = params[5] != 0;
Jason Sams68afd012009-12-17 16:55:08 -080056
Jason Samsd19f10d2009-05-22 14:03:28 -070057 mTextureEnableMask = 0;
Jason Sams68afd012009-12-17 16:55:08 -080058 if (mEnvModes[0]) {
59 mTextureEnableMask |= 1;
60 }
61 if (mEnvModes[1]) {
62 mTextureEnableMask |= 2;
63 }
Jason Sams442a6472010-08-04 17:50:20 -070064
65 mUniformCount = 0;
66 mUniformNames[mUniformCount++].setTo("uni_Tex0");
67 mUniformNames[mUniformCount++].setTo("uni_Tex1");
68
69 mConstantColorUniformIndex = -1;
70 //if (!mVaryingColor) {
71 mConstantColorUniformIndex = mUniformCount;
72 mUniformNames[mUniformCount++].setTo("uni_Color");
73 //}
Alex Sakhartchouk8442e0b2010-08-31 12:02:01 -070074 init(rsc);
Jason Samsd19f10d2009-05-22 14:03:28 -070075}
76
Jason Sams7e5ab3b2009-12-15 13:27:04 -080077ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
78 uint32_t shaderLength, const uint32_t * params,
79 uint32_t paramLength) :
80 Program(rsc, shaderText, shaderLength, params, paramLength)
81{
82 mAllocFile = __FILE__;
83 mAllocLine = __LINE__;
84
Jason Sams442a6472010-08-04 17:50:20 -070085 mConstantColor[0] = 1.f;
86 mConstantColor[1] = 1.f;
87 mConstantColor[2] = 1.f;
88 mConstantColor[3] = 1.f;
89
90 LOGE("Custom FP");
91
92 mUniformCount = 2;
93 mUniformNames[0].setTo("uni_Tex0");
94 mUniformNames[1].setTo("uni_Tex1");
95
Jason Sams7e5ab3b2009-12-15 13:27:04 -080096 mTextureEnableMask = (1 << mTextureCount) -1;
Alex Sakhartchouk8442e0b2010-08-31 12:02:01 -070097
98 init(rsc);
Jason Sams7e5ab3b2009-12-15 13:27:04 -080099}
100
101
Jason Samsd19f10d2009-05-22 14:03:28 -0700102ProgramFragment::~ProgramFragment()
103{
104}
105
Jason Sams442a6472010-08-04 17:50:20 -0700106void ProgramFragment::setConstantColor(float r, float g, float b, float a)
107{
108 mConstantColor[0] = r;
109 mConstantColor[1] = g;
110 mConstantColor[2] = b;
111 mConstantColor[3] = a;
112 mDirty = true;
113}
114
Jason Samsb13ada52009-08-25 11:34:49 -0700115void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state)
Jason Samsd19f10d2009-05-22 14:03:28 -0700116{
Jason Samsd19f10d2009-05-22 14:03:28 -0700117}
118
Jason Samsbb51c402009-11-25 13:22:07 -0800119void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc)
120{
Jason Sams5dbfe932010-01-27 14:41:43 -0800121
Jason Samsbb51c402009-11-25 13:22:07 -0800122 //LOGE("sgl2 frag1 %x", glGetError());
123 if ((state->mLast.get() == this) && !mDirty) {
Jason Sams7c1f4c32010-06-22 17:22:13 -0700124 return;
Jason Samsbb51c402009-11-25 13:22:07 -0800125 }
126 state->mLast.set(this);
127
Jason Sams5dbfe932010-01-27 14:41:43 -0800128 rsc->checkError("ProgramFragment::setupGL2 start");
Jason Sams442a6472010-08-04 17:50:20 -0700129
130 if (!mVaryingColor &&
131 (sc->fragUniformSlot(mConstantColorUniformIndex) >= 0)) {
132 //LOGE("mConstantColorUniformIndex %i %i", mConstantColorUniformIndex, sc->fragUniformSlot(mConstantColorUniformIndex));
133 glUniform4fv(sc->fragUniformSlot(mConstantColorUniformIndex), 1, mConstantColor);
134 rsc->checkError("ProgramFragment::color setup");
135 }
136
Alex Sakhartchouk8442e0b2010-08-31 12:02:01 -0700137 rsc->checkError("ProgramFragment::setupGL2 begin uniforms");
138 setupUserConstants(sc, true);
139
Jason Samsbb51c402009-11-25 13:22:07 -0800140 for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
141 glActiveTexture(GL_TEXTURE0 + ct);
142 if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
Jason Samsbb51c402009-11-25 13:22:07 -0800143 continue;
144 }
145
Jason Sams3b7d39b2009-12-14 12:57:40 -0800146 mTextures[ct]->uploadCheck(rsc);
Jason Samsbb51c402009-11-25 13:22:07 -0800147 glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
Jason Sams5dbfe932010-01-27 14:41:43 -0800148 rsc->checkError("ProgramFragment::setupGL2 tex bind");
Jason Samsbb51c402009-11-25 13:22:07 -0800149 if (mSamplers[ct].get()) {
Jason Sams2978bfc2010-02-22 15:37:51 -0800150 mSamplers[ct]->setupGL(rsc, mTextures[ct]->getType()->getIsNp2());
Jason Samsbb51c402009-11-25 13:22:07 -0800151 } else {
152 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
153 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
154 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Jason Sams5dbfe932010-01-27 14:41:43 -0800156 rsc->checkError("ProgramFragment::setupGL2 tex env");
Jason Samsbb51c402009-11-25 13:22:07 -0800157 }
158
Jason Samsbb51c402009-11-25 13:22:07 -0800159 glUniform1i(sc->fragUniformSlot(ct), ct);
Jason Sams5dbfe932010-01-27 14:41:43 -0800160 rsc->checkError("ProgramFragment::setupGL2 uniforms");
Jason Samsbb51c402009-11-25 13:22:07 -0800161 }
162
163 glActiveTexture(GL_TEXTURE0);
164 mDirty = false;
Jason Samsa09a6e12010-01-06 11:57:52 -0800165 rsc->checkError("ProgramFragment::setupGL2");
Jason Samsbb51c402009-11-25 13:22:07 -0800166}
167
Jason Sams5dad8b42009-12-15 19:10:11 -0800168void ProgramFragment::loadShader(Context *rsc) {
169 Program::loadShader(rsc, GL_FRAGMENT_SHADER);
Jason Samsbb51c402009-11-25 13:22:07 -0800170}
171
172void ProgramFragment::createShader()
173{
174 mShader.setTo("precision mediump float;\n");
Jason Sams1911c602010-08-05 17:38:29 -0700175 mShader.append("varying lowp vec4 varColor;\n");
Jason Samsbb51c402009-11-25 13:22:07 -0800176 mShader.append("varying vec4 varTex0;\n");
Jason Sams442a6472010-08-04 17:50:20 -0700177 mShader.append("uniform vec4 uni_Color;\n");
Jason Samsbb51c402009-11-25 13:22:07 -0800178
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800179 if (mUserShader.length() > 1) {
180 for (uint32_t ct=0; ct < mTextureCount; ct++) {
181 char buf[256];
182 sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
Jason Samsbb51c402009-11-25 13:22:07 -0800183 mShader.append(buf);
Jason Samsbb51c402009-11-25 13:22:07 -0800184 }
Alex Sakhartchouk8442e0b2010-08-31 12:02:01 -0700185 appendUserConstants();
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800186 mShader.append(mUserShader);
187 } else {
188 uint32_t mask = mTextureEnableMask;
189 uint32_t texNum = 0;
190 while (mask) {
191 if (mask & 1) {
192 char buf[64];
193 mShader.append("uniform sampler2D uni_Tex");
194 sprintf(buf, "%i", texNum);
195 mShader.append(buf);
196 mShader.append(";\n");
Jason Samsbb51c402009-11-25 13:22:07 -0800197 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800198 mask >>= 1;
199 texNum++;
Jason Samsbb51c402009-11-25 13:22:07 -0800200 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800201
202
203 mShader.append("void main() {\n");
Jason Sams442a6472010-08-04 17:50:20 -0700204 if (mVaryingColor) {
Jason Sams1911c602010-08-05 17:38:29 -0700205 mShader.append(" lowp vec4 col = varColor;\n");
Jason Sams442a6472010-08-04 17:50:20 -0700206 } else {
Jason Sams1911c602010-08-05 17:38:29 -0700207 mShader.append(" lowp vec4 col = uni_Color;\n");
Jason Sams442a6472010-08-04 17:50:20 -0700208 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800209
210 if (mTextureEnableMask) {
211 if (mPointSpriteEnable) {
Jason Sams718cd1f2009-12-23 14:35:29 -0800212 mShader.append(" vec2 t0 = gl_PointCoord;\n");
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800213 } else {
Jason Sams718cd1f2009-12-23 14:35:29 -0800214 mShader.append(" vec2 t0 = varTex0.xy;\n");
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800215 }
216 }
217
218 mask = mTextureEnableMask;
219 texNum = 0;
220 while (mask) {
221 if (mask & 1) {
222 switch(mEnvModes[texNum]) {
Jason Sams68afd012009-12-17 16:55:08 -0800223 case RS_TEX_ENV_MODE_NONE:
224 rsAssert(0);
225 break;
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800226 case RS_TEX_ENV_MODE_REPLACE:
Jason Sams718cd1f2009-12-23 14:35:29 -0800227 switch(mTextureFormats[texNum]) {
228 case 1:
229 mShader.append(" col.a = texture2D(uni_Tex0, t0).a;\n");
230 break;
231 case 2:
232 mShader.append(" col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
233 break;
234 case 3:
235 mShader.append(" col.rgb = texture2D(uni_Tex0, t0).rgb;\n");
236 break;
237 case 4:
238 mShader.append(" col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
239 break;
240 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800241 break;
242 case RS_TEX_ENV_MODE_MODULATE:
Jason Sams718cd1f2009-12-23 14:35:29 -0800243 switch(mTextureFormats[texNum]) {
244 case 1:
245 mShader.append(" col.a *= texture2D(uni_Tex0, t0).a;\n");
246 break;
247 case 2:
248 mShader.append(" col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
249 break;
250 case 3:
251 mShader.append(" col.rgb *= texture2D(uni_Tex0, t0).rgb;\n");
252 break;
253 case 4:
254 mShader.append(" col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
255 break;
256 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800257 break;
258 case RS_TEX_ENV_MODE_DECAL:
Jason Sams718cd1f2009-12-23 14:35:29 -0800259 mShader.append(" col = texture2D(uni_Tex0, t0);\n");
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800260 break;
261 }
262
263 }
264 mask >>= 1;
265 texNum++;
266 }
267
268 //mShader.append(" col.a = 1.0;\n");
269 //mShader.append(" col.r = 0.5;\n");
270
271 mShader.append(" gl_FragColor = col;\n");
272 mShader.append("}\n");
Jason Samsbb51c402009-11-25 13:22:07 -0800273 }
Jason Samsbb51c402009-11-25 13:22:07 -0800274}
Jason Samsd19f10d2009-05-22 14:03:28 -0700275
Jason Samsbb51c402009-11-25 13:22:07 -0800276void ProgramFragment::init(Context *rsc)
277{
Alex Sakhartchouk8442e0b2010-08-31 12:02:01 -0700278 if (mUserShader.size() > 0) {
279 for (uint32_t ct=0; ct < mConstantCount; ct++) {
280 initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
281 }
282 }
283
284 createShader();
Jason Samsbb51c402009-11-25 13:22:07 -0800285}
Jason Samsd19f10d2009-05-22 14:03:28 -0700286
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700287void ProgramFragment::serialize(OStream *stream) const
288{
Jason Sams7c1f4c32010-06-22 17:22:13 -0700289
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700290}
291
292ProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream)
293{
294 return NULL;
295}
296
Jason Samsd19f10d2009-05-22 14:03:28 -0700297ProgramFragmentState::ProgramFragmentState()
298{
299 mPF = NULL;
300}
301
302ProgramFragmentState::~ProgramFragmentState()
303{
304 delete mPF;
305
306}
307
Jason Samsf603d212010-05-14 15:30:29 -0700308void ProgramFragmentState::init(Context *rsc)
Jason Sams9c54bdb2009-06-17 16:52:59 -0700309{
Jason Sams442a6472010-08-04 17:50:20 -0700310 uint32_t tmp[] = {
Jason Sams68afd012009-12-17 16:55:08 -0800311 RS_TEX_ENV_MODE_NONE, 0,
312 RS_TEX_ENV_MODE_NONE, 0,
Jason Sams442a6472010-08-04 17:50:20 -0700313 0, 0
Jason Sams68afd012009-12-17 16:55:08 -0800314 };
Jason Sams442a6472010-08-04 17:50:20 -0700315 ProgramFragment *pf = new ProgramFragment(rsc, tmp, 6);
Jason Sams9c54bdb2009-06-17 16:52:59 -0700316 mDefault.set(pf);
317}
Jason Samsd19f10d2009-05-22 14:03:28 -0700318
Jason Sams61f08d62009-09-25 16:37:33 -0700319void ProgramFragmentState::deinit(Context *rsc)
320{
321 mDefault.clear();
322 mLast.clear();
323}
324
Jason Samsd19f10d2009-05-22 14:03:28 -0700325
326namespace android {
327namespace renderscript {
328
Jason Sams68afd012009-12-17 16:55:08 -0800329RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc,
330 const uint32_t * params,
331 uint32_t paramLength)
Jason Samsd19f10d2009-05-22 14:03:28 -0700332{
Jason Sams68afd012009-12-17 16:55:08 -0800333 ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
Jason Sams07ae4062009-08-27 20:23:34 -0700334 pf->incUserRef();
Jason Samsc378dab2010-05-17 17:28:12 -0700335 //LOGE("rsi_ProgramFragmentCreate %p", pf);
Jason Samsd19f10d2009-05-22 14:03:28 -0700336 return pf;
337}
338
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800339RsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
340 uint32_t shaderLength, const uint32_t * params,
341 uint32_t paramLength)
342{
343 ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
344 pf->incUserRef();
Jason Samsc378dab2010-05-17 17:28:12 -0700345 //LOGE("rsi_ProgramFragmentCreate2 %p", pf);
Jason Sams7e5ab3b2009-12-15 13:27:04 -0800346 return pf;
347}
Jason Samsd19f10d2009-05-22 14:03:28 -0700348
349}
350}
351