summaryrefslogtreecommitdiffstats
path: root/include/ui/EGLNativeWindowSurface.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ui/EGLNativeWindowSurface.h')
-rw-r--r--include/ui/EGLNativeWindowSurface.h100
1 files changed, 83 insertions, 17 deletions
diff --git a/include/ui/EGLNativeWindowSurface.h b/include/ui/EGLNativeWindowSurface.h
index 3494234..4b25655 100644
--- a/include/ui/EGLNativeWindowSurface.h
+++ b/include/ui/EGLNativeWindowSurface.h
@@ -19,8 +19,17 @@
#include <stdint.h>
#include <sys/types.h>
-#include <ui/EGLNativeSurface.h>
+
#include <EGL/egl.h>
+#include <EGL/android_natives.h>
+
+#include <utils/threads.h>
+#include <ui/Rect.h>
+
+#include <pixelflinger/pixelflinger.h>
+
+
+extern "C" EGLNativeWindowType android_createDisplaySurface(void);
// ---------------------------------------------------------------------------
namespace android {
@@ -28,27 +37,84 @@ namespace android {
class Surface;
-class EGLNativeWindowSurface : public EGLNativeSurface<EGLNativeWindowSurface>
+
+class NativeBuffer
+ : public EGLNativeBase<
+ android_native_buffer_t,
+ NativeBuffer,
+ LightRefBase<NativeBuffer> >
{
public:
- EGLNativeWindowSurface(const sp<Surface>& surface);
- ~EGLNativeWindowSurface();
+ NativeBuffer(int w, int h, int f, int u) : BASE() {
+ android_native_buffer_t::width = w;
+ android_native_buffer_t::height = h;
+ android_native_buffer_t::format = f;
+ android_native_buffer_t::usage = u;
+ android_native_buffer_t::getHandle = getHandle;
+ }
+public:
+ buffer_handle_t handle;
+private:
+ friend class LightRefBase<NativeBuffer>;
+ ~NativeBuffer() { }; // this class cannot be overloaded
+ static int getHandle(android_native_buffer_t const * base, buffer_handle_t* handle) {
+ *handle = getSelf(base)->handle;
+ return 0;
+ }
+};
- void setSwapRectangle(int l, int t, int w, int h);
+// ---------------------------------------------------------------------------
+
+class FramebufferNativeWindow
+ : public EGLNativeBase<
+ android_native_window_t,
+ FramebufferNativeWindow,
+ LightRefBase<FramebufferNativeWindow> >
+{
+public:
+ FramebufferNativeWindow();
+
+ framebuffer_device_t const * getDevice() const { return fbDev; }
private:
- static void hook_incRef(NativeWindowType window);
- static void hook_decRef(NativeWindowType window);
- static uint32_t hook_swapBuffers(NativeWindowType window);
- static void hook_connect(NativeWindowType window);
- static void hook_disconnect(NativeWindowType window);
-
- uint32_t swapBuffers();
- void connect();
- void disconnect();
-
- sp<Surface> mSurface;
- bool mConnected;
+ friend class LightRefBase<FramebufferNativeWindow>;
+ ~FramebufferNativeWindow(); // this class cannot be overloaded
+ static void connect(android_native_window_t* window);
+ static void disconnect(android_native_window_t* window);
+ static int setSwapInterval(android_native_window_t* window, int interval);
+ static int setSwapRectangle(android_native_window_t* window,
+ int l, int t, int w, int h);
+ static int dequeueBuffer(android_native_window_t* window, android_native_buffer_t** buffer);
+ static int lockBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
+ static int queueBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
+
+
+ static inline FramebufferNativeWindow* getSelf(
+ android_native_window_t* window) {
+ FramebufferNativeWindow* self =
+ static_cast<FramebufferNativeWindow*>(window);
+ return self;
+ }
+
+ static inline FramebufferNativeWindow* getSelf(
+ android_native_base_t* window) {
+ return getSelf(reinterpret_cast<android_native_window_t*>(window));
+ }
+
+
+ framebuffer_device_t* fbDev;
+ alloc_device_t* grDev;
+
+ sp<NativeBuffer> buffers[2];
+ sp<NativeBuffer> front;
+
+ Rect mDirty;
+
+ mutable Mutex mutex;
+ Condition mCondition;
+ int32_t mNumBuffers;
+ int32_t mNumFreeBuffers;
+ int32_t mBufferHead;
};
// ---------------------------------------------------------------------------