xref: /aosp_15_r20/frameworks/rs/driver/rsdProgramStore.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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