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