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
17b8eba193f3f0d25a6156236fa80f79a5b1dc89f6Mathias Agopian#include <system/window.h>
184b3de47071d875faaa7d419d050a464b09538797Jason Sams
194b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sys/types.h>
204b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sys/resource.h>
214b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <sched.h>
224b3de47071d875faaa7d419d050a464b09538797Jason Sams
23025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang#define EGL_EGLEXT_PROTOTYPES
24025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang#include <EGL/egl.h>
25025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang#include <EGL/eglext.h>
264b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES/gl.h>
274b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES/glext.h>
284b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES2/gl2.h>
294b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <GLES2/gl2ext.h>
304b3de47071d875faaa7d419d050a464b09538797Jason Sams
314b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <string.h>
324b3de47071d875faaa7d419d050a464b09538797Jason Sams
334b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsdCore.h"
344b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsdGL.h"
354b3de47071d875faaa7d419d050a464b09538797Jason Sams
364b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <malloc.h>
374b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsContext.h"
384edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsDevice.h"
39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdShaderCache.h"
40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdVertexArray.h"
41a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk#include "rsdFrameBufferObj.h"
424b3de47071d875faaa7d419d050a464b09538797Jason Sams
43e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Context;
444b3de47071d875faaa7d419d050a464b09538797Jason Sams
454b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic int32_t gGLContextCount = 0;
464b3de47071d875faaa7d419d050a464b09538797Jason Sams
474b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
48e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian    struct EGLUtils {
49e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian        static const char *strerror(EGLint err) {
50e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian            switch (err){
51e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_SUCCESS:           return "EGL_SUCCESS";
52e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
53e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
54e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
55e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
56e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
57e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
58e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
59e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
60e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
61e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
62e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
63e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
64e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
65e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
66e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian                default: return "UNKNOWN";
67e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian            }
68e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian        }
69e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian    };
70e255929025c4ec3fd91518350e3e7b447c745529Mathias Agopian
714b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (returnVal != EGL_TRUE) {
724b3de47071d875faaa7d419d050a464b09538797Jason Sams        fprintf(stderr, "%s() returned %d\n", op, returnVal);
734b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
744b3de47071d875faaa7d419d050a464b09538797Jason Sams
754b3de47071d875faaa7d419d050a464b09538797Jason Sams    for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
764b3de47071d875faaa7d419d050a464b09538797Jason Sams            = eglGetError()) {
774b3de47071d875faaa7d419d050a464b09538797Jason Sams        fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
784b3de47071d875faaa7d419d050a464b09538797Jason Sams                error);
794b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
804b3de47071d875faaa7d419d050a464b09538797Jason Sams}
814b3de47071d875faaa7d419d050a464b09538797Jason Sams
824b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
834b3de47071d875faaa7d419d050a464b09538797Jason Sams
844b3de47071d875faaa7d419d050a464b09538797Jason Sams#define X(VAL) {VAL, #VAL}
854b3de47071d875faaa7d419d050a464b09538797Jason Sams    struct {EGLint attribute; const char* name;} names[] = {
864b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BUFFER_SIZE),
874b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_ALPHA_SIZE),
884b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BLUE_SIZE),
894b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_GREEN_SIZE),
904b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_RED_SIZE),
914b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_DEPTH_SIZE),
924b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_STENCIL_SIZE),
934b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFIG_CAVEAT),
944b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFIG_ID),
954b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_LEVEL),
964b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_HEIGHT),
974b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_PIXELS),
984b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_PBUFFER_WIDTH),
994b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_RENDERABLE),
1004b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_VISUAL_ID),
1014b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_NATIVE_VISUAL_TYPE),
1024b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SAMPLES),
1034b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SAMPLE_BUFFERS),
1044b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_SURFACE_TYPE),
1054b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_TYPE),
1064b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_RED_VALUE),
1074b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_GREEN_VALUE),
1084b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_TRANSPARENT_BLUE_VALUE),
1094b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BIND_TO_TEXTURE_RGB),
1104b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_BIND_TO_TEXTURE_RGBA),
1114b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MIN_SWAP_INTERVAL),
1124b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_MAX_SWAP_INTERVAL),
1134b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_LUMINANCE_SIZE),
1144b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_ALPHA_MASK_SIZE),
1154b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_COLOR_BUFFER_TYPE),
1164b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_RENDERABLE_TYPE),
1174b3de47071d875faaa7d419d050a464b09538797Jason Sams    X(EGL_CONFORMANT),
1184b3de47071d875faaa7d419d050a464b09538797Jason Sams   };
1194b3de47071d875faaa7d419d050a464b09538797Jason Sams#undef X
1204b3de47071d875faaa7d419d050a464b09538797Jason Sams
1214b3de47071d875faaa7d419d050a464b09538797Jason Sams    for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) {
1224b3de47071d875faaa7d419d050a464b09538797Jason Sams        EGLint value = -1;
12367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        EGLBoolean returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value);
12467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        if (returnVal) {
1256598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block            ALOGV(" %s: %d (0x%x)", names[j].name, value, value);
1264b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
1274b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1284b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1294b3de47071d875faaa7d419d050a464b09538797Jason Sams
13087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void DumpDebug(RsdHal *dc) {
131af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
132af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" EGL context %p  surface %p,  Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
1334b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.egl.display);
134af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL vendor: %s", dc->gl.gl.vendor);
135af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL renderer: %s", dc->gl.gl.renderer);
136af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL Version: %s", dc->gl.gl.version);
137af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL Extensions: %s", dc->gl.gl.extensions);
138af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
1394b3de47071d875faaa7d419d050a464b09538797Jason Sams
1406598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Textures %i, %i  %i", dc->gl.gl.maxVertexTextureUnits,
1414b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits);
1426598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Attribs %i", dc->gl.gl.maxVertexAttribs);
1436598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Uniforms %i, %i", dc->gl.gl.maxVertexUniformVectors,
1444b3de47071d875faaa7d419d050a464b09538797Jason Sams         dc->gl.gl.maxFragmentUniformVectors);
1456598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("MAX Varyings %i", dc->gl.gl.maxVaryingVectors);
1464b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1474b3de47071d875faaa7d419d050a464b09538797Jason Sams
1484b3de47071d875faaa7d419d050a464b09538797Jason Samsvoid rsdGLShutdown(const Context *rsc) {
14987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
1504b3de47071d875faaa7d419d050a464b09538797Jason Sams
15144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    rsdGLSetSurface(rsc, 0, 0, nullptr);
152a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache->cleanupAll();
153a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    delete dc->gl.shaderCache;
154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    delete dc->gl.vertexArrayState;
155a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
1564b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.context != EGL_NO_CONTEXT) {
1572382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
1582382aba4a55c6ae74789c478eead8fbd96593321Jason Sams                    EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
1592382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault);
1604b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (dc->gl.egl.surface != EGL_NO_SURFACE) {
1612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams            RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface);
1624b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
1632382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context);
1644b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglDestroyContext");
1654b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1664b3de47071d875faaa7d419d050a464b09538797Jason Sams
1674b3de47071d875faaa7d419d050a464b09538797Jason Sams    gGLContextCount--;
1684b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (!gGLContextCount) {
1692382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(eglTerminate, dc->gl.egl.display);
1704b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1714b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1724b3de47071d875faaa7d419d050a464b09538797Jason Sams
173da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchoukvoid getConfigData(const Context *rsc,
174da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk                   EGLint *configAttribs, size_t configAttribsLen,
175da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk                   uint32_t numSamples) {
176da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs));
1774b3de47071d875faaa7d419d050a464b09538797Jason Sams
1784b3de47071d875faaa7d419d050a464b09538797Jason Sams    EGLint *configAttribsPtr = configAttribs;
1794b3de47071d875faaa7d419d050a464b09538797Jason Sams
1804b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_SURFACE_TYPE;
181a06461be26c0807fdf3cbdf25a7e7c2d92fac96bjon.parr    configAttribsPtr[1] = EGL_PBUFFER_BIT;
1824b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr += 2;
1834b3de47071d875faaa7d419d050a464b09538797Jason Sams
1844b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_RENDERABLE_TYPE;
1854b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[1] = EGL_OPENGL_ES2_BIT;
1864b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr += 2;
1874b3de47071d875faaa7d419d050a464b09538797Jason Sams
18867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_RED_SIZE;
18967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
19067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
19167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
19267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_GREEN_SIZE;
19367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
19467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
19567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
19667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[0] = EGL_BLUE_SIZE;
19767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr[1] = 8;
19867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    configAttribsPtr += 2;
19967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
20067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    if (rsc->mUserSurfaceConfig.alphaMin > 0) {
20167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr[0] = EGL_ALPHA_SIZE;
20267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr[1] = rsc->mUserSurfaceConfig.alphaMin;
20367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        configAttribsPtr += 2;
20467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    }
20567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2064b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (rsc->mUserSurfaceConfig.depthMin > 0) {
2074b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[0] = EGL_DEPTH_SIZE;
2084b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr[1] = rsc->mUserSurfaceConfig.depthMin;
2094b3de47071d875faaa7d419d050a464b09538797Jason Sams        configAttribsPtr += 2;
2104b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
2114b3de47071d875faaa7d419d050a464b09538797Jason Sams
212da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    if (numSamples > 1) {
213da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[0] = EGL_SAMPLE_BUFFERS;
214da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[1] = 1;
215da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[2] = EGL_SAMPLES;
216da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr[3] = numSamples;
217da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        configAttribsPtr += 4;
218da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    }
219da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
2204b3de47071d875faaa7d419d050a464b09538797Jason Sams    configAttribsPtr[0] = EGL_NONE;
221da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    rsAssert(configAttribsPtr < (configAttribs + configAttribsLen));
222da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk}
223da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
224025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wangint32_t rsdGLInit(const Context *rsc) {
225da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
226da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
227da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    dc->gl.egl.numConfigs = -1;
228da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
229da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    EGLint configAttribs[128];
230da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
2314b3de47071d875faaa7d419d050a464b09538797Jason Sams
2326598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%p initEGL start", rsc);
2332382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
2344b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
2354b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglGetDisplay");
2364b3de47071d875faaa7d419d050a464b09538797Jason Sams
2372382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(eglInitialize, dc->gl.egl.display,
2382382aba4a55c6ae74789c478eead8fbd96593321Jason Sams                &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
2394b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglInitialize");
2404b3de47071d875faaa7d419d050a464b09538797Jason Sams
24167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    EGLBoolean ret;
24267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
24367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    EGLint numConfigs = -1, n = 0;
2442382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
245da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk
246da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    // Try minding a multisample config that matches the user request
247da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin;
248da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref;
249da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) {
250da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount);
251da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
252da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        checkEglError("eglGetConfigs", ret);
253da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        if (numConfigs > 0) {
254da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk            break;
255da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk        }
256da7a148171869f392b5813635532c6ed5a752912Alex Sakhartchouk    }
25767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
25867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    if (numConfigs) {
25967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        EGLConfig* const configs = new EGLConfig[numConfigs];
26067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
26267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        ret = eglChooseConfig(dc->gl.egl.display,
26367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                configAttribs, configs, numConfigs, &n);
26467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        if (!ret || !n) {
26567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            checkEglError("eglChooseConfig", ret);
266af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
26767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        }
26867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
26967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        // The first config is guaranteed to over-satisfy the constraints
27067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        dc->gl.egl.config = configs[0];
27167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
27267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        // go through the list and skip configs that over-satisfy our needs
27367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        for (int i=0 ; i<n ; i++) {
27467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            if (rsc->mUserSurfaceConfig.alphaMin <= 0) {
27567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                EGLint alphaSize;
27667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                eglGetConfigAttrib(dc->gl.egl.display,
27767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                        configs[i], EGL_ALPHA_SIZE, &alphaSize);
27867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                if (alphaSize > 0) {
27967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                    continue;
28067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                }
28167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            }
28267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
28367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            if (rsc->mUserSurfaceConfig.depthMin <= 0) {
28467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                EGLint depthSize;
28567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                eglGetConfigAttrib(dc->gl.egl.display,
28667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                        configs[i], EGL_DEPTH_SIZE, &depthSize);
28767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                if (depthSize > 0) {
28867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                    continue;
28967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                }
29067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            }
29167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
29267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            // Found one!
29367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            dc->gl.egl.config = configs[i];
29467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian            break;
29567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        }
2964b3de47071d875faaa7d419d050a464b09538797Jason Sams
29767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        delete [] configs;
2984b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
29967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
3004b3de47071d875faaa7d419d050a464b09538797Jason Sams    //if (props.mLogVisual) {
3019db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    if (0) {
3024b3de47071d875faaa7d419d050a464b09538797Jason Sams        printEGLConfiguration(dc->gl.egl.display, dc->gl.egl.config);
3039db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    }
3044b3de47071d875faaa7d419d050a464b09538797Jason Sams    //}
3054b3de47071d875faaa7d419d050a464b09538797Jason Sams
3062382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__);
3074b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config,
3084b3de47071d875faaa7d419d050a464b09538797Jason Sams                                          EGL_NO_CONTEXT, context_attribs2);
3094b3de47071d875faaa7d419d050a464b09538797Jason Sams    checkEglError("eglCreateContext");
3104b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.context == EGL_NO_CONTEXT) {
311af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
31244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsc->setWatchdogGL(nullptr, 0, nullptr);
313025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        return -1;
3144b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3154b3de47071d875faaa7d419d050a464b09538797Jason Sams    gGLContextCount++;
3164b3de47071d875faaa7d419d050a464b09538797Jason Sams
3173318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian    EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE };
3183318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian    rsc->setWatchdogGL("eglCreatePbufferSurface", __LINE__, __FILE__);
3193318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian    dc->gl.egl.surfaceDefault = eglCreatePbufferSurface(dc->gl.egl.display, dc->gl.egl.config,
3203318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian            pbuffer_attribs);
3213318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian    checkEglError("eglCreatePbufferSurface");
3224b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
3233318d1809dfce03eb876d6a2eba39018a0e7d7beMathias Agopian        ALOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
3244b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
32544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsc->setWatchdogGL(nullptr, 0, nullptr);
326025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        return -1;
3274b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3284b3de47071d875faaa7d419d050a464b09538797Jason Sams
3292382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
33067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
33167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian                         dc->gl.egl.surfaceDefault, dc->gl.egl.context);
3324b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (ret == EGL_FALSE) {
333af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("eglMakeCurrent returned EGL_FALSE");
3344b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
3354b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
33644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsc->setWatchdogGL(nullptr, 0, nullptr);
337025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        return -1;
3384b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3394b3de47071d875faaa7d419d050a464b09538797Jason Sams
3404b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.version = glGetString(GL_VERSION);
3414b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.vendor = glGetString(GL_VENDOR);
3424b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.renderer = glGetString(GL_RENDERER);
3434b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.extensions = glGetString(GL_EXTENSIONS);
3444b3de47071d875faaa7d419d050a464b09538797Jason Sams
3456598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion);
3466598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Version %s", mGL.mVersion);
3476598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Vendor %s", mGL.mVendor);
3486598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Renderer %s", mGL.mRenderer);
3496598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    //ALOGV("GL Extensions %s", mGL.mExtensions);
3504b3de47071d875faaa7d419d050a464b09538797Jason Sams
35144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    const char *verptr = nullptr;
3524b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (strlen((const char *)dc->gl.gl.version) > 9) {
3534b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (!memcmp(dc->gl.gl.version, "OpenGL ES-CM", 12)) {
3544b3de47071d875faaa7d419d050a464b09538797Jason Sams            verptr = (const char *)dc->gl.gl.version + 12;
3554b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
3564b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (!memcmp(dc->gl.gl.version, "OpenGL ES ", 10)) {
3574b3de47071d875faaa7d419d050a464b09538797Jason Sams            verptr = (const char *)dc->gl.gl.version + 9;
3584b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
3594b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3604b3de47071d875faaa7d419d050a464b09538797Jason Sams
3614b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (!verptr) {
362af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error, OpenGL ES Lite not supported");
3634b3de47071d875faaa7d419d050a464b09538797Jason Sams        rsdGLShutdown(rsc);
36444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsc->setWatchdogGL(nullptr, 0, nullptr);
365025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        return -1;
3664b3de47071d875faaa7d419d050a464b09538797Jason Sams    } else {
3674b3de47071d875faaa7d419d050a464b09538797Jason Sams        sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion);
3684b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3694b3de47071d875faaa7d419d050a464b09538797Jason Sams
3704b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &dc->gl.gl.maxVertexAttribs);
3714b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &dc->gl.gl.maxVertexUniformVectors);
3724b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxVertexTextureUnits);
3734b3de47071d875faaa7d419d050a464b09538797Jason Sams
3744b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_VARYING_VECTORS, &dc->gl.gl.maxVaryingVectors);
3754b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxTextureImageUnits);
3764b3de47071d875faaa7d419d050a464b09538797Jason Sams
3774b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxFragmentTextureImageUnits);
3784b3de47071d875faaa7d419d050a464b09538797Jason Sams    glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &dc->gl.gl.maxFragmentUniformVectors);
3794b3de47071d875faaa7d419d050a464b09538797Jason Sams
38044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    dc->gl.gl.OES_texture_npot = nullptr != strstr((const char *)dc->gl.gl.extensions,
3814b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                "GL_OES_texture_npot");
38244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    dc->gl.gl.IMG_texture_npot = nullptr != strstr((const char *)dc->gl.gl.extensions,
3834b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                   "GL_IMG_texture_npot");
38444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    dc->gl.gl.NV_texture_npot_2D_mipmap = nullptr != strstr((const char *)dc->gl.gl.extensions,
3854b3de47071d875faaa7d419d050a464b09538797Jason Sams                                                            "GL_NV_texture_npot_2D_mipmap");
3864b3de47071d875faaa7d419d050a464b09538797Jason Sams    dc->gl.gl.EXT_texture_max_aniso = 1.0f;
38744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    bool hasAniso = nullptr != strstr((const char *)dc->gl.gl.extensions,
3884b3de47071d875faaa7d419d050a464b09538797Jason Sams                                   "GL_EXT_texture_filter_anisotropic");
3894b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (hasAniso) {
3904b3de47071d875faaa7d419d050a464b09538797Jason Sams        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dc->gl.gl.EXT_texture_max_aniso);
3914b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
3924b3de47071d875faaa7d419d050a464b09538797Jason Sams
3939db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    if (0) {
3949db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines        DumpDebug(dc);
3959db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    }
3964b3de47071d875faaa7d419d050a464b09538797Jason Sams
397a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache = new RsdShaderCache();
398a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.vertexArrayState = new RsdVertexArrayState();
399a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs);
40044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    dc->gl.currentFrameBuffer = nullptr;
4019719bd4a0187c400ba868712612fe66da4635aacJason Sams    dc->mHasGraphics = true;
402a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
403025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    int syncFd = -1;
404025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    // Create a EGL sync object.
405025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    EGLSyncKHR sync = eglCreateSyncKHR(dc->gl.egl.display, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
406025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    if (sync != EGL_NO_SYNC_KHR) {
407025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        // native fence fd will not be populated until flush() is done.
408025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        glFlush();
409025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        // Convert the EGL sync object to a file descriptor.
410025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        syncFd = eglDupNativeFenceFDANDROID(dc->gl.egl.display, sync);
411025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
412025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang            ALOGW("Failed to dup sync khr object");
413025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang            syncFd = -1;
414025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        }
415025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        // The sync object is no longer needed once we have the file descriptor.
416025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang        eglDestroySyncKHR(dc->gl.egl.display, sync);
417025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    }
418025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang
4196598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%p initGLThread end", rsc);
42044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    rsc->setWatchdogGL(nullptr, 0, nullptr);
421025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    return syncFd;
4224b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4234b3de47071d875faaa7d419d050a464b09538797Jason Sams
4244b3de47071d875faaa7d419d050a464b09538797Jason Sams
425b322033c13487a174bb9c26466e9684d1ff4de8dJason Samsbool rsdGLSetInternalSurface(const Context *rsc, RsNativeWindow sur) {
42687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
4274b3de47071d875faaa7d419d050a464b09538797Jason Sams
4284b3de47071d875faaa7d419d050a464b09538797Jason Sams    EGLBoolean ret;
42944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (dc->gl.egl.surface != nullptr) {
4302382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
4314b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
4324b3de47071d875faaa7d419d050a464b09538797Jason Sams                             dc->gl.egl.surfaceDefault, dc->gl.egl.context);
4334b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
4344b3de47071d875faaa7d419d050a464b09538797Jason Sams
4352382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__);
4364b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
4374b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglDestroySurface", ret);
4384b3de47071d875faaa7d419d050a464b09538797Jason Sams
43944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        dc->gl.egl.surface = nullptr;
4404b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
4414b3de47071d875faaa7d419d050a464b09538797Jason Sams
44244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (dc->gl.currentWndSurface != nullptr) {
44344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        dc->gl.currentWndSurface->decStrong(nullptr);
444c33e6903d25b9cd9d88f45c7320534a5a05c9064Jason Sams    }
445c33e6903d25b9cd9d88f45c7320534a5a05c9064Jason Sams
446b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    dc->gl.currentWndSurface = (ANativeWindow *)sur;
44744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (dc->gl.currentWndSurface != nullptr) {
44844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        dc->gl.currentWndSurface->incStrong(nullptr);
4494b3de47071d875faaa7d419d050a464b09538797Jason Sams
4502382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__);
4514b3de47071d875faaa7d419d050a464b09538797Jason Sams        dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
45244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                                                    dc->gl.currentWndSurface, nullptr);
4534b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglCreateWindowSurface");
4544b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (dc->gl.egl.surface == EGL_NO_SURFACE) {
455af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
4564b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
4574b3de47071d875faaa7d419d050a464b09538797Jason Sams
4582382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
4594b3de47071d875faaa7d419d050a464b09538797Jason Sams        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface,
4604b3de47071d875faaa7d419d050a464b09538797Jason Sams                             dc->gl.egl.surface, dc->gl.egl.context);
4614b3de47071d875faaa7d419d050a464b09538797Jason Sams        checkEglError("eglMakeCurrent", ret);
4624b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
46344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    rsc->setWatchdogGL(nullptr, 0, nullptr);
4644b3de47071d875faaa7d419d050a464b09538797Jason Sams    return true;
4654b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4664b3de47071d875faaa7d419d050a464b09538797Jason Sams
467b322033c13487a174bb9c26466e9684d1ff4de8dJason Samsbool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
468b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
469b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
47044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (dc->gl.wndSurface != nullptr) {
47144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        dc->gl.wndSurface->decStrong(nullptr);
47244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        dc->gl.wndSurface = nullptr;
473b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    }
474b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    if(w && h) {
475b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        // WAR: Some drivers fail to handle 0 size surfaces correctly. Use the
476b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        // pbuffer to avoid this pitfall.
477b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        dc->gl.wndSurface = (ANativeWindow *)sur;
47844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        if (dc->gl.wndSurface != nullptr) {
47944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes            dc->gl.wndSurface->incStrong(nullptr);
480b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams        }
481b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    }
482b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
483b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams    return rsdGLSetInternalSurface(rsc, sur);
484b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams}
485b322033c13487a174bb9c26466e9684d1ff4de8dJason Sams
4864b3de47071d875faaa7d419d050a464b09538797Jason Samsvoid rsdGLSwap(const android::renderscript::Context *rsc) {
48787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
4882382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
4894b3de47071d875faaa7d419d050a464b09538797Jason Sams}
4904b3de47071d875faaa7d419d050a464b09538797Jason Sams
4919719bd4a0187c400ba868712612fe66da4635aacJason Samsvoid rsdGLSetPriority(const Context *rsc, int32_t priority) {
4929719bd4a0187c400ba868712612fe66da4635aacJason Sams    if (priority > 0) {
4939719bd4a0187c400ba868712612fe66da4635aacJason Sams        // Mark context as low priority.
4949719bd4a0187c400ba868712612fe66da4635aacJason Sams        ALOGV("low pri");
4959719bd4a0187c400ba868712612fe66da4635aacJason Sams    } else {
4969719bd4a0187c400ba868712612fe66da4635aacJason Sams        ALOGV("normal pri");
4979719bd4a0187c400ba868712612fe66da4635aacJason Sams    }
4989719bd4a0187c400ba868712612fe66da4635aacJason Sams}
4999719bd4a0187c400ba868712612fe66da4635aacJason Sams
500c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid rsdGLCheckError(const android::renderscript::Context *rsc,
501c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                     const char *msg, bool isFatal) {
502c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    GLenum err = glGetError();
503c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    if (err != GL_NO_ERROR) {
504c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        char buf[1024];
505c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        snprintf(buf, sizeof(buf), "GL Error = 0x%08x, from: %s", err, msg);
506c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
507c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        if (isFatal) {
508c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
509c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        } else {
510c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            switch (err) {
511c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            case GL_OUT_OF_MEMORY:
512c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                rsc->setError(RS_ERROR_OUT_OF_MEMORY, buf);
513c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                break;
514c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            default:
515c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                rsc->setError(RS_ERROR_DRIVER, buf);
516c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk                break;
517c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk            }
518c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk        }
519c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
520af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("%p, %s", rsc, buf);
521c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    }
522c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk
523c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk}
524653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
525653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLClearColor(const android::renderscript::Context *rsc,
526653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                     float r, float g, float b, float a) {
527653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClearColor, r, g, b, a);
528653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
529653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
530653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
531653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLClearDepth(const android::renderscript::Context *rsc, float v) {
532653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClearDepthf, v);
533653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
534653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
535653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
536653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLFinish(const android::renderscript::Context *rsc) {
537653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glFinish);
538653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
539653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
540653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc,
541653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x1, float y1, float z1, float u1, float v1,
542653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x2, float y2, float z2, float u2, float v2,
543653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x3, float y3, float z3, float u3, float v3,
544653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk                            float x4, float y4, float z4, float u4, float v4) {
545653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
546653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
547653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
548653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
549653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RsdVertexArray::Attrib attribs[2];
550e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray
551e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
552e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
553653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
554653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RsdVertexArray va(attribs, 2);
555653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    va.setup(rsc);
556653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk
557653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
558653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchouk}
559