xref: /aosp_15_r20/frameworks/rs/driver/rsdGL.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 #include <vndk/window.h>
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker #include <sys/types.h>
20*e1eccf28SAndroid Build Coastguard Worker #include <sys/resource.h>
21*e1eccf28SAndroid Build Coastguard Worker #include <sched.h>
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker #define EGL_EGLEXT_PROTOTYPES
24*e1eccf28SAndroid Build Coastguard Worker #include <EGL/egl.h>
25*e1eccf28SAndroid Build Coastguard Worker #include <EGL/eglext.h>
26*e1eccf28SAndroid Build Coastguard Worker #include <GLES/gl.h>
27*e1eccf28SAndroid Build Coastguard Worker #include <GLES/glext.h>
28*e1eccf28SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
29*e1eccf28SAndroid Build Coastguard Worker #include <GLES2/gl2ext.h>
30*e1eccf28SAndroid Build Coastguard Worker 
31*e1eccf28SAndroid Build Coastguard Worker #include <string.h>
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
34*e1eccf28SAndroid Build Coastguard Worker #include "rsdGL.h"
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker #include <malloc.h>
37*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
38*e1eccf28SAndroid Build Coastguard Worker #include "rsDevice.h"
39*e1eccf28SAndroid Build Coastguard Worker #include "rsdShaderCache.h"
40*e1eccf28SAndroid Build Coastguard Worker #include "rsdVertexArray.h"
41*e1eccf28SAndroid Build Coastguard Worker #include "rsdFrameBufferObj.h"
42*e1eccf28SAndroid Build Coastguard Worker 
43*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
44*e1eccf28SAndroid Build Coastguard Worker 
45*e1eccf28SAndroid Build Coastguard Worker static int32_t gGLContextCount = 0;
46*e1eccf28SAndroid Build Coastguard Worker 
checkEglError(const char * op,EGLBoolean returnVal=EGL_TRUE)47*e1eccf28SAndroid Build Coastguard Worker static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
48*e1eccf28SAndroid Build Coastguard Worker     struct EGLUtils {
49*e1eccf28SAndroid Build Coastguard Worker         static const char *strerror(EGLint err) {
50*e1eccf28SAndroid Build Coastguard Worker             switch (err){
51*e1eccf28SAndroid Build Coastguard Worker                 case EGL_SUCCESS:           return "EGL_SUCCESS";
52*e1eccf28SAndroid Build Coastguard Worker                 case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
53*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
54*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
55*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
56*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
57*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
58*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
59*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
60*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
61*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
62*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
63*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
64*e1eccf28SAndroid Build Coastguard Worker                 case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
65*e1eccf28SAndroid Build Coastguard Worker                 case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
66*e1eccf28SAndroid Build Coastguard Worker                 default: return "UNKNOWN";
67*e1eccf28SAndroid Build Coastguard Worker             }
68*e1eccf28SAndroid Build Coastguard Worker         }
69*e1eccf28SAndroid Build Coastguard Worker     };
70*e1eccf28SAndroid Build Coastguard Worker 
71*e1eccf28SAndroid Build Coastguard Worker     if (returnVal != EGL_TRUE) {
72*e1eccf28SAndroid Build Coastguard Worker         fprintf(stderr, "%s() returned %d\n", op, returnVal);
73*e1eccf28SAndroid Build Coastguard Worker     }
74*e1eccf28SAndroid Build Coastguard Worker 
75*e1eccf28SAndroid Build Coastguard Worker     for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
76*e1eccf28SAndroid Build Coastguard Worker             = eglGetError()) {
77*e1eccf28SAndroid Build Coastguard Worker         fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
78*e1eccf28SAndroid Build Coastguard Worker                 error);
79*e1eccf28SAndroid Build Coastguard Worker     }
80*e1eccf28SAndroid Build Coastguard Worker }
81*e1eccf28SAndroid Build Coastguard Worker 
printEGLConfiguration(EGLDisplay dpy,EGLConfig config)82*e1eccf28SAndroid Build Coastguard Worker static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
83*e1eccf28SAndroid Build Coastguard Worker 
84*e1eccf28SAndroid Build Coastguard Worker #define X(VAL) {VAL, #VAL}
85*e1eccf28SAndroid Build Coastguard Worker     struct {EGLint attribute; const char* name;} names[] = {
86*e1eccf28SAndroid Build Coastguard Worker     X(EGL_BUFFER_SIZE),
87*e1eccf28SAndroid Build Coastguard Worker     X(EGL_ALPHA_SIZE),
88*e1eccf28SAndroid Build Coastguard Worker     X(EGL_BLUE_SIZE),
89*e1eccf28SAndroid Build Coastguard Worker     X(EGL_GREEN_SIZE),
90*e1eccf28SAndroid Build Coastguard Worker     X(EGL_RED_SIZE),
91*e1eccf28SAndroid Build Coastguard Worker     X(EGL_DEPTH_SIZE),
92*e1eccf28SAndroid Build Coastguard Worker     X(EGL_STENCIL_SIZE),
93*e1eccf28SAndroid Build Coastguard Worker     X(EGL_CONFIG_CAVEAT),
94*e1eccf28SAndroid Build Coastguard Worker     X(EGL_CONFIG_ID),
95*e1eccf28SAndroid Build Coastguard Worker     X(EGL_LEVEL),
96*e1eccf28SAndroid Build Coastguard Worker     X(EGL_MAX_PBUFFER_HEIGHT),
97*e1eccf28SAndroid Build Coastguard Worker     X(EGL_MAX_PBUFFER_PIXELS),
98*e1eccf28SAndroid Build Coastguard Worker     X(EGL_MAX_PBUFFER_WIDTH),
99*e1eccf28SAndroid Build Coastguard Worker     X(EGL_NATIVE_RENDERABLE),
100*e1eccf28SAndroid Build Coastguard Worker     X(EGL_NATIVE_VISUAL_ID),
101*e1eccf28SAndroid Build Coastguard Worker     X(EGL_NATIVE_VISUAL_TYPE),
102*e1eccf28SAndroid Build Coastguard Worker     X(EGL_SAMPLES),
103*e1eccf28SAndroid Build Coastguard Worker     X(EGL_SAMPLE_BUFFERS),
104*e1eccf28SAndroid Build Coastguard Worker     X(EGL_SURFACE_TYPE),
105*e1eccf28SAndroid Build Coastguard Worker     X(EGL_TRANSPARENT_TYPE),
106*e1eccf28SAndroid Build Coastguard Worker     X(EGL_TRANSPARENT_RED_VALUE),
107*e1eccf28SAndroid Build Coastguard Worker     X(EGL_TRANSPARENT_GREEN_VALUE),
108*e1eccf28SAndroid Build Coastguard Worker     X(EGL_TRANSPARENT_BLUE_VALUE),
109*e1eccf28SAndroid Build Coastguard Worker     X(EGL_BIND_TO_TEXTURE_RGB),
110*e1eccf28SAndroid Build Coastguard Worker     X(EGL_BIND_TO_TEXTURE_RGBA),
111*e1eccf28SAndroid Build Coastguard Worker     X(EGL_MIN_SWAP_INTERVAL),
112*e1eccf28SAndroid Build Coastguard Worker     X(EGL_MAX_SWAP_INTERVAL),
113*e1eccf28SAndroid Build Coastguard Worker     X(EGL_LUMINANCE_SIZE),
114*e1eccf28SAndroid Build Coastguard Worker     X(EGL_ALPHA_MASK_SIZE),
115*e1eccf28SAndroid Build Coastguard Worker     X(EGL_COLOR_BUFFER_TYPE),
116*e1eccf28SAndroid Build Coastguard Worker     X(EGL_RENDERABLE_TYPE),
117*e1eccf28SAndroid Build Coastguard Worker     X(EGL_CONFORMANT),
118*e1eccf28SAndroid Build Coastguard Worker    };
119*e1eccf28SAndroid Build Coastguard Worker #undef X
120*e1eccf28SAndroid Build Coastguard Worker 
121*e1eccf28SAndroid Build Coastguard Worker     for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) {
122*e1eccf28SAndroid Build Coastguard Worker         EGLint value = -1;
123*e1eccf28SAndroid Build Coastguard Worker         EGLBoolean returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value);
124*e1eccf28SAndroid Build Coastguard Worker         if (returnVal) {
125*e1eccf28SAndroid Build Coastguard Worker             ALOGV(" %s: %d (0x%x)", names[j].name, value, value);
126*e1eccf28SAndroid Build Coastguard Worker         }
127*e1eccf28SAndroid Build Coastguard Worker     }
128*e1eccf28SAndroid Build Coastguard Worker }
129*e1eccf28SAndroid Build Coastguard Worker 
DumpDebug(RsdHal * dc)130*e1eccf28SAndroid Build Coastguard Worker static void DumpDebug(RsdHal *dc) {
131*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
132*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" EGL context %p  surface %p,  Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
133*e1eccf28SAndroid Build Coastguard Worker          dc->gl.egl.display);
134*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" GL vendor: %s", dc->gl.gl.vendor);
135*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" GL renderer: %s", dc->gl.gl.renderer);
136*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" GL Version: %s", dc->gl.gl.version);
137*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" GL Extensions: %s", dc->gl.gl.extensions);
138*e1eccf28SAndroid Build Coastguard Worker     ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
139*e1eccf28SAndroid Build Coastguard Worker 
140*e1eccf28SAndroid Build Coastguard Worker     ALOGV("MAX Textures %i, %i  %i", dc->gl.gl.maxVertexTextureUnits,
141*e1eccf28SAndroid Build Coastguard Worker          dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits);
142*e1eccf28SAndroid Build Coastguard Worker     ALOGV("MAX Attribs %i", dc->gl.gl.maxVertexAttribs);
143*e1eccf28SAndroid Build Coastguard Worker     ALOGV("MAX Uniforms %i, %i", dc->gl.gl.maxVertexUniformVectors,
144*e1eccf28SAndroid Build Coastguard Worker          dc->gl.gl.maxFragmentUniformVectors);
145*e1eccf28SAndroid Build Coastguard Worker     ALOGV("MAX Varyings %i", dc->gl.gl.maxVaryingVectors);
146*e1eccf28SAndroid Build Coastguard Worker }
147*e1eccf28SAndroid Build Coastguard Worker 
rsdGLShutdown(const Context * rsc)148*e1eccf28SAndroid Build Coastguard Worker void rsdGLShutdown(const Context *rsc) {
149*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
150*e1eccf28SAndroid Build Coastguard Worker 
151*e1eccf28SAndroid Build Coastguard Worker     rsdGLSetSurface(rsc, 0, 0, nullptr);
152*e1eccf28SAndroid Build Coastguard Worker     dc->gl.shaderCache->cleanupAll();
153*e1eccf28SAndroid Build Coastguard Worker     delete dc->gl.shaderCache;
154*e1eccf28SAndroid Build Coastguard Worker     delete dc->gl.vertexArrayState;
155*e1eccf28SAndroid Build Coastguard Worker 
156*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.egl.context != EGL_NO_CONTEXT) {
157*e1eccf28SAndroid Build Coastguard Worker         RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
158*e1eccf28SAndroid Build Coastguard Worker                     EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
159*e1eccf28SAndroid Build Coastguard Worker         RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault);
160*e1eccf28SAndroid Build Coastguard Worker         if (dc->gl.egl.surface != EGL_NO_SURFACE) {
161*e1eccf28SAndroid Build Coastguard Worker             RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface);
162*e1eccf28SAndroid Build Coastguard Worker         }
163*e1eccf28SAndroid Build Coastguard Worker         RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context);
164*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglDestroyContext");
165*e1eccf28SAndroid Build Coastguard Worker     }
166*e1eccf28SAndroid Build Coastguard Worker 
167*e1eccf28SAndroid Build Coastguard Worker     gGLContextCount--;
168*e1eccf28SAndroid Build Coastguard Worker     if (!gGLContextCount) {
169*e1eccf28SAndroid Build Coastguard Worker         RSD_CALL_GL(eglTerminate, dc->gl.egl.display);
170*e1eccf28SAndroid Build Coastguard Worker     }
171*e1eccf28SAndroid Build Coastguard Worker }
172*e1eccf28SAndroid Build Coastguard Worker 
getConfigData(const Context * rsc,EGLint * configAttribs,size_t configAttribsLen,uint32_t numSamples)173*e1eccf28SAndroid Build Coastguard Worker void getConfigData(const Context *rsc,
174*e1eccf28SAndroid Build Coastguard Worker                    EGLint *configAttribs, size_t configAttribsLen,
175*e1eccf28SAndroid Build Coastguard Worker                    uint32_t numSamples) {
176*e1eccf28SAndroid Build Coastguard Worker     memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs));
177*e1eccf28SAndroid Build Coastguard Worker 
178*e1eccf28SAndroid Build Coastguard Worker     EGLint *configAttribsPtr = configAttribs;
179*e1eccf28SAndroid Build Coastguard Worker 
180*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_SURFACE_TYPE;
181*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[1] = EGL_PBUFFER_BIT;
182*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr += 2;
183*e1eccf28SAndroid Build Coastguard Worker 
184*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_RENDERABLE_TYPE;
185*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[1] = EGL_OPENGL_ES2_BIT;
186*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr += 2;
187*e1eccf28SAndroid Build Coastguard Worker 
188*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_RED_SIZE;
189*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[1] = 8;
190*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr += 2;
191*e1eccf28SAndroid Build Coastguard Worker 
192*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_GREEN_SIZE;
193*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[1] = 8;
194*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr += 2;
195*e1eccf28SAndroid Build Coastguard Worker 
196*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_BLUE_SIZE;
197*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[1] = 8;
198*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr += 2;
199*e1eccf28SAndroid Build Coastguard Worker 
200*e1eccf28SAndroid Build Coastguard Worker     if (rsc->mUserSurfaceConfig.alphaMin > 0) {
201*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[0] = EGL_ALPHA_SIZE;
202*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[1] = rsc->mUserSurfaceConfig.alphaMin;
203*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr += 2;
204*e1eccf28SAndroid Build Coastguard Worker     }
205*e1eccf28SAndroid Build Coastguard Worker 
206*e1eccf28SAndroid Build Coastguard Worker     if (rsc->mUserSurfaceConfig.depthMin > 0) {
207*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[0] = EGL_DEPTH_SIZE;
208*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[1] = rsc->mUserSurfaceConfig.depthMin;
209*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr += 2;
210*e1eccf28SAndroid Build Coastguard Worker     }
211*e1eccf28SAndroid Build Coastguard Worker 
212*e1eccf28SAndroid Build Coastguard Worker     if (numSamples > 1) {
213*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[0] = EGL_SAMPLE_BUFFERS;
214*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[1] = 1;
215*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[2] = EGL_SAMPLES;
216*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr[3] = numSamples;
217*e1eccf28SAndroid Build Coastguard Worker         configAttribsPtr += 4;
218*e1eccf28SAndroid Build Coastguard Worker     }
219*e1eccf28SAndroid Build Coastguard Worker 
220*e1eccf28SAndroid Build Coastguard Worker     configAttribsPtr[0] = EGL_NONE;
221*e1eccf28SAndroid Build Coastguard Worker     rsAssert(configAttribsPtr < (configAttribs + configAttribsLen));
222*e1eccf28SAndroid Build Coastguard Worker }
223*e1eccf28SAndroid Build Coastguard Worker 
rsdGLInit(const Context * rsc)224*e1eccf28SAndroid Build Coastguard Worker int32_t rsdGLInit(const Context *rsc) {
225*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
226*e1eccf28SAndroid Build Coastguard Worker 
227*e1eccf28SAndroid Build Coastguard Worker     dc->gl.egl.numConfigs = -1;
228*e1eccf28SAndroid Build Coastguard Worker 
229*e1eccf28SAndroid Build Coastguard Worker     EGLint configAttribs[128];
230*e1eccf28SAndroid Build Coastguard Worker     EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
231*e1eccf28SAndroid Build Coastguard Worker 
232*e1eccf28SAndroid Build Coastguard Worker     ALOGV("%p initEGL start", rsc);
233*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
234*e1eccf28SAndroid Build Coastguard Worker     dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
235*e1eccf28SAndroid Build Coastguard Worker     checkEglError("eglGetDisplay");
236*e1eccf28SAndroid Build Coastguard Worker 
237*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(eglInitialize, dc->gl.egl.display,
238*e1eccf28SAndroid Build Coastguard Worker                 &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
239*e1eccf28SAndroid Build Coastguard Worker     checkEglError("eglInitialize");
240*e1eccf28SAndroid Build Coastguard Worker 
241*e1eccf28SAndroid Build Coastguard Worker     EGLBoolean ret;
242*e1eccf28SAndroid Build Coastguard Worker 
243*e1eccf28SAndroid Build Coastguard Worker     EGLint numConfigs = -1, n = 0;
244*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
245*e1eccf28SAndroid Build Coastguard Worker 
246*e1eccf28SAndroid Build Coastguard Worker     // Try minding a multisample config that matches the user request
247*e1eccf28SAndroid Build Coastguard Worker     uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin;
248*e1eccf28SAndroid Build Coastguard Worker     uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref;
249*e1eccf28SAndroid Build Coastguard Worker     for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) {
250*e1eccf28SAndroid Build Coastguard Worker         getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount);
251*e1eccf28SAndroid Build Coastguard Worker         ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
252*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglGetConfigs", ret);
253*e1eccf28SAndroid Build Coastguard Worker         if (numConfigs > 0) {
254*e1eccf28SAndroid Build Coastguard Worker             break;
255*e1eccf28SAndroid Build Coastguard Worker         }
256*e1eccf28SAndroid Build Coastguard Worker     }
257*e1eccf28SAndroid Build Coastguard Worker 
258*e1eccf28SAndroid Build Coastguard Worker     if (numConfigs) {
259*e1eccf28SAndroid Build Coastguard Worker         EGLConfig* const configs = new EGLConfig[numConfigs];
260*e1eccf28SAndroid Build Coastguard Worker 
261*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
262*e1eccf28SAndroid Build Coastguard Worker         ret = eglChooseConfig(dc->gl.egl.display,
263*e1eccf28SAndroid Build Coastguard Worker                 configAttribs, configs, numConfigs, &n);
264*e1eccf28SAndroid Build Coastguard Worker         if (!ret || !n) {
265*e1eccf28SAndroid Build Coastguard Worker             checkEglError("eglChooseConfig", ret);
266*e1eccf28SAndroid Build Coastguard Worker             ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
267*e1eccf28SAndroid Build Coastguard Worker         }
268*e1eccf28SAndroid Build Coastguard Worker 
269*e1eccf28SAndroid Build Coastguard Worker         // The first config is guaranteed to over-satisfy the constraints
270*e1eccf28SAndroid Build Coastguard Worker         dc->gl.egl.config = configs[0];
271*e1eccf28SAndroid Build Coastguard Worker 
272*e1eccf28SAndroid Build Coastguard Worker         // go through the list and skip configs that over-satisfy our needs
273*e1eccf28SAndroid Build Coastguard Worker         for (int i=0 ; i<n ; i++) {
274*e1eccf28SAndroid Build Coastguard Worker             if (rsc->mUserSurfaceConfig.alphaMin <= 0) {
275*e1eccf28SAndroid Build Coastguard Worker                 EGLint alphaSize;
276*e1eccf28SAndroid Build Coastguard Worker                 eglGetConfigAttrib(dc->gl.egl.display,
277*e1eccf28SAndroid Build Coastguard Worker                         configs[i], EGL_ALPHA_SIZE, &alphaSize);
278*e1eccf28SAndroid Build Coastguard Worker                 if (alphaSize > 0) {
279*e1eccf28SAndroid Build Coastguard Worker                     continue;
280*e1eccf28SAndroid Build Coastguard Worker                 }
281*e1eccf28SAndroid Build Coastguard Worker             }
282*e1eccf28SAndroid Build Coastguard Worker 
283*e1eccf28SAndroid Build Coastguard Worker             if (rsc->mUserSurfaceConfig.depthMin <= 0) {
284*e1eccf28SAndroid Build Coastguard Worker                 EGLint depthSize;
285*e1eccf28SAndroid Build Coastguard Worker                 eglGetConfigAttrib(dc->gl.egl.display,
286*e1eccf28SAndroid Build Coastguard Worker                         configs[i], EGL_DEPTH_SIZE, &depthSize);
287*e1eccf28SAndroid Build Coastguard Worker                 if (depthSize > 0) {
288*e1eccf28SAndroid Build Coastguard Worker                     continue;
289*e1eccf28SAndroid Build Coastguard Worker                 }
290*e1eccf28SAndroid Build Coastguard Worker             }
291*e1eccf28SAndroid Build Coastguard Worker 
292*e1eccf28SAndroid Build Coastguard Worker             // Found one!
293*e1eccf28SAndroid Build Coastguard Worker             dc->gl.egl.config = configs[i];
294*e1eccf28SAndroid Build Coastguard Worker             break;
295*e1eccf28SAndroid Build Coastguard Worker         }
296*e1eccf28SAndroid Build Coastguard Worker 
297*e1eccf28SAndroid Build Coastguard Worker         delete [] configs;
298*e1eccf28SAndroid Build Coastguard Worker     }
299*e1eccf28SAndroid Build Coastguard Worker 
300*e1eccf28SAndroid Build Coastguard Worker     //if (props.mLogVisual) {
301*e1eccf28SAndroid Build Coastguard Worker     if (0) {
302*e1eccf28SAndroid Build Coastguard Worker         printEGLConfiguration(dc->gl.egl.display, dc->gl.egl.config);
303*e1eccf28SAndroid Build Coastguard Worker     }
304*e1eccf28SAndroid Build Coastguard Worker     //}
305*e1eccf28SAndroid Build Coastguard Worker 
306*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__);
307*e1eccf28SAndroid Build Coastguard Worker     dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config,
308*e1eccf28SAndroid Build Coastguard Worker                                           EGL_NO_CONTEXT, context_attribs2);
309*e1eccf28SAndroid Build Coastguard Worker     checkEglError("eglCreateContext");
310*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.egl.context == EGL_NO_CONTEXT) {
311*e1eccf28SAndroid Build Coastguard Worker         ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
312*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL(nullptr, 0, nullptr);
313*e1eccf28SAndroid Build Coastguard Worker         return -1;
314*e1eccf28SAndroid Build Coastguard Worker     }
315*e1eccf28SAndroid Build Coastguard Worker     gGLContextCount++;
316*e1eccf28SAndroid Build Coastguard Worker 
317*e1eccf28SAndroid Build Coastguard Worker     EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE };
318*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL("eglCreatePbufferSurface", __LINE__, __FILE__);
319*e1eccf28SAndroid Build Coastguard Worker     dc->gl.egl.surfaceDefault = eglCreatePbufferSurface(dc->gl.egl.display, dc->gl.egl.config,
320*e1eccf28SAndroid Build Coastguard Worker             pbuffer_attribs);
321*e1eccf28SAndroid Build Coastguard Worker     checkEglError("eglCreatePbufferSurface");
322*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
323*e1eccf28SAndroid Build Coastguard Worker         ALOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
324*e1eccf28SAndroid Build Coastguard Worker         rsdGLShutdown(rsc);
325*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL(nullptr, 0, nullptr);
326*e1eccf28SAndroid Build Coastguard Worker         return -1;
327*e1eccf28SAndroid Build Coastguard Worker     }
328*e1eccf28SAndroid Build Coastguard Worker 
329*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
330*e1eccf28SAndroid Build Coastguard Worker     ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
331*e1eccf28SAndroid Build Coastguard Worker                          dc->gl.egl.surfaceDefault, dc->gl.egl.context);
332*e1eccf28SAndroid Build Coastguard Worker     if (ret == EGL_FALSE) {
333*e1eccf28SAndroid Build Coastguard Worker         ALOGE("eglMakeCurrent returned EGL_FALSE");
334*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglMakeCurrent", ret);
335*e1eccf28SAndroid Build Coastguard Worker         rsdGLShutdown(rsc);
336*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL(nullptr, 0, nullptr);
337*e1eccf28SAndroid Build Coastguard Worker         return -1;
338*e1eccf28SAndroid Build Coastguard Worker     }
339*e1eccf28SAndroid Build Coastguard Worker 
340*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.version = glGetString(GL_VERSION);
341*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.vendor = glGetString(GL_VENDOR);
342*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.renderer = glGetString(GL_RENDERER);
343*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.extensions = glGetString(GL_EXTENSIONS);
344*e1eccf28SAndroid Build Coastguard Worker 
345*e1eccf28SAndroid Build Coastguard Worker     //ALOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion);
346*e1eccf28SAndroid Build Coastguard Worker     //ALOGV("GL Version %s", mGL.mVersion);
347*e1eccf28SAndroid Build Coastguard Worker     //ALOGV("GL Vendor %s", mGL.mVendor);
348*e1eccf28SAndroid Build Coastguard Worker     //ALOGV("GL Renderer %s", mGL.mRenderer);
349*e1eccf28SAndroid Build Coastguard Worker     //ALOGV("GL Extensions %s", mGL.mExtensions);
350*e1eccf28SAndroid Build Coastguard Worker 
351*e1eccf28SAndroid Build Coastguard Worker     const char *verptr = nullptr;
352*e1eccf28SAndroid Build Coastguard Worker     if (strlen((const char *)dc->gl.gl.version) > 9) {
353*e1eccf28SAndroid Build Coastguard Worker         if (!memcmp(dc->gl.gl.version, "OpenGL ES-CM", 12)) {
354*e1eccf28SAndroid Build Coastguard Worker             verptr = (const char *)dc->gl.gl.version + 12;
355*e1eccf28SAndroid Build Coastguard Worker         }
356*e1eccf28SAndroid Build Coastguard Worker         if (!memcmp(dc->gl.gl.version, "OpenGL ES ", 10)) {
357*e1eccf28SAndroid Build Coastguard Worker             verptr = (const char *)dc->gl.gl.version + 9;
358*e1eccf28SAndroid Build Coastguard Worker         }
359*e1eccf28SAndroid Build Coastguard Worker     }
360*e1eccf28SAndroid Build Coastguard Worker 
361*e1eccf28SAndroid Build Coastguard Worker     if (!verptr) {
362*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Error, OpenGL ES Lite not supported");
363*e1eccf28SAndroid Build Coastguard Worker         rsdGLShutdown(rsc);
364*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL(nullptr, 0, nullptr);
365*e1eccf28SAndroid Build Coastguard Worker         return -1;
366*e1eccf28SAndroid Build Coastguard Worker     } else {
367*e1eccf28SAndroid Build Coastguard Worker         sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion);
368*e1eccf28SAndroid Build Coastguard Worker     }
369*e1eccf28SAndroid Build Coastguard Worker 
370*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &dc->gl.gl.maxVertexAttribs);
371*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &dc->gl.gl.maxVertexUniformVectors);
372*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxVertexTextureUnits);
373*e1eccf28SAndroid Build Coastguard Worker 
374*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_VARYING_VECTORS, &dc->gl.gl.maxVaryingVectors);
375*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxTextureImageUnits);
376*e1eccf28SAndroid Build Coastguard Worker 
377*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxFragmentTextureImageUnits);
378*e1eccf28SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &dc->gl.gl.maxFragmentUniformVectors);
379*e1eccf28SAndroid Build Coastguard Worker 
380*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.OES_texture_npot = nullptr != strstr((const char *)dc->gl.gl.extensions,
381*e1eccf28SAndroid Build Coastguard Worker                                                 "GL_OES_texture_npot");
382*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.IMG_texture_npot = nullptr != strstr((const char *)dc->gl.gl.extensions,
383*e1eccf28SAndroid Build Coastguard Worker                                                    "GL_IMG_texture_npot");
384*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.NV_texture_npot_2D_mipmap = nullptr != strstr((const char *)dc->gl.gl.extensions,
385*e1eccf28SAndroid Build Coastguard Worker                                                             "GL_NV_texture_npot_2D_mipmap");
386*e1eccf28SAndroid Build Coastguard Worker     dc->gl.gl.EXT_texture_max_aniso = 1.0f;
387*e1eccf28SAndroid Build Coastguard Worker     bool hasAniso = nullptr != strstr((const char *)dc->gl.gl.extensions,
388*e1eccf28SAndroid Build Coastguard Worker                                    "GL_EXT_texture_filter_anisotropic");
389*e1eccf28SAndroid Build Coastguard Worker     if (hasAniso) {
390*e1eccf28SAndroid Build Coastguard Worker         glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dc->gl.gl.EXT_texture_max_aniso);
391*e1eccf28SAndroid Build Coastguard Worker     }
392*e1eccf28SAndroid Build Coastguard Worker 
393*e1eccf28SAndroid Build Coastguard Worker     if (0) {
394*e1eccf28SAndroid Build Coastguard Worker         DumpDebug(dc);
395*e1eccf28SAndroid Build Coastguard Worker     }
396*e1eccf28SAndroid Build Coastguard Worker 
397*e1eccf28SAndroid Build Coastguard Worker     dc->gl.shaderCache = new RsdShaderCache();
398*e1eccf28SAndroid Build Coastguard Worker     dc->gl.vertexArrayState = new RsdVertexArrayState();
399*e1eccf28SAndroid Build Coastguard Worker     dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs);
400*e1eccf28SAndroid Build Coastguard Worker     dc->gl.currentFrameBuffer = nullptr;
401*e1eccf28SAndroid Build Coastguard Worker     dc->mHasGraphics = true;
402*e1eccf28SAndroid Build Coastguard Worker 
403*e1eccf28SAndroid Build Coastguard Worker     int syncFd = -1;
404*e1eccf28SAndroid Build Coastguard Worker     // Create a EGL sync object.
405*e1eccf28SAndroid Build Coastguard Worker     EGLSyncKHR sync = eglCreateSyncKHR(dc->gl.egl.display, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
406*e1eccf28SAndroid Build Coastguard Worker     if (sync != EGL_NO_SYNC_KHR) {
407*e1eccf28SAndroid Build Coastguard Worker         // native fence fd will not be populated until flush() is done.
408*e1eccf28SAndroid Build Coastguard Worker         glFlush();
409*e1eccf28SAndroid Build Coastguard Worker         // Convert the EGL sync object to a file descriptor.
410*e1eccf28SAndroid Build Coastguard Worker         syncFd = eglDupNativeFenceFDANDROID(dc->gl.egl.display, sync);
411*e1eccf28SAndroid Build Coastguard Worker         if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
412*e1eccf28SAndroid Build Coastguard Worker             ALOGW("Failed to dup sync khr object");
413*e1eccf28SAndroid Build Coastguard Worker             syncFd = -1;
414*e1eccf28SAndroid Build Coastguard Worker         }
415*e1eccf28SAndroid Build Coastguard Worker         // The sync object is no longer needed once we have the file descriptor.
416*e1eccf28SAndroid Build Coastguard Worker         eglDestroySyncKHR(dc->gl.egl.display, sync);
417*e1eccf28SAndroid Build Coastguard Worker     }
418*e1eccf28SAndroid Build Coastguard Worker 
419*e1eccf28SAndroid Build Coastguard Worker     ALOGV("%p initGLThread end", rsc);
420*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL(nullptr, 0, nullptr);
421*e1eccf28SAndroid Build Coastguard Worker     return syncFd;
422*e1eccf28SAndroid Build Coastguard Worker }
423*e1eccf28SAndroid Build Coastguard Worker 
424*e1eccf28SAndroid Build Coastguard Worker 
rsdGLSetInternalSurface(const Context * rsc,RsNativeWindow sur)425*e1eccf28SAndroid Build Coastguard Worker bool rsdGLSetInternalSurface(const Context *rsc, RsNativeWindow sur) {
426*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
427*e1eccf28SAndroid Build Coastguard Worker 
428*e1eccf28SAndroid Build Coastguard Worker     EGLBoolean ret;
429*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.egl.surface != nullptr) {
430*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
431*e1eccf28SAndroid Build Coastguard Worker         ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
432*e1eccf28SAndroid Build Coastguard Worker                              dc->gl.egl.surfaceDefault, dc->gl.egl.context);
433*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglMakeCurrent", ret);
434*e1eccf28SAndroid Build Coastguard Worker 
435*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__);
436*e1eccf28SAndroid Build Coastguard Worker         ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
437*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglDestroySurface", ret);
438*e1eccf28SAndroid Build Coastguard Worker 
439*e1eccf28SAndroid Build Coastguard Worker         dc->gl.egl.surface = nullptr;
440*e1eccf28SAndroid Build Coastguard Worker     }
441*e1eccf28SAndroid Build Coastguard Worker 
442*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.currentWndSurface != nullptr) {
443*e1eccf28SAndroid Build Coastguard Worker         ANativeWindow_release(dc->gl.currentWndSurface);
444*e1eccf28SAndroid Build Coastguard Worker     }
445*e1eccf28SAndroid Build Coastguard Worker 
446*e1eccf28SAndroid Build Coastguard Worker     dc->gl.currentWndSurface = (ANativeWindow *)sur;
447*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.currentWndSurface != nullptr) {
448*e1eccf28SAndroid Build Coastguard Worker         ANativeWindow_acquire(dc->gl.currentWndSurface);
449*e1eccf28SAndroid Build Coastguard Worker 
450*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__);
451*e1eccf28SAndroid Build Coastguard Worker         dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
452*e1eccf28SAndroid Build Coastguard Worker                                                     dc->gl.currentWndSurface, nullptr);
453*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglCreateWindowSurface");
454*e1eccf28SAndroid Build Coastguard Worker         if (dc->gl.egl.surface == EGL_NO_SURFACE) {
455*e1eccf28SAndroid Build Coastguard Worker             ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
456*e1eccf28SAndroid Build Coastguard Worker         }
457*e1eccf28SAndroid Build Coastguard Worker 
458*e1eccf28SAndroid Build Coastguard Worker         rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
459*e1eccf28SAndroid Build Coastguard Worker         ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface,
460*e1eccf28SAndroid Build Coastguard Worker                              dc->gl.egl.surface, dc->gl.egl.context);
461*e1eccf28SAndroid Build Coastguard Worker         checkEglError("eglMakeCurrent", ret);
462*e1eccf28SAndroid Build Coastguard Worker     }
463*e1eccf28SAndroid Build Coastguard Worker     rsc->setWatchdogGL(nullptr, 0, nullptr);
464*e1eccf28SAndroid Build Coastguard Worker     return true;
465*e1eccf28SAndroid Build Coastguard Worker }
466*e1eccf28SAndroid Build Coastguard Worker 
rsdGLSetSurface(const Context * rsc,uint32_t w,uint32_t h,RsNativeWindow sur)467*e1eccf28SAndroid Build Coastguard Worker bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
468*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
469*e1eccf28SAndroid Build Coastguard Worker 
470*e1eccf28SAndroid Build Coastguard Worker     if (dc->gl.wndSurface != nullptr) {
471*e1eccf28SAndroid Build Coastguard Worker         ANativeWindow_release(dc->gl.wndSurface);
472*e1eccf28SAndroid Build Coastguard Worker         dc->gl.wndSurface = nullptr;
473*e1eccf28SAndroid Build Coastguard Worker     }
474*e1eccf28SAndroid Build Coastguard Worker     if(w && h) {
475*e1eccf28SAndroid Build Coastguard Worker         // WAR: Some drivers fail to handle 0 size surfaces correctly. Use the
476*e1eccf28SAndroid Build Coastguard Worker         // pbuffer to avoid this pitfall.
477*e1eccf28SAndroid Build Coastguard Worker         dc->gl.wndSurface = (ANativeWindow *)sur;
478*e1eccf28SAndroid Build Coastguard Worker         if (dc->gl.wndSurface != nullptr) {
479*e1eccf28SAndroid Build Coastguard Worker             ANativeWindow_acquire(dc->gl.wndSurface);
480*e1eccf28SAndroid Build Coastguard Worker         }
481*e1eccf28SAndroid Build Coastguard Worker     }
482*e1eccf28SAndroid Build Coastguard Worker 
483*e1eccf28SAndroid Build Coastguard Worker     return rsdGLSetInternalSurface(rsc, sur);
484*e1eccf28SAndroid Build Coastguard Worker }
485*e1eccf28SAndroid Build Coastguard Worker 
rsdGLSwap(const android::renderscript::Context * rsc)486*e1eccf28SAndroid Build Coastguard Worker void rsdGLSwap(const android::renderscript::Context *rsc) {
487*e1eccf28SAndroid Build Coastguard Worker     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
488*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
489*e1eccf28SAndroid Build Coastguard Worker }
490*e1eccf28SAndroid Build Coastguard Worker 
rsdGLSetPriority(const Context * rsc,int32_t priority)491*e1eccf28SAndroid Build Coastguard Worker void rsdGLSetPriority(const Context *rsc, int32_t priority) {
492*e1eccf28SAndroid Build Coastguard Worker     if (priority > 0) {
493*e1eccf28SAndroid Build Coastguard Worker         // Mark context as low priority.
494*e1eccf28SAndroid Build Coastguard Worker         ALOGV("low pri");
495*e1eccf28SAndroid Build Coastguard Worker     } else {
496*e1eccf28SAndroid Build Coastguard Worker         ALOGV("normal pri");
497*e1eccf28SAndroid Build Coastguard Worker     }
498*e1eccf28SAndroid Build Coastguard Worker }
499*e1eccf28SAndroid Build Coastguard Worker 
rsdGLCheckError(const android::renderscript::Context * rsc,const char * msg,bool isFatal)500*e1eccf28SAndroid Build Coastguard Worker void rsdGLCheckError(const android::renderscript::Context *rsc,
501*e1eccf28SAndroid Build Coastguard Worker                      const char *msg, bool isFatal) {
502*e1eccf28SAndroid Build Coastguard Worker     GLenum err = glGetError();
503*e1eccf28SAndroid Build Coastguard Worker     if (err != GL_NO_ERROR) {
504*e1eccf28SAndroid Build Coastguard Worker         char buf[1024];
505*e1eccf28SAndroid Build Coastguard Worker         snprintf(buf, sizeof(buf), "GL Error = 0x%08x, from: %s", err, msg);
506*e1eccf28SAndroid Build Coastguard Worker 
507*e1eccf28SAndroid Build Coastguard Worker         if (isFatal) {
508*e1eccf28SAndroid Build Coastguard Worker             rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
509*e1eccf28SAndroid Build Coastguard Worker         } else {
510*e1eccf28SAndroid Build Coastguard Worker             switch (err) {
511*e1eccf28SAndroid Build Coastguard Worker             case GL_OUT_OF_MEMORY:
512*e1eccf28SAndroid Build Coastguard Worker                 rsc->setError(RS_ERROR_OUT_OF_MEMORY, buf);
513*e1eccf28SAndroid Build Coastguard Worker                 break;
514*e1eccf28SAndroid Build Coastguard Worker             default:
515*e1eccf28SAndroid Build Coastguard Worker                 rsc->setError(RS_ERROR_DRIVER, buf);
516*e1eccf28SAndroid Build Coastguard Worker                 break;
517*e1eccf28SAndroid Build Coastguard Worker             }
518*e1eccf28SAndroid Build Coastguard Worker         }
519*e1eccf28SAndroid Build Coastguard Worker 
520*e1eccf28SAndroid Build Coastguard Worker         ALOGE("%p, %s", rsc, buf);
521*e1eccf28SAndroid Build Coastguard Worker     }
522*e1eccf28SAndroid Build Coastguard Worker 
523*e1eccf28SAndroid Build Coastguard Worker }
524*e1eccf28SAndroid Build Coastguard Worker 
rsdGLClearColor(const android::renderscript::Context * rsc,float r,float g,float b,float a)525*e1eccf28SAndroid Build Coastguard Worker void rsdGLClearColor(const android::renderscript::Context *rsc,
526*e1eccf28SAndroid Build Coastguard Worker                      float r, float g, float b, float a) {
527*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glClearColor, r, g, b, a);
528*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
529*e1eccf28SAndroid Build Coastguard Worker }
530*e1eccf28SAndroid Build Coastguard Worker 
rsdGLClearDepth(const android::renderscript::Context * rsc,float v)531*e1eccf28SAndroid Build Coastguard Worker void rsdGLClearDepth(const android::renderscript::Context *rsc, float v) {
532*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glClearDepthf, v);
533*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
534*e1eccf28SAndroid Build Coastguard Worker }
535*e1eccf28SAndroid Build Coastguard Worker 
rsdGLFinish(const android::renderscript::Context * rsc)536*e1eccf28SAndroid Build Coastguard Worker void rsdGLFinish(const android::renderscript::Context *rsc) {
537*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glFinish);
538*e1eccf28SAndroid Build Coastguard Worker }
539*e1eccf28SAndroid Build Coastguard Worker 
rsdGLDrawQuadTexCoords(const android::renderscript::Context * rsc,float x1,float y1,float z1,float u1,float v1,float x2,float y2,float z2,float u2,float v2,float x3,float y3,float z3,float u3,float v3,float x4,float y4,float z4,float u4,float v4)540*e1eccf28SAndroid Build Coastguard Worker void rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc,
541*e1eccf28SAndroid Build Coastguard Worker                             float x1, float y1, float z1, float u1, float v1,
542*e1eccf28SAndroid Build Coastguard Worker                             float x2, float y2, float z2, float u2, float v2,
543*e1eccf28SAndroid Build Coastguard Worker                             float x3, float y3, float z3, float u3, float v3,
544*e1eccf28SAndroid Build Coastguard Worker                             float x4, float y4, float z4, float u4, float v4) {
545*e1eccf28SAndroid Build Coastguard Worker 
546*e1eccf28SAndroid Build Coastguard Worker     float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
547*e1eccf28SAndroid Build Coastguard Worker     const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
548*e1eccf28SAndroid Build Coastguard Worker 
549*e1eccf28SAndroid Build Coastguard Worker     RsdVertexArray::Attrib attribs[2];
550*e1eccf28SAndroid Build Coastguard Worker 
551*e1eccf28SAndroid Build Coastguard Worker     attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
552*e1eccf28SAndroid Build Coastguard Worker     attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
553*e1eccf28SAndroid Build Coastguard Worker 
554*e1eccf28SAndroid Build Coastguard Worker     RsdVertexArray va(attribs, 2);
555*e1eccf28SAndroid Build Coastguard Worker     va.setup(rsc);
556*e1eccf28SAndroid Build Coastguard Worker 
557*e1eccf28SAndroid Build Coastguard Worker     RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
558*e1eccf28SAndroid Build Coastguard Worker }
559