egl.cpp revision e6bf8b32b616450f80b64d226ea673f4a2e0bf8d
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 49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h" 51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 52076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)error); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint error = (GLint)pthread_getspecific(gEGLErrorKey); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 98076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isValid() const = 0; 147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect() {} 151e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window); 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ~egl_window_surface_v2_t(); 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; } 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 215e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect(); 216e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getWidth() const { return buffer->width; } 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getHeight() const { return buffer->height; } 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 223df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 224e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 226e71212ba5397387100a578d23b15862518a7a859Mathias Agopian status_t lock(android_native_buffer_t* buf, int usage, void** vaddr); 2270926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian status_t unlock(android_native_buffer_t* buf); 228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* nativeWindow; 229076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 230df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* previousBuffer; 2310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 232076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 234e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 236df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 237df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 238df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = max(lhs.top, rhs.top); 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.left < rhs.left) { // left-side rect 278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = max(lhs.top, rhs.top); 280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = max(lhs.left, rhs.left); 281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = min(lhs.bottom, rhs.bottom); 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.right > rhs.right) { // right-side rect 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = min(lhs.right, rhs.right); 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = max(lhs.top, rhs.top); 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = min(lhs.bottom, rhs.bottom); 289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 291df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 292df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 293df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = min(lhs.bottom, rhs.bottom); 294df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 295df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 296df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 297df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 298df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 299df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 300df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 302df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t getRects(Rect const* * rects) const { 306df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian *rects = storage; 307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count; 308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Rect* reg, ssize_t count); 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window) 3270926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bits(NULL) 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_module_t const* pModule; 3320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 3330926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 3340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 335df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 336df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 337df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 339076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 340df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 342df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 345076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 347076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 357df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 358076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 359e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 361df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 362df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (buffer) { 363df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer->common.decRef(&buffer->common); 364df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 365df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 367df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 368df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 369df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 370df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 371e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::connect() 372e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 3730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 374e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 375df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 376df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 377df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 378df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 379df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 380df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); 381df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 382df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 383e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 384e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 385e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 386e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 387e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (buffer) { 388e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 389e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 390e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 3930926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 394e71212ba5397387100a578d23b15862518a7a859Mathias Agopian android_native_buffer_t* buf, int usage, void** vaddr) 3950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 39621c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian int err = module->lock(module, buf->handle, 397e71212ba5397387100a578d23b15862518a7a859Mathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 3980926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 3990926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4000926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 4010926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) 4020926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 40321c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian int err = module->unlock(module, buf->handle); 4040926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4050926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4060926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 407df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 408df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 409df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Rect* reg, ssize_t count) 411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: use copybit if possible 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect r; 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const size_t dbpr = dst->stride * bpp; 418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const size_t sbpr = src->stride * bpp; 4190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 423df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian for (int i= 0 ; i<count ; i++) { 424df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Rect& r(reg[i]); 425df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t w = r.right - r.left; 426df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t h = r.bottom - r.top; 427df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (w <= 0 || h<=0) continue; 428df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian size_t size = w * bpp; 429df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 430df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 431df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (dbpr==sbpr && size==sbpr) { 432df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian size *= h; 433df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian h = 1; 434df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 435df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian do { 436df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian memcpy(d, s, size); 437df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d += dbpr; 438df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian s += sbpr; 439df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } while (--h > 0); 440076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 443076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 445df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 446df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 447df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 448df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 449df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 450df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 453df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 454df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect const* list; 455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count = copyBack.getRects(&list); 456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // copy from previousBuffer to buffer 457df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 458df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 459df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) 460df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian { 461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, list, count); 462df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 463df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 464df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 465df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 466df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 467df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 468076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 469df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 470df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 473076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 476076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 478076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 479df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 480076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 481df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 482076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 486df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // reallocate the depth-buffer if needed 487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: we probably should reset the swap rect here 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if the window size has changed 490076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 491076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data) { 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 494076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 496076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.stride = buffer->stride; 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 499df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 505df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer->common.incRef(&buffer->common); 507df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // finally pin the buffer down 509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 512df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 517df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 528076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 529076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) { 530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // Hardware supported and no destination alpha 531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (format) { 532076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 533076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 534076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return true; 536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian default: 537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return false; 538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif 541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 549e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 554076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 555076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = -1; 556076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (supportedCopybitsDestinationFormat(buffer.format)) { 55721c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian buffer_handle_t handle = this->buffer->handle; 558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (handle != NULL) { 559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian private_handle_t* hand = private_handle_t::dynamicCast(handle); 560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand != NULL) { 561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand->usesPhysicallyContiguousMemory()) { 562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = hand->fd; 563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 577e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 591df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 592df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 593df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 594df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 595df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 596df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 597df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 598df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 599df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 600df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 601df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 602df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 603df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 604df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 605df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 606df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); } 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 656076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 685076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return pbuffer.data != 0; } 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 715076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString = "1.2 Android Driver"; 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 776076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 777e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 779076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 780df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 781076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 791076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 793076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 794076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 795076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 796076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 797076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 798076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 799076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 805076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 807076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 808076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 809076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 810076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 811076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, 4 }, 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = { 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = { 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = { 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, config_management_t::exact }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_PIXELS, config_management_t::exact }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, config_management_t::exact }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, config_management_t::exact }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 977076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 979076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 991076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1128076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 1147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian static_cast<android_native_window_t*>(window)); 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1180076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1181076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1185076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1189076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1193076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1245076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1249076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1261076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1388749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1389749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1390749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1391749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1393749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = 0; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1397076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t j=0 ; j<NELEM(config_defaults) ; j++) { 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // see if this attribute was specified, if not apply its 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, numAttributes, 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1439749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1440749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1441749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1442749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1443749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1444749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1445749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1446749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1447749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1448749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1449749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1450749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1451749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1478076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1491076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->magic != egl_surface_t::MAGIC) 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1502e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1503e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1504e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1505e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1506e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check that draw and read are compatible with the context 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1632e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1643e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1644e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 1645e71212ba5397387100a578d23b15862518a7a859Mathias Agopian reinterpret_cast<egl_surface_t*>(c->draw)->disconnect(); 1646e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1647e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1648e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1649e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1650e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1652e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1653e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1667e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->connect(); 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1672e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1683e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 1684e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1685e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1686e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1687e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 1688e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1689e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1690e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1762076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1908076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1909076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 1910076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 1911076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1912076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1913076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1914076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1915076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1916076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 1917076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1918076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1919076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1920076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1921076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1922076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1923076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 1924076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1925076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1926076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 1927076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1928076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 1929076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 1930076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1931076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 1932076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1933076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1934076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1935076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 1936076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1937076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1938076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1939076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1940076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1941076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 19428b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian 1943076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 1944076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 1945076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1946076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1947076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 1948076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1949076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1950076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1951076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1952076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1953076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 1954076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1955076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1956076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1957076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1958076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1959076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1960076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1961076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 1962076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1963076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 1964076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1965df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 1966df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 1967df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 1968df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 1969df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 1970df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 1971df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 1972df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 1973df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1974df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1975df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 1976df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 1977df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 1978df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1979df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 1980df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 1981df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 1982df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 1983df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 1984df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 1985