gl_env.h revision d47f7d8b5fe3a3861d7cbdc5f912235407823c8e
165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifndef ANDROID_FILTERFW_CORE_GL_ENV_H 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ANDROID_FILTERFW_CORE_GL_ENV_H 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string> 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <utility> 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <map> 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "base/logging.h" 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "base/utilities.h" 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2.h> 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <EGL/egl.h> 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 30d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h> 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <gui/SurfaceTextureClient.h> 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android { 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw { 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass ShaderProgram; 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass VertexFrame; 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass WindowHandle { 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public: 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn virtual ~WindowHandle() { 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn virtual void Destroy() = 0; 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn virtual bool Equals(const WindowHandle* window) const { 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return InternalHandle() == window->InternalHandle(); 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn virtual const void* InternalHandle() const = 0; 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn virtual void* InternalHandle() = 0; 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}; 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// The GLEnv class provides functionality related to the EGL environment, which 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// includes the display, context, and surface. It is possible to either create 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// a new environment or base it off the currently active EGL environment. In 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// order to do the latter, an EGL environment must be setup already (though not 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// necessarily through this class), and have an active display, context, and 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// surface. 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLEnv { 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public: 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Constructing and Activating ///////////////////////////////////////////// 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Constructs a new GLEnv object. This does not create a GL context. 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn GLEnv(); 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Destructor. Tears down and deallocates any GL objects that were created 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // by this instance. 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ~GLEnv(); 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Inits a new GL environment, including a new surface and context. You 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // must call Activate() before performing any GL operations. 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool InitWithNewContext(); 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Inits the GL environment from the current GL environment. Use this when 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // there is already a display, surface and context available (possibly 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // created by the host application). You do not need to call Activate() as 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // this context is active already. 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool InitWithCurrentContext(); 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Activates the environment, and makes the associated GL context the 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // current context. Creates the environment, if it has not been created 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // already. Returns true if the activation was successful. 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Activate(); 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Deactivates the environment. Returns true if the deactivation was 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // successful. You may want to call this when moving a context to another 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // thread. In this case, deactivate the GLEnv in the old thread, and 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // reactivate it in the new thread. 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Deactivate(); 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // When rendering to a visible surface, call this to swap between the 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // offscreen and onscreen buffers. Returns true if the buffer swap was 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // successful. 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SwapBuffers(); 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Working with Surfaces /////////////////////////////////////////////////// 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Add a surface to the environment. This surface will now be managed (and 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // owned) by the GLEnv instance. Returns the id of the surface. 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int AddSurface(const EGLSurface& surface); 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Add a window surface to the environment. The window is passed in as 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // an opaque window handle. 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // This surface will now be managed (and owned) by the GLEnv instance. 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the id of the surface. 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int AddWindowSurface(const EGLSurface& surface, WindowHandle* window_handle); 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Switch to the surface with the specified id. This will make the surface 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // active, if it is not active already. Specify an ID of 0 if you would like 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to switch to the default surface. Returns true if successful. 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SwitchToSurfaceId(int surface_id); 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Release the surface with the specified id. This will deallocate the 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // surface. If this is the active surface, the environment will switch to 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the default surface (0) first. You cannot release the default surface. 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool ReleaseSurfaceId(int surface_id); 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Set the timestamp for the current surface. Must be called 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // before swapBuffers to associate the timestamp with the frame 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // resulting from swapBuffers. 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SetSurfaceTimestamp(int64_t timestamp); 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Looks for a surface with the associated window handle. Returns -1 if no 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // surface with such a window was found. 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int FindSurfaceIdForWindow(const WindowHandle* window_handle); 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Obtain the environment's EGL surface. 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const EGLSurface& surface() const { 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return surfaces_.find(surface_id_)->second.first; 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Working with Contexts /////////////////////////////////////////////////// 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Add a context to the environment. This context will now be managed (and 13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // owned) by the GLEnv instance. Returns the id of the context. 13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int AddContext(const EGLContext& context); 13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Switch to the context with the specified id. This will make the context 14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // active, if it is not active already. Specify an ID of 0 if you would like 14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // to switch to the default context. Returns true if successful. 14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool SwitchToContextId(int context_id); 14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Release the context with the specified id. This will deallocate the 14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // context. If this is the active context, the environment will switch to 14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the default context (0) first. You cannot release the default context. 14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void ReleaseContextId(int context_id); 14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Obtain the environment's EGL context. 15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const EGLContext& context() const { 15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return contexts_.find(context_id_)->second; 15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Working with the Display //////////////////////////////////////////////// 15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Obtain the environment's EGL display. 15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const EGLDisplay& display() const { 15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return display_; 15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Inspecting the environment ////////////////////////////////////////////// 16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if the environment is active in the current thread. 16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool IsActive() const; 16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if the environment's context is active in the curent thread. 16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool IsContextActive() const; 16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if there is any EGL context active in the current thread. 16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // This need not be a context created by a GLEnv instance. 17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool IsAnyContextActive(); 17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attaching GL objects //////////////////////////////////////////////////// 17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attach a shader to the environment. The environment takes ownership of 17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // the shader. 17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void AttachShader(int key, ShaderProgram* shader); 17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attach a vertex frame to the environment. The environment takes ownership 17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // of the frame. 18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn void AttachVertexFrame(int key, VertexFrame* frame); 18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Return the shader with the specified key, or NULL if there is no such 18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // shader attached to this environment. 18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ShaderProgram* ShaderWithKey(int key); 18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Return the vertex frame with the specified key, or NULL if there is no 18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // such frame attached to this environment. 18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn VertexFrame* VertexFrameWithKey(int key); 18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Static methods ////////////////////////////////////////////////////////// 19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // These operate on the currently active environment! 19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Checks if the current environment is in a GL error state. If so, it will 19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // output an error message referencing the given operation string. Returns 19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // true if there was at least one error. 19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckGLError(const std::string& operation); 19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Checks if the current environment is in an EGL error state. If so, it 19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // will output an error message referencing the given operation string. 20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if there was at least one error. 20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckEGLError(const std::string& operation); 20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Get the currently used (shader) program. 20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static GLuint GetCurrentProgram(); 20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Get the currently active display. 20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static EGLDisplay GetCurrentDisplay(); 20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns the number of components for a given GL type. For instance, 21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // returns 4 for vec4, and 16 for mat4. 21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static int NumberOfComponents(GLenum type); 21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private: 21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn typedef std::pair<EGLSurface, WindowHandle*> SurfaceWindowPair; 21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Initializes a new GL environment. 21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool Init(); 21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if one of the Inits has been called successfully on this 22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // instance. 22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool IsInitialized() const; 22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Outputs error messages specific to the operation eglMakeCurrent(). 22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Returns true if there was at least one error. 22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static bool CheckEGLMakeCurrentError(); 22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The EGL display, contexts, and surfaces. 22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn EGLDisplay display_; 22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::map<int, EGLContext> contexts_; 23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::map<int, SurfaceWindowPair> surfaces_; 23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The currently active context and surface ids. 23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int context_id_; 23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int surface_id_; 23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Dummy surface for context 23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn sp<ANativeWindow> window_; 23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 239d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden // Dummy GLConsumer for context 240d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<GLConsumer> surfaceTexture_; 24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 24265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // The maximum surface id used. 24365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int max_surface_id_; 24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // These bools keep track of which objects this GLEnv has created (and 24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // owns). 24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool created_context_; 24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool created_surface_; 24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn bool initialized_; 25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attachments that GL objects can add to the environment. 25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::map<int, ShaderProgram*> attached_shaders_; 25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::map<int, VertexFrame*> attached_vframes_; 25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn DISALLOW_COPY_AND_ASSIGN(GLEnv); 25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}; 25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw 25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android 26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif // ANDROID_FILTERFW_CORE_GL_ENV_H 262