egl_display.h revision 1cadb25da1ed875bdd078270e642966724a0c39a
1518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian/* 2518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Copyright 2007, The Android Open Source Project 3518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 4518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License"); 5518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** you may not use this file except in compliance with the License. 6518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** You may obtain a copy of the License at 7518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 8518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 9518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 10518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Unless required by applicable law or agreed to in writing, software 11518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS, 12518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** See the License for the specific language governing permissions and 14518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** limitations under the License. 15518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian */ 16518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 17518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#ifndef ANDROID_EGL_DISPLAY_H 18518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#define ANDROID_EGL_DISPLAY_H 19518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 20518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 21518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <ctype.h> 22518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdint.h> 23518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdlib.h> 24518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 25518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/egl.h> 26518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/eglext.h> 27518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/gl.h> 28518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/glext.h> 29518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 30518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <utils/SortedVector.h> 31518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <utils/threads.h> 32518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 331cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egldefs.h" 34518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include "hooks.h" 35518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 36518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 37518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiannamespace android { 38518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 39518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 40518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_object_t; 41518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_connection_t; 42518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 43518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 44518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_config_t { 46518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t() {} 47518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t(int impl, EGLConfig config) 48518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian : impl(impl), config(config), configId(0), implConfigId(0) { } 49518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian int impl; // the implementation this config is for 50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig config; // the implementation's EGLConfig 51518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint configId; // our CONFIG_ID 52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint implConfigId; // the implementation's CONFIG_ID 53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool operator < (const egl_config_t& rhs) const { 54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian if (impl < rhs.impl) return true; 55518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian if (impl > rhs.impl) return false; 56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian return config < rhs.config; 57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian } 58518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; 59518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_display_t { 63518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static egl_display_t sDisplay[NUM_DISPLAYS]; 64518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLDisplay getDisplay(EGLNativeDisplayType display); 65518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 66518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic: 67518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian enum { 68518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian NOT_INITIALIZED = 0, 69518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian INITIALIZED = 1, 70518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian TERMINATED = 2 71518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 72518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 73518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_display_t(); 74518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ~egl_display_t(); 75518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 76518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLBoolean initialize(EGLint *major, EGLint *minor); 77518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLBoolean terminate(); 78518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 79518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian // add object to this display's list 80518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian void addObject(egl_object_t* object); 815b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian // remove object from this display's list 825b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian void removeObject(egl_object_t* object); 83518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian // add reference to this object. returns true if this is a valid object. 84518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian bool getObject(egl_object_t* object); 85518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 865b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian 87518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static egl_display_t* get(EGLDisplay dpy); 88518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static EGLDisplay getFromNativeDisplay(EGLNativeDisplayType disp); 89518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 90518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isReady() const { return (refs > 0); } 91518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isValid() const { return magic == '_dpy'; } 92518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isAlive() const { return isValid(); } 93518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 94518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian struct strings_t { 95518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * vendor; 96518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * version; 97518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * clientApi; 98518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * extensions; 99518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 100518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 101518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian struct DisplayImpl { 102518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian DisplayImpl() : dpy(EGL_NO_DISPLAY), config(0), 103518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian state(NOT_INITIALIZED), numConfigs(0) { } 104518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLDisplay dpy; 105518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig* config; 106518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint state; 107518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint numConfigs; 108518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian strings_t queryString; 109518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 110518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 111518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate: 112518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian uint32_t magic; 113518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 114518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic: 115518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian DisplayImpl disp[IMPL_NUM_IMPLEMENTATIONS]; 116518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint numTotalConfigs; 117518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t* configs; 118518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 119518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate: 120518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian uint32_t refs; 121518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian Mutex lock; 122518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian SortedVector<egl_object_t*> objects; 123518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; 124518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 125518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 126518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 127518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianinline egl_display_t* get_display(EGLDisplay dpy) { 128518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian return egl_display_t::get(dpy); 129518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian} 130518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 131518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 132518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 133518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_display_t* validate_display(EGLDisplay dpy); 134518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_connection_t* validate_display_config(EGLDisplay dpy, 135518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig config, egl_display_t const*& dp); 136518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias AgopianEGLBoolean validate_display_context(EGLDisplay dpy, EGLContext ctx); 137518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias AgopianEGLBoolean validate_display_surface(EGLDisplay dpy, EGLSurface surface); 138518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 139518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 140518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; // namespace android 141518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 142518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 143518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif // ANDROID_EGL_DISPLAY_H 144518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 145