1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker
18*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsdProgramStore.h"
20*e1eccf28SAndroid Build Coastguard Worker
21*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
22*e1eccf28SAndroid Build Coastguard Worker #include "rsProgramStore.h"
23*e1eccf28SAndroid Build Coastguard Worker
24*e1eccf28SAndroid Build Coastguard Worker #include <GLES/gl.h>
25*e1eccf28SAndroid Build Coastguard Worker #include <GLES/glext.h>
26*e1eccf28SAndroid Build Coastguard Worker
27*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
28*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::ProgramStore;
29*e1eccf28SAndroid Build Coastguard Worker
30*e1eccf28SAndroid Build Coastguard Worker struct DrvProgramStore {
31*e1eccf28SAndroid Build Coastguard Worker GLenum blendSrc;
32*e1eccf28SAndroid Build Coastguard Worker GLenum blendDst;
33*e1eccf28SAndroid Build Coastguard Worker bool blendEnable;
34*e1eccf28SAndroid Build Coastguard Worker
35*e1eccf28SAndroid Build Coastguard Worker GLenum depthFunc;
36*e1eccf28SAndroid Build Coastguard Worker bool depthTestEnable;
37*e1eccf28SAndroid Build Coastguard Worker };
38*e1eccf28SAndroid Build Coastguard Worker
rsdProgramStoreInit(const Context * rsc,const ProgramStore * ps)39*e1eccf28SAndroid Build Coastguard Worker bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
40*e1eccf28SAndroid Build Coastguard Worker DrvProgramStore *drv = (DrvProgramStore *)calloc(1, sizeof(DrvProgramStore));
41*e1eccf28SAndroid Build Coastguard Worker if (drv == nullptr) {
42*e1eccf28SAndroid Build Coastguard Worker return false;
43*e1eccf28SAndroid Build Coastguard Worker }
44*e1eccf28SAndroid Build Coastguard Worker
45*e1eccf28SAndroid Build Coastguard Worker ps->mHal.drv = drv;
46*e1eccf28SAndroid Build Coastguard Worker drv->depthTestEnable = true;
47*e1eccf28SAndroid Build Coastguard Worker
48*e1eccf28SAndroid Build Coastguard Worker switch (ps->mHal.state.depthFunc) {
49*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_ALWAYS:
50*e1eccf28SAndroid Build Coastguard Worker drv->depthTestEnable = false;
51*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_ALWAYS;
52*e1eccf28SAndroid Build Coastguard Worker break;
53*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_LESS:
54*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_LESS;
55*e1eccf28SAndroid Build Coastguard Worker break;
56*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_LEQUAL:
57*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_LEQUAL;
58*e1eccf28SAndroid Build Coastguard Worker break;
59*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_GREATER:
60*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_GREATER;
61*e1eccf28SAndroid Build Coastguard Worker break;
62*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_GEQUAL:
63*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_GEQUAL;
64*e1eccf28SAndroid Build Coastguard Worker break;
65*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_EQUAL:
66*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_EQUAL;
67*e1eccf28SAndroid Build Coastguard Worker break;
68*e1eccf28SAndroid Build Coastguard Worker case RS_DEPTH_FUNC_NOTEQUAL:
69*e1eccf28SAndroid Build Coastguard Worker drv->depthFunc = GL_NOTEQUAL;
70*e1eccf28SAndroid Build Coastguard Worker break;
71*e1eccf28SAndroid Build Coastguard Worker default:
72*e1eccf28SAndroid Build Coastguard Worker ALOGE("Unknown depth function.");
73*e1eccf28SAndroid Build Coastguard Worker goto error;
74*e1eccf28SAndroid Build Coastguard Worker }
75*e1eccf28SAndroid Build Coastguard Worker
76*e1eccf28SAndroid Build Coastguard Worker
77*e1eccf28SAndroid Build Coastguard Worker
78*e1eccf28SAndroid Build Coastguard Worker drv->blendEnable = true;
79*e1eccf28SAndroid Build Coastguard Worker if ((ps->mHal.state.blendSrc == RS_BLEND_SRC_ONE) &&
80*e1eccf28SAndroid Build Coastguard Worker (ps->mHal.state.blendDst == RS_BLEND_DST_ZERO)) {
81*e1eccf28SAndroid Build Coastguard Worker drv->blendEnable = false;
82*e1eccf28SAndroid Build Coastguard Worker }
83*e1eccf28SAndroid Build Coastguard Worker
84*e1eccf28SAndroid Build Coastguard Worker switch (ps->mHal.state.blendSrc) {
85*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_ZERO:
86*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_ZERO;
87*e1eccf28SAndroid Build Coastguard Worker break;
88*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_ONE:
89*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_ONE;
90*e1eccf28SAndroid Build Coastguard Worker break;
91*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_DST_COLOR:
92*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_DST_COLOR;
93*e1eccf28SAndroid Build Coastguard Worker break;
94*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_ONE_MINUS_DST_COLOR:
95*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_ONE_MINUS_DST_COLOR;
96*e1eccf28SAndroid Build Coastguard Worker break;
97*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_SRC_ALPHA:
98*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_SRC_ALPHA;
99*e1eccf28SAndroid Build Coastguard Worker break;
100*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA:
101*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_ONE_MINUS_SRC_ALPHA;
102*e1eccf28SAndroid Build Coastguard Worker break;
103*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_DST_ALPHA:
104*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_DST_ALPHA;
105*e1eccf28SAndroid Build Coastguard Worker break;
106*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA:
107*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_ONE_MINUS_DST_ALPHA;
108*e1eccf28SAndroid Build Coastguard Worker break;
109*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_SRC_SRC_ALPHA_SATURATE:
110*e1eccf28SAndroid Build Coastguard Worker drv->blendSrc = GL_SRC_ALPHA_SATURATE;
111*e1eccf28SAndroid Build Coastguard Worker break;
112*e1eccf28SAndroid Build Coastguard Worker default:
113*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode.");
114*e1eccf28SAndroid Build Coastguard Worker goto error;
115*e1eccf28SAndroid Build Coastguard Worker }
116*e1eccf28SAndroid Build Coastguard Worker
117*e1eccf28SAndroid Build Coastguard Worker switch (ps->mHal.state.blendDst) {
118*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_ZERO:
119*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_ZERO;
120*e1eccf28SAndroid Build Coastguard Worker break;
121*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_ONE:
122*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_ONE;
123*e1eccf28SAndroid Build Coastguard Worker break;
124*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_SRC_COLOR:
125*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_SRC_COLOR;
126*e1eccf28SAndroid Build Coastguard Worker break;
127*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_ONE_MINUS_SRC_COLOR:
128*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_ONE_MINUS_SRC_COLOR;
129*e1eccf28SAndroid Build Coastguard Worker break;
130*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_SRC_ALPHA:
131*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_SRC_ALPHA;
132*e1eccf28SAndroid Build Coastguard Worker break;
133*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA:
134*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_ONE_MINUS_SRC_ALPHA;
135*e1eccf28SAndroid Build Coastguard Worker break;
136*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_DST_ALPHA:
137*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_DST_ALPHA;
138*e1eccf28SAndroid Build Coastguard Worker break;
139*e1eccf28SAndroid Build Coastguard Worker case RS_BLEND_DST_ONE_MINUS_DST_ALPHA:
140*e1eccf28SAndroid Build Coastguard Worker drv->blendDst = GL_ONE_MINUS_DST_ALPHA;
141*e1eccf28SAndroid Build Coastguard Worker break;
142*e1eccf28SAndroid Build Coastguard Worker default:
143*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode.");
144*e1eccf28SAndroid Build Coastguard Worker goto error;
145*e1eccf28SAndroid Build Coastguard Worker }
146*e1eccf28SAndroid Build Coastguard Worker
147*e1eccf28SAndroid Build Coastguard Worker return true;
148*e1eccf28SAndroid Build Coastguard Worker
149*e1eccf28SAndroid Build Coastguard Worker error:
150*e1eccf28SAndroid Build Coastguard Worker free(drv);
151*e1eccf28SAndroid Build Coastguard Worker ps->mHal.drv = nullptr;
152*e1eccf28SAndroid Build Coastguard Worker return false;
153*e1eccf28SAndroid Build Coastguard Worker }
154*e1eccf28SAndroid Build Coastguard Worker
rsdProgramStoreSetActive(const Context * rsc,const ProgramStore * ps)155*e1eccf28SAndroid Build Coastguard Worker void rsdProgramStoreSetActive(const Context *rsc, const ProgramStore *ps) {
156*e1eccf28SAndroid Build Coastguard Worker DrvProgramStore *drv = (DrvProgramStore *)ps->mHal.drv;
157*e1eccf28SAndroid Build Coastguard Worker
158*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glColorMask, ps->mHal.state.colorRWriteEnable,
159*e1eccf28SAndroid Build Coastguard Worker ps->mHal.state.colorGWriteEnable,
160*e1eccf28SAndroid Build Coastguard Worker ps->mHal.state.colorBWriteEnable,
161*e1eccf28SAndroid Build Coastguard Worker ps->mHal.state.colorAWriteEnable);
162*e1eccf28SAndroid Build Coastguard Worker
163*e1eccf28SAndroid Build Coastguard Worker if (drv->blendEnable) {
164*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glEnable, GL_BLEND);
165*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBlendFunc, drv->blendSrc, drv->blendDst);
166*e1eccf28SAndroid Build Coastguard Worker } else {
167*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDisable, GL_BLEND);
168*e1eccf28SAndroid Build Coastguard Worker }
169*e1eccf28SAndroid Build Coastguard Worker
170*e1eccf28SAndroid Build Coastguard Worker if (rsc->mUserSurfaceConfig.depthMin > 0) {
171*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDepthMask, ps->mHal.state.depthWriteEnable);
172*e1eccf28SAndroid Build Coastguard Worker if (drv->depthTestEnable || ps->mHal.state.depthWriteEnable) {
173*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glEnable, GL_DEPTH_TEST);
174*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDepthFunc, drv->depthFunc);
175*e1eccf28SAndroid Build Coastguard Worker } else {
176*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
177*e1eccf28SAndroid Build Coastguard Worker }
178*e1eccf28SAndroid Build Coastguard Worker } else {
179*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDepthMask, false);
180*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
181*e1eccf28SAndroid Build Coastguard Worker }
182*e1eccf28SAndroid Build Coastguard Worker
183*e1eccf28SAndroid Build Coastguard Worker /*
184*e1eccf28SAndroid Build Coastguard Worker if (rsc->mUserSurfaceConfig.stencilMin > 0) {
185*e1eccf28SAndroid Build Coastguard Worker } else {
186*e1eccf28SAndroid Build Coastguard Worker glStencilMask(0);
187*e1eccf28SAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
188*e1eccf28SAndroid Build Coastguard Worker }
189*e1eccf28SAndroid Build Coastguard Worker */
190*e1eccf28SAndroid Build Coastguard Worker
191*e1eccf28SAndroid Build Coastguard Worker if (ps->mHal.state.ditherEnable) {
192*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glEnable, GL_DITHER);
193*e1eccf28SAndroid Build Coastguard Worker } else {
194*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDisable, GL_DITHER);
195*e1eccf28SAndroid Build Coastguard Worker }
196*e1eccf28SAndroid Build Coastguard Worker }
197*e1eccf28SAndroid Build Coastguard Worker
rsdProgramStoreDestroy(const Context * rsc,const ProgramStore * ps)198*e1eccf28SAndroid Build Coastguard Worker void rsdProgramStoreDestroy(const Context *rsc, const ProgramStore *ps) {
199*e1eccf28SAndroid Build Coastguard Worker free(ps->mHal.drv);
200*e1eccf28SAndroid Build Coastguard Worker ps->mHal.drv = nullptr;
201*e1eccf28SAndroid Build Coastguard Worker }
202*e1eccf28SAndroid Build Coastguard Worker
203*e1eccf28SAndroid Build Coastguard Worker
204