blob: 8a2157f3c0b21196caee62ea712b1334a0f8036e [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
17#include "rsContext.h"
18#include "rsProgramFragmentStore.h"
19
Jason Sams4b962e52009-06-22 17:15:15 -070020#include <GLES/gl.h>
21#include <GLES/glext.h>
22
Jason Samsd19f10d2009-05-22 14:03:28 -070023using namespace android;
24using namespace android::renderscript;
25
26
Jason Sams0011bcf2009-12-15 12:58:36 -080027ProgramFragmentStore::ProgramFragmentStore(Context *rsc) :
28 Program(rsc)
Jason Samsd19f10d2009-05-22 14:03:28 -070029{
Jason Sams61f08d62009-09-25 16:37:33 -070030 mAllocFile = __FILE__;
31 mAllocLine = __LINE__;
Jason Samsd19f10d2009-05-22 14:03:28 -070032 mDitherEnable = true;
33 mBlendEnable = false;
34 mColorRWriteEnable = true;
35 mColorGWriteEnable = true;
36 mColorBWriteEnable = true;
37 mColorAWriteEnable = true;
38 mBlendSrc = GL_ONE;
39 mBlendDst = GL_ZERO;
40
41
42 mDepthTestEnable = false;
43 mDepthWriteEnable = true;
44 mDepthFunc = GL_LESS;
45
46
47}
48
49ProgramFragmentStore::~ProgramFragmentStore()
50{
51}
52
Jason Samsb13ada52009-08-25 11:34:49 -070053void ProgramFragmentStore::setupGL(const Context *rsc, ProgramFragmentStoreState *state)
Jason Samsd19f10d2009-05-22 14:03:28 -070054{
Jason Sams9bee51c2009-08-05 13:57:03 -070055 if (state->mLast.get() == this) {
56 return;
57 }
58 state->mLast.set(this);
59
Jason Samsd19f10d2009-05-22 14:03:28 -070060 glColorMask(mColorRWriteEnable,
61 mColorGWriteEnable,
62 mColorBWriteEnable,
63 mColorAWriteEnable);
64 if (mBlendEnable) {
65 glEnable(GL_BLEND);
66 glBlendFunc(mBlendSrc, mBlendDst);
67 } else {
68 glDisable(GL_BLEND);
69 }
70
Jason Samsc75a2572009-07-15 18:35:54 -070071 //LOGE("pfs %i, %i, %x", mDepthWriteEnable, mDepthTestEnable, mDepthFunc);
72
Jason Samsd19f10d2009-05-22 14:03:28 -070073 glDepthMask(mDepthWriteEnable);
Jason Samsc75a2572009-07-15 18:35:54 -070074 if(mDepthTestEnable || mDepthWriteEnable) {
Jason Samsd19f10d2009-05-22 14:03:28 -070075 glEnable(GL_DEPTH_TEST);
76 glDepthFunc(mDepthFunc);
77 } else {
78 glDisable(GL_DEPTH_TEST);
79 }
80
81 if (mDitherEnable) {
82 glEnable(GL_DITHER);
83 } else {
84 glDisable(GL_DITHER);
85 }
Jason Samsd19f10d2009-05-22 14:03:28 -070086}
87
Jason Samsbb51c402009-11-25 13:22:07 -080088void ProgramFragmentStore::setupGL2(const Context *rsc, ProgramFragmentStoreState *state)
89{
90 if (state->mLast.get() == this) {
91 return;
92 }
93 state->mLast.set(this);
94
95 glColorMask(mColorRWriteEnable,
96 mColorGWriteEnable,
97 mColorBWriteEnable,
98 mColorAWriteEnable);
99 if (mBlendEnable) {
100 glEnable(GL_BLEND);
101 glBlendFunc(mBlendSrc, mBlendDst);
102 } else {
103 glDisable(GL_BLEND);
104 }
105
106 //LOGE("pfs %i, %i, %x", mDepthWriteEnable, mDepthTestEnable, mDepthFunc);
107
108 glDepthMask(mDepthWriteEnable);
109 if(mDepthTestEnable || mDepthWriteEnable) {
110 glEnable(GL_DEPTH_TEST);
111 glDepthFunc(mDepthFunc);
112 } else {
113 glDisable(GL_DEPTH_TEST);
114 }
115
116 if (mDitherEnable) {
117 glEnable(GL_DITHER);
118 } else {
119 glDisable(GL_DITHER);
120 }
121}
122
123
Jason Samsd19f10d2009-05-22 14:03:28 -0700124void ProgramFragmentStore::setDitherEnable(bool enable)
125{
126 mDitherEnable = enable;
127}
128
129void ProgramFragmentStore::setDepthFunc(RsDepthFunc func)
130{
131 mDepthTestEnable = true;
132
133 switch(func) {
134 case RS_DEPTH_FUNC_ALWAYS:
135 mDepthTestEnable = false;
136 mDepthFunc = GL_ALWAYS;
137 break;
138 case RS_DEPTH_FUNC_LESS:
139 mDepthFunc = GL_LESS;
140 break;
141 case RS_DEPTH_FUNC_LEQUAL:
142 mDepthFunc = GL_LEQUAL;
143 break;
144 case RS_DEPTH_FUNC_GREATER:
145 mDepthFunc = GL_GREATER;
146 break;
147 case RS_DEPTH_FUNC_GEQUAL:
148 mDepthFunc = GL_GEQUAL;
149 break;
150 case RS_DEPTH_FUNC_EQUAL:
151 mDepthFunc = GL_EQUAL;
152 break;
153 case RS_DEPTH_FUNC_NOTEQUAL:
154 mDepthFunc = GL_NOTEQUAL;
155 break;
156 }
157}
158
159void ProgramFragmentStore::setDepthMask(bool mask)
160{
161 mDepthWriteEnable = mask;
162}
163
164void ProgramFragmentStore::setBlendFunc(RsBlendSrcFunc src, RsBlendDstFunc dst)
165{
166 mBlendEnable = true;
Jason Sams9bee51c2009-08-05 13:57:03 -0700167 if ((src == RS_BLEND_SRC_ONE) &&
Jason Samsd19f10d2009-05-22 14:03:28 -0700168 (dst == RS_BLEND_DST_ZERO)) {
169 mBlendEnable = false;
170 }
171
172 switch(src) {
173 case RS_BLEND_SRC_ZERO:
174 mBlendSrc = GL_ZERO;
175 break;
176 case RS_BLEND_SRC_ONE:
177 mBlendSrc = GL_ONE;
178 break;
179 case RS_BLEND_SRC_DST_COLOR:
180 mBlendSrc = GL_DST_COLOR;
181 break;
182 case RS_BLEND_SRC_ONE_MINUS_DST_COLOR:
183 mBlendSrc = GL_ONE_MINUS_DST_COLOR;
184 break;
185 case RS_BLEND_SRC_SRC_ALPHA:
186 mBlendSrc = GL_SRC_ALPHA;
187 break;
188 case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA:
189 mBlendSrc = GL_ONE_MINUS_SRC_ALPHA;
190 break;
191 case RS_BLEND_SRC_DST_ALPHA:
192 mBlendSrc = GL_DST_ALPHA;
193 break;
194 case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA:
195 mBlendSrc = GL_ONE_MINUS_DST_ALPHA;
196 break;
197 case RS_BLEND_SRC_SRC_ALPHA_SATURATE:
198 mBlendSrc = GL_SRC_ALPHA_SATURATE;
199 break;
200 }
201
202 switch(dst) {
203 case RS_BLEND_DST_ZERO:
204 mBlendDst = GL_ZERO;
205 break;
206 case RS_BLEND_DST_ONE:
207 mBlendDst = GL_ONE;
208 break;
209 case RS_BLEND_DST_SRC_COLOR:
210 mBlendDst = GL_SRC_COLOR;
211 break;
212 case RS_BLEND_DST_ONE_MINUS_SRC_COLOR:
213 mBlendDst = GL_ONE_MINUS_SRC_COLOR;
214 break;
215 case RS_BLEND_DST_SRC_ALPHA:
216 mBlendDst = GL_SRC_ALPHA;
217 break;
218 case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA:
219 mBlendDst = GL_ONE_MINUS_SRC_ALPHA;
220 break;
221 case RS_BLEND_DST_DST_ALPHA:
222 mBlendDst = GL_DST_ALPHA;
223 break;
224 case RS_BLEND_DST_ONE_MINUS_DST_ALPHA:
225 mBlendDst = GL_ONE_MINUS_DST_ALPHA;
226 break;
227 }
228}
229
230void ProgramFragmentStore::setColorMask(bool r, bool g, bool b, bool a)
231{
232 mColorRWriteEnable = r;
233 mColorGWriteEnable = g;
234 mColorBWriteEnable = b;
235 mColorAWriteEnable = a;
236}
237
238
239ProgramFragmentStoreState::ProgramFragmentStoreState()
240{
241 mPFS = NULL;
242}
243
244ProgramFragmentStoreState::~ProgramFragmentStoreState()
245{
246 delete mPFS;
247
248}
249
Jason Sams9c54bdb2009-06-17 16:52:59 -0700250void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h)
251{
Jason Sams0011bcf2009-12-15 12:58:36 -0800252 ProgramFragmentStore *pfs = new ProgramFragmentStore(rsc);
Jason Sams9c54bdb2009-06-17 16:52:59 -0700253 mDefault.set(pfs);
254}
255
Jason Sams61f08d62009-09-25 16:37:33 -0700256void ProgramFragmentStoreState::deinit(Context *rsc)
257{
258 mDefault.clear();
259 mLast.clear();
260}
261
Jason Samsd19f10d2009-05-22 14:03:28 -0700262
Jason Samsd19f10d2009-05-22 14:03:28 -0700263namespace android {
264namespace renderscript {
265
266void rsi_ProgramFragmentStoreBegin(Context * rsc, RsElement in, RsElement out)
267{
268 delete rsc->mStateFragmentStore.mPFS;
Jason Sams0011bcf2009-12-15 12:58:36 -0800269 rsc->mStateFragmentStore.mPFS = new ProgramFragmentStore(rsc);
Jason Samsd19f10d2009-05-22 14:03:28 -0700270
271}
272
273void rsi_ProgramFragmentStoreDepthFunc(Context *rsc, RsDepthFunc func)
274{
275 rsc->mStateFragmentStore.mPFS->setDepthFunc(func);
276}
277
278void rsi_ProgramFragmentStoreDepthMask(Context *rsc, bool mask)
279{
280 rsc->mStateFragmentStore.mPFS->setDepthMask(mask);
281}
282
283void rsi_ProgramFragmentStoreColorMask(Context *rsc, bool r, bool g, bool b, bool a)
284{
285 rsc->mStateFragmentStore.mPFS->setColorMask(r, g, b, a);
286}
287
288void rsi_ProgramFragmentStoreBlendFunc(Context *rsc, RsBlendSrcFunc src, RsBlendDstFunc dst)
289{
290 rsc->mStateFragmentStore.mPFS->setBlendFunc(src, dst);
291}
292
293RsProgramFragmentStore rsi_ProgramFragmentStoreCreate(Context *rsc)
294{
295 ProgramFragmentStore *pfs = rsc->mStateFragmentStore.mPFS;
Jason Sams07ae4062009-08-27 20:23:34 -0700296 pfs->incUserRef();
Jason Samsd19f10d2009-05-22 14:03:28 -0700297 rsc->mStateFragmentStore.mPFS = 0;
Jason Samsd19f10d2009-05-22 14:03:28 -0700298 return pfs;
299}
300
301void rsi_ProgramFragmentStoreDither(Context *rsc, bool enable)
302{
303 rsc->mStateFragmentStore.mPFS->setDitherEnable(enable);
304}
305
Jason Samsd19f10d2009-05-22 14:03:28 -0700306
307}
308}