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