egl.cpp revision 4b9511c16195a646242eff833b0af212933b6eca
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License"); 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h> 437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 524b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 534b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 544b9511c16195a646242eff833b0af212933b6ecaMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height); 554b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 564b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)error); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint error = (GLint)pthread_getspecific(gEGLErrorKey); 882076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis if (error == 0) { 892076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // The TLS key has been created by another thread, but the value for 902076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // this thread has not been initialized. 912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis return EGL_SUCCESS; 922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis } 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1520696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1530696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 157cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 158e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 167df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1860696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 1870696a572294bbaa977245afb630065de3278473bMathias Agopian LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1880696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1890696a572294bbaa977245afb630065de3278473bMathias Agopian} 1900696a572294bbaa977245afb630065de3278473bMathias Agopian 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 206df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 207df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 208df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 2194b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2210696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2230696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 227cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 228e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 229cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 230cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2368d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 238697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr); 239697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t unlock(ANativeWindowBuffer* buf); 2404b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* nativeWindow; 241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer; 242697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* previousBuffer; 2430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 245076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 246e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 278240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 279240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 280240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 291df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 308240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 312240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 330697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 331697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 333df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 334df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 335df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 3414b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window) 3420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 3449cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian bits(NULL) 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34669e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian hw_module_t const* pModule; 34769e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 34869e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 34969e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian 350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 352df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 354cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 355cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 356cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 359cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 366cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 367cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 368cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3705221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3715221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3725221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3735221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 374df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 375cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) { 376cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 377cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 378df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 379df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 388cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 392df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 394df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 3950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 396e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 398df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 399df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 400240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("connect() failed to lock buffer %p (%ux%u)", 401df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 402cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 403df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 404df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 405cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 406e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 407e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 408e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 409e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4109648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 411e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 412e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 413e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 414cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian // enqueue the last frame 415cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 416cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 417cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 418cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 419cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 420cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 421cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 422cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 423cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 425076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4260926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 427697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf, int usage, void** vaddr) 4280926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 429bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err; 430695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 431695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->lock(module, buf->handle, 432695b66f082033d618ce19ee289d858130bd5420bMathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 433695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 437697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf) 4380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 439cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 440bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err = NO_ERROR; 441695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 442695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->unlock(module, buf->handle); 443695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 447df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 448697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 449697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 450240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 453df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4549cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator cur = clip.begin(); 4559cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator end = clip.end(); 4569cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4579cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 4589cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t dbpr = dst->stride * bpp; 4599cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t sbpr = src->stride * bpp; 4609cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4619cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian while (cur != end) { 4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const Rect& r(*cur++); 4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t w = r.right - r.left; 4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t h = r.bottom - r.top; 4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (w <= 0 || h<=0) continue; 4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size_t size = w * bpp; 4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (dbpr==sbpr && size==sbpr) { 4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size *= h; 4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian h = 1; 475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian do { 4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian memcpy(d, s, size); 4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian d += dbpr; 4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian s += sbpr; 4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian } while (--h > 0); 481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 486cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 487cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 488cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 489cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 490df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 491df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 492df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 493df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 494df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 495df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 496df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 49772c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 49872c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 49972c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 501df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 502df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 507df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 512076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 517076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5180926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 524031213e5b31c317135f603271333949dda89e01eMathias Agopian if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) { 525031213e5b31c317135f603271333949dda89e01eMathias Agopian 526031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: lockBuffer should rather be executed when the very first 527031213e5b31c317135f603271333949dda89e01eMathias Agopian // direct rendering occurs. 528031213e5b31c317135f603271333949dda89e01eMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 529031213e5b31c317135f603271333949dda89e01eMathias Agopian 530031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 531031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 532031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 533031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 534031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 535031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 536031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 537031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 538031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 539031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 540031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 541031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 542031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 543031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 544031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 545031213e5b31c317135f603271333949dda89e01eMathias Agopian } 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 549031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 550031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 551031213e5b31c317135f603271333949dda89e01eMathias Agopian 552031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 553031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 554031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 555031213e5b31c317135f603271333949dda89e01eMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 556031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 557031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 558031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 559031213e5b31c317135f603271333949dda89e01eMathias Agopian } 560031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 561031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 567df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 568df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 570df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 581e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 5860a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 596e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 611df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 612df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 623df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6400696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7030696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 786639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian static bool ignore(GLint reqValue, GLint confValue) { 787639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 788639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 796141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 798076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 799e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 802df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 8498d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 8508d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 8518d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 8528d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 8538d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 8548d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 88356fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 8840985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 8850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 8860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 88756fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 8880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 8948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 903d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 915d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 928d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9398b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 940d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 9536af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9578b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 965d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 978d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 9906af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1016639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1017639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1018639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1020639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10330985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10340985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10350985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10360985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10370985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10400985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10420985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10430985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10440985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10498b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 10508b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 10518b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 10528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 10538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 10548b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10568b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10578b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 10588b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10598b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 10628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 10638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 10668b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 10678b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 10708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 10718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 10748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 10758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 10788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 10798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 10828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 10838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 10868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 10878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 113097640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12254b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12260696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12270696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12280696a572294bbaa977245afb630065de3278473bMathias Agopian } 12290696a572294bbaa977245afb630065de3278473bMathias Agopian 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 12484b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12500696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12740696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 12750696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 12760696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 12770696a572294bbaa977245afb630065de3278473bMathias Agopian } 12780696a572294bbaa977245afb630065de3278473bMathias Agopian 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12960696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13390696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1374076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1382076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1444749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1445749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1446749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1447749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1449749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 145004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 145104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 145204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 145304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 145404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 145504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 145604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1458076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 14660985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 14760985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 14770985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1481dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 14840985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1500749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1501749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1502749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1503749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1504749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1505749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1506749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1507749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1508749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1509749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1510749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1511749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1512749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 15590696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1563e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1564e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1565e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1566e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1567e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 15790696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 15800696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 16730696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 16740696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 16750696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 16760696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 16770696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 16780696a572294bbaa977245afb630065de3278473bMathias Agopian } 16790696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 16800696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 16810696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 16820696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 16850696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1689076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1705e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1716e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1717e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17180696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17190696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 1720e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1721e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1722e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1723e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1724e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1726e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1727e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1741cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1742cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1743cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1748e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1759e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 17609648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1761e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1762e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1763e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1764e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 17659648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1767e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 18420696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 18430696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1933551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1975076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1988076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1989076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 1990076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 1991076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1992076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1993076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1994076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1995076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1996076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 1997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1998076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1999076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2001076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2002076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 2003076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 2004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2005076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2006076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2007076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2009076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2010076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2011076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2015697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer; 2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2020697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20228dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20238dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20248dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20258dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20268dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20278dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20288dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20298dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_5551: 20308dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_4444: 20318dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20328dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20338dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20348dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20358dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2046697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img; 2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2051697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2058df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2059df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2060df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2061df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2062df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2063df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2064df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2065df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2066df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2067df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2068df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2069df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 20700696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 20710696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2072df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2073df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2074df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2075df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2076df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2077df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2078df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2079df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2080