rsdGL.cpp revision b322033c13487a174bb9c26466e9684d1ff4de8d
14b3de47071d875faaa7d419d050a464b09538797Jason Sams/*
24b3de47071d875faaa7d419d050a464b09538797Jason Sams * Copyright (C) 2011 The Android Open Source Project
34b3de47071d875faaa7d419d050a464b09538797Jason Sams *
44b3de47071d875faaa7d419d050a464b09538797Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
54b3de47071d875faaa7d419d050a464b09538797Jason Sams * you may not use this file except in compliance with the License.
64b3de47071d875faaa7d419d050a464b09538797Jason Sams * You may obtain a copy of the License at
74b3de47071d875faaa7d419d050a464b09538797Jason Sams *
84b3de47071d875faaa7d419d050a464b09538797Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
94b3de47071d875faaa7d419d050a464b09538797Jason Sams *
104b3de47071d875faaa7d419d050a464b09538797Jason Sams * Unless required by applicable law or agreed to in writing, software
114b3de47071d875faaa7d419d050a464b09538797Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
124b3de47071d875faaa7d419d050a464b09538797Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b3de47071d875faaa7d419d050a464b09538797Jason Sams * See the License for the specific language governing permissions and
144b3de47071d875faaa7d419d050a464b09538797Jason Sams * limitations under the License.
154b3de47071d875faaa7d419d050a464b09538797Jason Sams */
164b3de47071d875faaa7d419d050a464b09538797Jason Sams
174b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <ui/FramebufferNativeWindow.h>
184b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <ui/PixelFormat.h>
19b8eba193f3f0d25a6156236fa80f79a5b1dc89f6Mathias Agopian
20b8eba193f3f0d25a6156236fa80f79a5b1dc89f6Mathias Agopian#include <system/window.h>
214b3de47071d875faaa7d419d050a464b09538797Jason Sams
224b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sys/types.h>
234b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sys/resource.h>
244b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sched.h>
254b3de47071d875faaa7d419d050a464b09538797Jason Sams
264b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <cutils/properties.h>
274b3de47071d875faaa7d419d050a464b09538797Jason Sams
284b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES/gl.h>
294b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES/glext.h>
304b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES2/gl2.h>
314b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES2/gl2ext.h>
324b3de47071d875faaa7d419d050a464b09538797Jason Sams
334b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <string.h>
344b3de47071d875faaa7d419d050a464b09538797Jason Sams
354b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsdCore.h"
364b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsdGL.h"
374b3de47071d875faaa7d419d050a464b09538797Jason Sams
384b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <malloc.h>
394b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsContext.h"
404edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsDevice.h"
41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdShaderCache.h"
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdVertexArray.h"
43a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk#include "rsdFrameBufferObj.h"
444b3de47071d875faaa7d419d050a464b09538797Jason Sams
455575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk#include <gui/SurfaceTextureClient.h>
468ce904d48f335650596e0e22e34c45a3dcc3cb4bDaniel Lam#include <gui/DummyConsumer.h>
475575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk
484b3de47071d875faaa7d419d050a464b09538797Jason Samsusing namespace android;
494b3de47071d875faaa7d419d050a464b09538797Jason Samsusing namespace android::renderscript;
504b3de47071d875faaa7d419d050a464b09538797Jason Sams
514b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic int32_t gGLContextCount = 0;
524b3de47071d875faaa7d419d050a464b09538797Jason Sams
534b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
54e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian    struct EGLUtils {
55e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian        static const char *strerror(EGLint err) {
56e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian            switch (err){
57e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_SUCCESS:           return "EGL_SUCCESS";
58e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
59e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
60e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
61e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
62e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
63e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
64e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
65e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
66e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
67e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
68e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
69e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
70e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
71e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
72e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                default: return "UNKNOWN";
73e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian            }
74e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian        }
75e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian    };
76e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian
774b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (returnVal != EGL_TRUE) {
784b3de47071d875faaa7d419d050a464b09538797Jason Sams        fprintf(stderr, "%s() returned %d\n", op, returnVal);
794b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
804b3de47071d875faaa7d419d050a464b09538797Jason Sams
814b3de47071d875faaa7d419d050a464b09538797Jason Sams    for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
824b3de47071d875faaa7d419d050a464b09538797Jason Sams            = eglGetError()) {
834b3de47071d875faaa7d419d050a464b09538797Jason Sams        fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
844b3de47071d875faaa7d419d050a464b09538797Jason Sams                error);
854b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
864b3de47071d875faaa7d419d050a464b09538797Jason Sams}
874b3de47071d875faaa7d419d050a464b09538797Jason Sams
884b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
894b3de47071d875faaa7d419d050a464b09538797Jason Sams
904b3de47071d875faaa7d419d050a464b09538797Jason Sams#define X(VAL) {VAL, #VAL}
914b3de47071d875faaa7d419d050a464b09538797Jason Sams    struct {EGLint attribute; const char* name;} names[] = {
924b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BUFFER_SIZE),
934b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_ALPHA_SIZE),
944b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BLUE_SIZE),
954b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_GREEN_SIZE),
964b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_RED_SIZE),
974b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_DEPTH_SIZE),
984b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_STENCIL_SIZE),
994b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFIG_CAVEAT),
1004b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFIG_ID),
1014b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_LEVEL),
1024b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_HEIGHT),
1034b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_PIXELS),
1044b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_WIDTH),
1054b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_RENDERABLE),
1064b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_VISUAL_ID),
1074b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_VISUAL_TYPE),
1084b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SAMPLES),
1094b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SAMPLE_BUFFERS),
1104b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SURFACE_TYPE),
1114b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_TYPE),
1124b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_RED_VALUE),
1134b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_GREEN_VALUE),
1144b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_BLUE_VALUE),
1154b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BIND_TO_TEXTURE_RGB),
1164b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BIND_TO_TEXTURE_RGBA),
1174b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MIN_SWAP_INTERVAL),
1184b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_SWAP_INTERVAL),
1194b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_LUMINANCE_SIZE),
1204b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_ALPHA_MASK_SIZE),
1214b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_COLOR_BUFFER_TYPE),
1224b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_RENDERABLE_TYPE),
1234b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFORMANT),
1244b3de47071d875faaa7d419d050a464b09538797Jason Sams   };
1254b3de47071d875faaa7d419d050a464b09538797Jason Sams#undef X
1264b3de47071d875faaa7d419d050a464b09538797Jason Sams
1274b3de47071d875faaa7d419d050a464b09538797Jason Sams    for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) {
1284b3de47071d875faaa7d419d050a464b09538797Jason Sams        EGLint value = -1;
12967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        EGLBoolean returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value);
13067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        if (returnVal) {
1316598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block            ALOGV(" %s: %d (0x%x)", names[j].name, value, value);
1324b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
1334b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1344b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1354b3de47071d875faaa7d419d050a464b09538797Jason Sams
13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void DumpDebug(RsdHal *dc) {
137af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
138af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" EGL context %p  surface %p,  Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
1394b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.egl.display);
140af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL vendor: %s", dc->gl.gl.vendor);
141af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL renderer: %s", dc->gl.gl.renderer);
142af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL Version: %s", dc->gl.gl.version);
143af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL Extensions: %s", dc->gl.gl.extensions);
144af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
1454b3de47071d875faaa7d419d050a464b09538797Jason Sams
1466598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Textures %i, %i  %i", dc->gl.gl.maxVertexTextureUnits,
1474b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits);
1486598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Attribs %i", dc->gl.gl.maxVertexAttribs);
1496598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Uniforms %i, %i", dc->gl.gl.maxVertexUniformVectors,
1504b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.gl.maxFragmentUniformVectors);
1516598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Varyings %i", dc->gl.gl.maxVaryingVectors);
1524b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1534b3de47071d875faaa7d419d050a464b09538797Jason Sams
1544b3de47071d875faaa7d419d050a464b09538797Jason Samsvoid rsdGLShutdown(const Context *rsc) {
15587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1564b3de47071d875faaa7d419d050a464b09538797Jason Sams
157a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache->cleanupAll();
158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    delete dc->gl.shaderCache;
159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    delete dc->gl.vertexArrayState;
160a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
1614b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.context != EGL_NO_CONTEXT) {
1622382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
1632382aba4a55c6ae74789c478eead8fbd96593321Jason Sams                    EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
1642382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault);
1654b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (dc->gl.egl.surface != EGL_NO_SURFACE) {
1662382aba4a55c6ae74789c478eead8fbd96593321Jason Sams            RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface);
1674b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
1682382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context);
1694b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglDestroyContext");
1704b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1714b3de47071d875faaa7d419d050a464b09538797Jason Sams
1724b3de47071d875faaa7d419d050a464b09538797Jason Sams    gGLContextCount--;
1734b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (!gGLContextCount) {
1742382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglTerminate, dc->gl.egl.display);
1754b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1764b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1774b3de47071d875faaa7d419d050a464b09538797Jason Sams
178da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchoukvoid getConfigData(const Context *rsc,
179da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk                   EGLint *configAttribs, size_t configAttribsLen,
180da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk                   uint32_t numSamples) {
181da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs));
1824b3de47071d875faaa7d419d050a464b09538797Jason Sams
1834b3de47071d875faaa7d419d050a464b09538797Jason Sams    EGLint *configAttribsPtr = configAttribs;
1844b3de47071d875faaa7d419d050a464b09538797Jason Sams
1854b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_SURFACE_TYPE;
1864b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[1] = EGL_WINDOW_BIT;
1874b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr += 2;
1884b3de47071d875faaa7d419d050a464b09538797Jason Sams
1894b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_RENDERABLE_TYPE;
1904b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[1] = EGL_OPENGL_ES2_BIT;
1914b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr += 2;
1924b3de47071d875faaa7d419d050a464b09538797Jason Sams
19367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_RED_SIZE;
19467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
19567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
19667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
19767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_GREEN_SIZE;
19867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
19967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
20067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
20167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_BLUE_SIZE;
20267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
20367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
20467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
20567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    if (rsc->mUserSurfaceConfig.alphaMin > 0) {
20667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr[0] = EGL_ALPHA_SIZE;
20767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr[1] = rsc->mUserSurfaceConfig.alphaMin;
20867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr += 2;
20967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    }
21067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2114b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (rsc->mUserSurfaceConfig.depthMin > 0) {
2124b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[0] = EGL_DEPTH_SIZE;
2134b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[1] = rsc->mUserSurfaceConfig.depthMin;
2144b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr += 2;
2154b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
2164b3de47071d875faaa7d419d050a464b09538797Jason Sams
2174b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (rsc->mDev->mForceSW) {
2184b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[0] = EGL_CONFIG_CAVEAT;
2194b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[1] = EGL_SLOW_CONFIG;
2204b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr += 2;
2214b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
2224b3de47071d875faaa7d419d050a464b09538797Jason Sams
223da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    if (numSamples > 1) {
224da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[0] = EGL_SAMPLE_BUFFERS;
225da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[1] = 1;
226da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[2] = EGL_SAMPLES;
227da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[3] = numSamples;
228da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr += 4;
229da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    }
230da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
2314b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_NONE;
232da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    rsAssert(configAttribsPtr < (configAttribs + configAttribsLen));
233da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk}
234da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
235da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchoukbool rsdGLInit(const Context *rsc) {
236da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
237da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
238da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    dc->gl.egl.numConfigs = -1;
239da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
240da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    EGLint configAttribs[128];
241da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
2424b3de47071d875faaa7d419d050a464b09538797Jason Sams
2436598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%p initEGL start", rsc);
2442382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
2454b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
2464b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglGetDisplay");
2474b3de47071d875faaa7d419d050a464b09538797Jason Sams
2482382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(eglInitialize, dc->gl.egl.display,
2492382aba4a55c6ae74789c478eead8fbd96593321Jason Sams                &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
2504b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglInitialize");
2514b3de47071d875faaa7d419d050a464b09538797Jason Sams
25267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    EGLBoolean ret;
25367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
25467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    EGLint numConfigs = -1, n = 0;
2552382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
256da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
257da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    // Try minding a multisample config that matches the user request
258da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin;
259da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref;
260da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) {
261da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount);
262da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
263da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        checkEglError("eglGetConfigs", ret);
264da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        if (numConfigs > 0) {
265da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk            break;
266da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        }
267da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    }
26867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2695f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams    eglSwapInterval(dc->gl.egl.display, 0);
2705f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
27167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    if (numConfigs) {
27267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        EGLConfig* const configs = new EGLConfig[numConfigs];
27367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2742382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
27567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        ret = eglChooseConfig(dc->gl.egl.display,
27667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                configAttribs, configs, numConfigs, &n);
27767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        if (!ret || !n) {
27867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            checkEglError("eglChooseConfig", ret);
279af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
28067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        }
28167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
28267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        // The first config is guaranteed to over-satisfy the constraints
28367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        dc->gl.egl.config = configs[0];
28467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
28567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        // go through the list and skip configs that over-satisfy our needs
28667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        for (int i=0 ; i<n ; i++) {
28767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            if (rsc->mUserSurfaceConfig.alphaMin <= 0) {
28867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                EGLint alphaSize;
28967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                eglGetConfigAttrib(dc->gl.egl.display,
29067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                        configs[i], EGL_ALPHA_SIZE, &alphaSize);
29167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                if (alphaSize > 0) {
29267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                    continue;
29367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                }
29467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            }
29567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
29667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            if (rsc->mUserSurfaceConfig.depthMin <= 0) {
29767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                EGLint depthSize;
29867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                eglGetConfigAttrib(dc->gl.egl.display,
29967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                        configs[i], EGL_DEPTH_SIZE, &depthSize);
30067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                if (depthSize > 0) {
30167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                    continue;
30267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                }
30367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            }
30467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
30567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            // Found one!
30667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            dc->gl.egl.config = configs[i];
30767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            break;
30867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        }
3094b3de47071d875faaa7d419d050a464b09538797Jason Sams
31067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        delete [] configs;
3114b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
31267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
3134b3de47071d875faaa7d419d050a464b09538797Jason Sams    //if (props.mLogVisual) {
3149db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    if (0) {
3154b3de47071d875faaa7d419d050a464b09538797Jason Sams        printEGLConfiguration(dc->gl.egl.display, dc->gl.egl.config);
3169db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    }
3174b3de47071d875faaa7d419d050a464b09538797Jason Sams    //}
3184b3de47071d875faaa7d419d050a464b09538797Jason Sams
3192382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__);
3204b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config,
3214b3de47071d875faaa7d419d050a464b09538797Jason Sams                                          EGL_NO_CONTEXT, context_attribs2);
3224b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglCreateContext");
3234b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.context == EGL_NO_CONTEXT) {
324af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
3252382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL(NULL, 0, NULL);
3264b3de47071d875faaa7d419d050a464b09538797Jason Sams        return false;
3274b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3284b3de47071d875faaa7d419d050a464b09538797Jason Sams    gGLContextCount++;
3294b3de47071d875faaa7d419d050a464b09538797Jason Sams
3308ce904d48f335650596e0e22e34c45a3dcc3cb4bDaniel Lam    // Create a BufferQueue with a fake consumer
3318ce904d48f335650596e0e22e34c45a3dcc3cb4bDaniel Lam    sp<BufferQueue> bq = new BufferQueue();
3320e8435acf07e1a77a4561899fa9fa17092931ecdDaniel Lam    bq->consumerConnect(new DummyConsumer());
3338ce904d48f335650596e0e22e34c45a3dcc3cb4bDaniel Lam    sp<SurfaceTextureClient> stc(new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >(bq)));
3348ce904d48f335650596e0e22e34c45a3dcc3cb4bDaniel Lam
3355575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk    dc->gl.egl.surfaceDefault = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
3365575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk                                                       static_cast<ANativeWindow*>(stc.get()),
3375575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk                                                       NULL);
3384b3de47071d875faaa7d419d050a464b09538797Jason Sams
3395575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk    checkEglError("eglCreateWindowSurface");
3404b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
3415575cf16fa6e263ead96526683aed2f2cfd8ac96Alex Sakhartchouk        ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
3424b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
3432382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL(NULL, 0, NULL);
3444b3de47071d875faaa7d419d050a464b09538797Jason Sams        return false;
3454b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3464b3de47071d875faaa7d419d050a464b09538797Jason Sams
3472382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
34867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
34967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                         dc->gl.egl.surfaceDefault, dc->gl.egl.context);
3504b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (ret == EGL_FALSE) {
351af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("eglMakeCurrent returned EGL_FALSE");
3524b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
3534b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
3542382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL(NULL, 0, NULL);
3554b3de47071d875faaa7d419d050a464b09538797Jason Sams        return false;
3564b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3574b3de47071d875faaa7d419d050a464b09538797Jason Sams
3584b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.version = glGetString(GL_VERSION);
3594b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.vendor = glGetString(GL_VENDOR);
3604b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.renderer = glGetString(GL_RENDERER);
3614b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.extensions = glGetString(GL_EXTENSIONS);
3624b3de47071d875faaa7d419d050a464b09538797Jason Sams
3636598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion);
3646598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Version %s", mGL.mVersion);
3656598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Vendor %s", mGL.mVendor);
3666598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Renderer %s", mGL.mRenderer);
3676598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Extensions %s", mGL.mExtensions);
3684b3de47071d875faaa7d419d050a464b09538797Jason Sams
3694b3de47071d875faaa7d419d050a464b09538797Jason Sams    const char *verptr = NULL;
3704b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (strlen((const char *)dc->gl.gl.version) > 9) {
3714b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (!memcmp(dc->gl.gl.version, "OpenGL ES-CM", 12)) {
3724b3de47071d875faaa7d419d050a464b09538797Jason Sams            verptr = (const char *)dc->gl.gl.version + 12;
3734b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
3744b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (!memcmp(dc->gl.gl.version, "OpenGL ES ", 10)) {
3754b3de47071d875faaa7d419d050a464b09538797Jason Sams            verptr = (const char *)dc->gl.gl.version + 9;
3764b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
3774b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3784b3de47071d875faaa7d419d050a464b09538797Jason Sams
3794b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (!verptr) {
380af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error, OpenGL ES Lite not supported");
3814b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
3822382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL(NULL, 0, NULL);
3834b3de47071d875faaa7d419d050a464b09538797Jason Sams        return false;
3844b3de47071d875faaa7d419d050a464b09538797Jason Sams    } else {
3854b3de47071d875faaa7d419d050a464b09538797Jason Sams        sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion);
3864b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3874b3de47071d875faaa7d419d050a464b09538797Jason Sams
3884b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &dc->gl.gl.maxVertexAttribs);
3894b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &dc->gl.gl.maxVertexUniformVectors);
3904b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxVertexTextureUnits);
3914b3de47071d875faaa7d419d050a464b09538797Jason Sams
3924b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VARYING_VECTORS, &dc->gl.gl.maxVaryingVectors);
3934b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxTextureImageUnits);
3944b3de47071d875faaa7d419d050a464b09538797Jason Sams
3954b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxFragmentTextureImageUnits);
3964b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &dc->gl.gl.maxFragmentUniformVectors);
3974b3de47071d875faaa7d419d050a464b09538797Jason Sams
3984b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.OES_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions,
3994b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                "GL_OES_texture_npot");
400917027582745bbf27335a70360a4e6da51961978Mathias Agopian    dc->gl.gl.IMG_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions,
4014b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                   "GL_IMG_texture_npot");
402917027582745bbf27335a70360a4e6da51961978Mathias Agopian    dc->gl.gl.NV_texture_npot_2D_mipmap = NULL != strstr((const char *)dc->gl.gl.extensions,
4034b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                            "GL_NV_texture_npot_2D_mipmap");
4044b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.EXT_texture_max_aniso = 1.0f;
4054b3de47071d875faaa7d419d050a464b09538797Jason Sams    bool hasAniso = NULL != strstr((const char *)dc->gl.gl.extensions,
4064b3de47071d875faaa7d419d050a464b09538797Jason Sams                                   "GL_EXT_texture_filter_anisotropic");
4074b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (hasAniso) {
4084b3de47071d875faaa7d419d050a464b09538797Jason Sams        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dc->gl.gl.EXT_texture_max_aniso);
4094b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
4104b3de47071d875faaa7d419d050a464b09538797Jason Sams
4119db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    if (0) {
4129db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines        DumpDebug(dc);
4139db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    }
4144b3de47071d875faaa7d419d050a464b09538797Jason Sams
415a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache = new RsdShaderCache();
416a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.vertexArrayState = new RsdVertexArrayState();
417a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs);
418a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk    dc->gl.currentFrameBuffer = NULL;
4199719bd4a0187c400ba868712612fe66da4635aacJason Sams    dc->mHasGraphics = true;
420a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
4216598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%p initGLThread end", rsc);
4222382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL(NULL, 0, NULL);
4234b3de47071d875faaa7d419d050a464b09538797Jason Sams    return true;
4244b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4254b3de47071d875faaa7d419d050a464b09538797Jason Sams
4264b3de47071d875faaa7d419d050a464b09538797Jason Sams
427b322033c13487a174bb9c26466e9684d1ff4de8dJason Samsbool rsdGLSetInternalSurface(const Context *rsc, RsNativeWindow sur) {
42887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
4294b3de47071d875faaa7d419d050a464b09538797Jason Sams
4304b3de47071d875faaa7d419d050a464b09538797Jason Sams    EGLBoolean ret;
431b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if (dc->gl.egl.surface != NULL) {
4322382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
4334b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
4344b3de47071d875faaa7d419d050a464b09538797Jason Sams                             dc->gl.egl.surfaceDefault, dc->gl.egl.context);
4354b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
4364b3de47071d875faaa7d419d050a464b09538797Jason Sams
4372382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__);
4384b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
4394b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglDestroySurface", ret);
4404b3de47071d875faaa7d419d050a464b09538797Jason Sams
4414b3de47071d875faaa7d419d050a464b09538797Jason Sams        dc->gl.egl.surface = NULL;
4424b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
4434b3de47071d875faaa7d419d050a464b09538797Jason Sams
444b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if (dc->gl.currentWndSurface != NULL) {
445b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.currentWndSurface->decStrong(NULL);
446c33e6903d25b9cd9d88f45c7320534a5a05c9064Jason Sams    }
447c33e6903d25b9cd9d88f45c7320534a5a05c9064Jason Sams
448b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    dc->gl.currentWndSurface = (ANativeWindow *)sur;
449b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if (dc->gl.currentWndSurface != NULL) {
450b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.currentWndSurface->incStrong(NULL);
4514b3de47071d875faaa7d419d050a464b09538797Jason Sams
4522382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__);
4534b3de47071d875faaa7d419d050a464b09538797Jason Sams        dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
454b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams                                                    dc->gl.currentWndSurface, NULL);
4554b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglCreateWindowSurface");
4564b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (dc->gl.egl.surface == EGL_NO_SURFACE) {
457af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
4584b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
4594b3de47071d875faaa7d419d050a464b09538797Jason Sams
4602382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
4614b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface,
4624b3de47071d875faaa7d419d050a464b09538797Jason Sams                             dc->gl.egl.surface, dc->gl.egl.context);
4634b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
4644b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
4652382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL(NULL, 0, NULL);
4664b3de47071d875faaa7d419d050a464b09538797Jason Sams    return true;
4674b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4684b3de47071d875faaa7d419d050a464b09538797Jason Sams
469b322033c13487a174bb9c26466e9684d1ff4de8dJason Samsbool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
470b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
471b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
472b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if (dc->gl.wndSurface != NULL) {
473b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.wndSurface->decStrong(NULL);
474b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.wndSurface = NULL;
475b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    }
476b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if(w && h) {
477b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        // WAR: Some drivers fail to handle 0 size surfaces correctly. Use the
478b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        // pbuffer to avoid this pitfall.
479b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.wndSurface = (ANativeWindow *)sur;
480b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        if (dc->gl.wndSurface != NULL) {
481b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams            dc->gl.wndSurface->incStrong(NULL);
482b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        }
483b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    }
484b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
485b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    return rsdGLSetInternalSurface(rsc, sur);
486b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams}
487b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
4884b3de47071d875faaa7d419d050a464b09538797Jason Samsvoid rsdGLSwap(const android::renderscript::Context *rsc) {
48987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
4902382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
4914b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4924b3de47071d875faaa7d419d050a464b09538797Jason Sams
4939719bd4a0187c400ba868712612fe66da4635aacJason Samsvoid rsdGLSetPriority(const Context *rsc, int32_t priority) {
4949719bd4a0187c400ba868712612fe66da4635aacJason Sams    if (priority > 0) {
4959719bd4a0187c400ba868712612fe66da4635aacJason Sams        // Mark context as low priority.
4969719bd4a0187c400ba868712612fe66da4635aacJason Sams        ALOGV("low pri");
4979719bd4a0187c400ba868712612fe66da4635aacJason Sams    } else {
4989719bd4a0187c400ba868712612fe66da4635aacJason Sams        ALOGV("normal pri");
4999719bd4a0187c400ba868712612fe66da4635aacJason Sams    }
5009719bd4a0187c400ba868712612fe66da4635aacJason Sams}
5019719bd4a0187c400ba868712612fe66da4635aacJason Sams
502c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid rsdGLCheckError(const android::renderscript::Context *rsc,
503c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                     const char *msg, bool isFatal) {
504c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    GLenum err = glGetError();
505c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    if (err != GL_NO_ERROR) {
506c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        char buf[1024];
507c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        snprintf(buf, sizeof(buf), "GL Error = 0x%08x, from: %s", err, msg);
508c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
509c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        if (isFatal) {
510c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
511c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        } else {
512c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            switch (err) {
513c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            case GL_OUT_OF_MEMORY:
514c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                rsc->setError(RS_ERROR_OUT_OF_MEMORY, buf);
515c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                break;
516c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            default:
517c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                rsc->setError(RS_ERROR_DRIVER, buf);
518c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                break;
519c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            }
520c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        }
521c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
522af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("%p, %s", rsc, buf);
523c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    }
524c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
525c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk}
526653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
527653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLClearColor(const android::renderscript::Context *rsc,
528653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                     float r, float g, float b, float a) {
529653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClearColor, r, g, b, a);
530653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
531653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
532653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
533653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLClearDepth(const android::renderscript::Context *rsc, float v) {
534653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClearDepthf, v);
535653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
536653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
537653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
538653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLFinish(const android::renderscript::Context *rsc) {
539653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glFinish);
540653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
541653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
542653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc,
543653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x1, float y1, float z1, float u1, float v1,
544653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x2, float y2, float z2, float u2, float v2,
545653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x3, float y3, float z3, float u3, float v3,
546653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x4, float y4, float z4, float u4, float v4) {
547653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
548653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
549653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
550653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
551653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RsdVertexArray::Attrib attribs[2];
552653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
553653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
554653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
555653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RsdVertexArray va(attribs, 2);
556653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    va.setup(rsc);
557653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
558653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
559653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
560