aboutsummaryrefslogtreecommitdiffstats
path: root/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h')
-rw-r--r--emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h b/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
new file mode 100644
index 0000000..343f384
--- /dev/null
+++ b/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.h
@@ -0,0 +1,137 @@
+/*
+* Copyright (C) 2011 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+#ifndef _LIBRENDER_FRAMEBUFFER_H
+#define _LIBRENDER_FRAMEBUFFER_H
+
+#include "libOpenglRender/render_api.h"
+#include "ColorBuffer.h"
+#include "RenderContext.h"
+#include "WindowSurface.h"
+#include <utils/threads.h>
+#include <map>
+#include <EGL/egl.h>
+#include <stdint.h>
+
+typedef uint32_t HandleType;
+struct ColorBufferRef {
+ ColorBufferPtr cb;
+ uint32_t refcount; // number of client-side references
+};
+typedef std::map<HandleType, RenderContextPtr> RenderContextMap;
+typedef std::map<HandleType, WindowSurfacePtr> WindowSurfaceMap;
+typedef std::map<HandleType, ColorBufferRef> ColorBufferMap;
+
+struct FrameBufferCaps
+{
+ bool hasGL2;
+ bool has_eglimage_texture_2d;
+ bool has_eglimage_renderbuffer;
+ EGLint eglMajor;
+ EGLint eglMinor;
+};
+
+class FrameBuffer
+{
+public:
+ static bool initialize(int width, int height, OnPostFn onPost, void* onPostContext);
+ static bool setupSubWindow(FBNativeWindowType p_window,
+ int x, int y,
+ int width, int height, float zRot);
+ static bool removeSubWindow();
+ static void finalize();
+ static FrameBuffer *getFB() { return s_theFrameBuffer; }
+
+ const FrameBufferCaps &getCaps() const { return m_caps; }
+
+ int getWidth() const { return m_width; }
+ int getHeight() const { return m_height; }
+
+ HandleType createRenderContext(int p_config, HandleType p_share, bool p_isGL2 = false);
+ HandleType createWindowSurface(int p_config, int p_width, int p_height);
+ HandleType createColorBuffer(int p_width, int p_height, GLenum p_internalFormat);
+ void DestroyRenderContext(HandleType p_context);
+ void DestroyWindowSurface(HandleType p_surface);
+ void openColorBuffer(HandleType p_colorbuffer);
+ void closeColorBuffer(HandleType p_colorbuffer);
+
+ bool bindContext(HandleType p_context, HandleType p_drawSurface, HandleType p_readSurface);
+ bool setWindowSurfaceColorBuffer(HandleType p_surface, HandleType p_colorbuffer);
+ bool flushWindowSurfaceColorBuffer(HandleType p_surface);
+ bool bindColorBufferToTexture(HandleType p_colorbuffer);
+ bool bindColorBufferToRenderbuffer(HandleType p_colorbuffer);
+ bool updateColorBuffer(HandleType p_colorbuffer,
+ int x, int y, int width, int height,
+ GLenum format, GLenum type, void *pixels);
+
+ bool post(HandleType p_colorbuffer, bool needLock = true);
+ bool repost();
+
+ EGLDisplay getDisplay() const { return m_eglDisplay; }
+ EGLNativeWindowType getSubWindow() const { return m_subWin; }
+ bool bind_locked();
+ bool unbind_locked();
+
+ void setDisplayRotation(float zRot) {
+ m_zRot = zRot;
+ repost();
+ }
+
+private:
+ FrameBuffer(int p_width, int p_height, OnPostFn onPost, void* onPostContext);
+ ~FrameBuffer();
+ HandleType genHandle();
+ bool bindSubwin_locked();
+ void initGLState();
+
+private:
+ static FrameBuffer *s_theFrameBuffer;
+ static HandleType s_nextHandle;
+ int m_x;
+ int m_y;
+ int m_width;
+ int m_height;
+ android::Mutex m_lock;
+ FBNativeWindowType m_nativeWindow;
+ FrameBufferCaps m_caps;
+ EGLDisplay m_eglDisplay;
+ RenderContextMap m_contexts;
+ WindowSurfaceMap m_windows;
+ ColorBufferMap m_colorbuffers;
+
+ EGLSurface m_eglSurface;
+ EGLContext m_eglContext;
+ EGLSurface m_pbufSurface;
+ EGLContext m_pbufContext;
+
+ EGLContext m_prevContext;
+ EGLSurface m_prevReadSurf;
+ EGLSurface m_prevDrawSurf;
+ EGLNativeWindowType m_subWin;
+ EGLNativeDisplayType m_subWinDisplay;
+ EGLConfig m_eglConfig;
+ HandleType m_lastPostedColorBuffer;
+ float m_zRot;
+ bool m_eglContextInitialized;
+
+ int m_statsNumFrames;
+ long long m_statsStartTime;
+ bool m_fpsStats;
+
+ OnPostFn m_onPost;
+ void* m_onPostContext;
+ unsigned char* m_fbImage;
+};
+#endif