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