egl.cpp revision cb6b9041647b4f080324742eee5ce709960ff610
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 44240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h> 45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)error); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint error = (GLint)pthread_getspecific(gEGLErrorKey); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isValid() const = 0; 145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 148e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect() {} 149e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 158df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 1598d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian virtual EGLClientBuffer getRenderBuffer() const; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 1988d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const { 1998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return 0; 2008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window); 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ~egl_window_surface_v2_t(); 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; } 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 217e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect(); 218e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 219cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 220cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 225df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian virtual EGLClientBuffer getRenderBuffer() const; 2278d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 229e71212ba5397387100a578d23b15862518a7a859Mathias Agopian status_t lock(android_native_buffer_t* buf, int usage, void** vaddr); 2300926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian status_t unlock(android_native_buffer_t* buf); 231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* nativeWindow; 232076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 233df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* previousBuffer; 2340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 235240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* blitengine; 236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 238e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 270240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 271240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 272240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 281240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 284240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 285240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 286240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 302df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 306df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 321240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian struct region_iterator : public copybit_region_t { 322240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator(const Region& region) 323240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian : b(region.begin()), e(region.end()) { 324240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian this->next = iterate; 325240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 326240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian private: 327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian static int iterate(copybit_region_t const * self, copybit_rect_t* rect) { 328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator const* me = static_cast<region_iterator const*>(self); 329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (me->b != me->e) { 330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian *reinterpret_cast<Rect*>(rect) = *me->b++; 331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 1; 332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 0; 334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian mutable Region::const_iterator b; 336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator const e; 337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian }; 338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 339df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 340df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 342240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 344df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 351076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window) 3520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 353df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 354240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian blitengine(0), bits(NULL) 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_module_t const* pModule; 3570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 360240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) { 361240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_open(pModule, &blitengine); 362240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 363240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 364df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 365df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 368cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 370cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 372cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 373cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (blitengine) { 381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian copybit_close(blitengine); 382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianvoid egl_window_surface_v2_t::connect() 386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 387df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 389df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 390df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 393cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 395076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 404df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 405076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 406df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4070926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 408e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 409df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 412240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("connect() failed to lock buffer %p (%ux%u)", 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); 415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 417e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 418e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 419e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4219648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 423e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 425cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian // enqueue the last frame 426cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 427cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 436076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 438e71212ba5397387100a578d23b15862518a7a859Mathias Agopian android_native_buffer_t* buf, int usage, void** vaddr) 4390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 44021c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian int err = module->lock(module, buf->handle, 441e71212ba5397387100a578d23b15862518a7a859Mathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 4420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) 4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 44721c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian int err = module->unlock(module, buf->handle); 4480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 453df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 454240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: use copybit if possible 457df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 458df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 459240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian status_t err = NO_ERROR; 460240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* const copybit = blitengine; 461240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (copybit) { 462240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t simg; 463240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.w = src->width; 464240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.h = src->height; 465240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.format = src->format; 466240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.handle = const_cast<native_handle_t*>(src->handle); 467240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 468240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t dimg; 469240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.w = dst->width; 470240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.h = dst->height; 471240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.format = dst->format; 472240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.handle = const_cast<native_handle_t*>(dst->handle); 473240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 475240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255); 476240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE); 477240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator it(clip); 478240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian err = copybit->blit(copybit, &dimg, &simg, &it); 479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (err != NO_ERROR) { 480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("copybit failed (%s)", strerror(err)); 481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 4830926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (!copybit || err) { 485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator cur = clip.begin(); 486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator end = clip.end(); 487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t dbpr = dst->stride * bpp; 490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t sbpr = src->stride * bpp; 491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian while (cur != end) { 496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Rect& r(*cur++); 497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t w = r.right - r.left; 498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t h = r.bottom - r.top; 499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (w <= 0 || h<=0) continue; 500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size_t size = w * bpp; 501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (dbpr==sbpr && size==sbpr) { 504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size *= h; 505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian h = 1; 506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian do { 508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian memcpy(d, s, size); 509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian d += dbpr; 510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian s += sbpr; 511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } while (--h > 0); 512df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 513076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 526df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 528df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 529240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 530240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 531240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 532df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 533df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 534df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 535df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 536df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 537df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 539df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 540df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 541df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 543076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 545df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 549df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 551df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 553076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 554076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 555076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // reallocate the depth-buffer if needed 557076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: we probably should reset the swap rect here 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if the window size has changed 560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data) { 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.stride = buffer->stride; 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 574df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 575df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer->common.incRef(&buffer->common); 577df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // finally pin the buffer down 579df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 581df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 582df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 583df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); 584df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 585df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 586df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 587df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 588df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 589df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 590df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 591df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 592df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 593df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5978d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const 5988d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{ 5998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return buffer; 6008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 6018d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) { 6058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian // Hardware supported 606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (format) { 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 6088d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 6098d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_4444: 6108d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_5551: 6118d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return true; 613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 6148d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return false; 615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 625e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 6300a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 6320a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian gl->copybits.drawSurfaceBuffer = 0; 633f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (gl->copybits.blitEngine != NULL) { 634f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (supportedCopybitsDestinationFormat(buffer.format)) { 635f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian buffer_handle_t handle = this->buffer->handle; 636f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (handle != NULL) { 6370a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian gl->copybits.drawSurfaceBuffer = handle; 638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 6420a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 650076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 651076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 652e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 653076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 663076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 664076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 666df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 667df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 668df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 669df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 670df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 671df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 672df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 673df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 674df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 675df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 676df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 677df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 678df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 679df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 680df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 681df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 682076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 696076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); } 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 731076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 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_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 760076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return pbuffer.data != 0; } 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString = "1.2 Android Driver"; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 852e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 855df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 8568d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian "EGL_ANDROID_get_render_buffer " 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 900076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 901076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 902076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 9038d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 9048d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 9058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 9068d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 9078d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 9088d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 9098d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglGetRenderBufferANDROID", 9108d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 913076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 924076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, 4 }, 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = { 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = { 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = { 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, config_management_t::exact }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_PIXELS, config_management_t::exact }, 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, config_management_t::exact }, 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, config_management_t::exact }, 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1081076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1196076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1212076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1229076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1230076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 1231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian static_cast<android_native_window_t*>(window)); 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1269076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1281076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1285076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1328076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1337076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1345076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1349076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1413076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1472749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1473749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1474749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1475749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1477749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = 0; 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t j=0 ; j<NELEM(config_defaults) ; j++) { 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // see if this attribute was specified, if not apply its 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1504dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1523749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1524749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1525749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1526749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1527749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1528749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1529749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1530749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1531749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1532749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1533749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1534749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1535749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->magic != egl_surface_t::MAGIC) 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1586e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1587e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1588e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1589e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1590e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1650076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check that draw and read are compatible with the context 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1700076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1716e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1727e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1728e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 1729e71212ba5397387100a578d23b15862518a7a859Mathias Agopian reinterpret_cast<egl_surface_t*>(c->draw)->disconnect(); 1730e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1731e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1732e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1733e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1734e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1736e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1737e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1751e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->connect(); 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1756e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1767e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 17689648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1769e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1770e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 17739648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1774e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1776e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1981076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1994076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1995076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 1996076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 1997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1998076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1999076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2001076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2002076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 2003076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2005076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2006076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2007076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 2009076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 2010076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2011076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2015076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 2022076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2023076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2025076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20288b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian 2029076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2031076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2033076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2051df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2052df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2053df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2054df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2055df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2056df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2057df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2058df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2059df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2060df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2061df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2062df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 2063df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2064df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2065df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2066df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2067df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2068df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2069df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2070df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 20718d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 20728d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw) 20738d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{ 20748d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 20758d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0); 20768d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 20778d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 20788d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian if (d->dpy != dpy) 20798d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0); 20808d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 20818d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian // post the surface 20828d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return d->getRenderBuffer(); 20838d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 2084