| 1 | /**************************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2013 Jolla Ltd. |
| 4 | ** Contact: Carsten Munk <carsten.munk@jollamobile.com> |
| 5 | ** All rights reserved. |
| 6 | ** |
| 7 | ** This file is part of Wayland enablement for libhybris |
| 8 | ** |
| 9 | ** You may use this file under the terms of the GNU Lesser General |
| 10 | ** Public License version 2.1 as published by the Free Software Foundation |
| 11 | ** and appearing in the file license.lgpl included in the packaging |
| 12 | ** of this file. |
| 13 | ** |
| 14 | ** This library is free software; you can redistribute it and/or |
| 15 | ** modify it under the terms of the GNU Lesser General Public |
| 16 | ** License version 2.1 as published by the Free Software Foundation |
| 17 | ** and appearing in the file license.lgpl included in the packaging |
| 18 | ** of this file. |
| 19 | ** |
| 20 | ** This library is distributed in the hope that it will be useful, |
| 21 | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 22 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 23 | ** Lesser General Public License for more details. |
| 24 | ** |
| 25 | ****************************************************************************************/ |
| 26 | |
| 27 | |
| 28 | #ifndef Wayland_WINDOW_H |
| 29 | #define Wayland_WINDOW_H |
| 30 | #include "nativewindowbase.h" |
| 31 | #include <linux/fb.h> |
| 32 | #include <android/hardware/gralloc.h> |
| 33 | extern "C" { |
| 34 | |
| 35 | #include <wayland-client.h> |
| 36 | #include <wayland-egl.h> |
| 37 | #include "wayland-android-client-protocol.h" |
| 38 | #include <pthread.h> |
| 39 | } |
| 40 | #include <list> |
| 41 | |
| 42 | class WaylandNativeWindowBuffer : public BaseNativeWindowBuffer |
| 43 | { |
| 44 | friend class WaylandNativeWindow; |
| 45 | protected: |
| 46 | WaylandNativeWindowBuffer(alloc_device_t* alloc_device, |
| 47 | unsigned int width, |
| 48 | unsigned int height, |
| 49 | unsigned int format, |
| 50 | unsigned int usage) |
| 51 | { |
| 52 | // Base members |
| 53 | ANativeWindowBuffer::width = width; |
| 54 | ANativeWindowBuffer::height = height; |
| 55 | ANativeWindowBuffer::format = format; |
| 56 | ANativeWindowBuffer::usage = usage; |
| 57 | this->wlbuffer = NULL; |
| 58 | this->busy = 0; |
| 59 | this->other = NULL; |
| 60 | this->m_alloc = alloc_device; |
| 61 | int alloc_ok = this->m_alloc->alloc(this->m_alloc, |
| 62 | this->width ? this->width : 1, this->height ? this->height : 1, |
| 63 | this->format, this->usage, |
| 64 | &this->handle, &this->stride); |
| 65 | assert(alloc_ok == 0); |
| 66 | this->youngest = 0; |
| 67 | } |
| 68 | WaylandNativeWindowBuffer(ANativeWindowBuffer *other) |
| 69 | { |
| 70 | ANativeWindowBuffer::width = other->width; |
| 71 | ANativeWindowBuffer::height = other->height; |
| 72 | ANativeWindowBuffer::format = other->format; |
| 73 | ANativeWindowBuffer::usage = other->usage; |
| 74 | ANativeWindowBuffer::handle = other->handle; |
| 75 | ANativeWindowBuffer::stride = other->stride; |
| 76 | this->wlbuffer = NULL; |
| 77 | this->busy = 0; |
| 78 | this->other = other; |
| 79 | this->m_alloc = NULL; |
| 80 | this->youngest = 0; |
| 81 | } |
| 82 | ~WaylandNativeWindowBuffer() |
| 83 | { |
| 84 | if (this->m_alloc) |
| 85 | m_alloc->free(m_alloc, this->handle); |
| 86 | } |
| 87 | void wlbuffer_from_native_handle(struct android_wlegl *android_wlegl); |
| 88 | |
| 89 | protected: |
| 90 | void* vaddr; |
| 91 | alloc_device_t* m_alloc; |
| 92 | |
| 93 | public: |
| 94 | struct wl_buffer *wlbuffer; |
| 95 | int busy; |
| 96 | int youngest; |
| 97 | ANativeWindowBuffer *other; |
| 98 | }; |
| 99 | |
| 100 | |
| 101 | class WaylandNativeWindow : public BaseNativeWindow { |
| 102 | public: |
| 103 | WaylandNativeWindow(struct wl_egl_window *win, struct wl_display *display, const gralloc_module_t* gralloc, alloc_device_t* alloc_device); |
| 104 | ~WaylandNativeWindow(); |
| 105 | |
| 106 | void lock(); |
| 107 | void unlock(); |
| 108 | void frame(); |
| 109 | void releaseBuffer(struct wl_buffer *buffer); |
| 110 | int postBuffer(ANativeWindowBuffer *buffer); |
| 111 | |
| 112 | static void sync_callback(void *data, struct wl_callback *callback, uint32_t serial); |
| 113 | static void registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, |
| 114 | const char *interface, uint32_t version); |
| 115 | static void resize_callback(struct wl_egl_window *egl_window, void *); |
| 116 | struct wl_event_queue *wl_queue; |
| 117 | |
| 118 | protected: |
| 119 | // overloads from BaseNativeWindow |
| 120 | virtual int setSwapInterval(int interval); |
| 121 | virtual int dequeueBuffer(BaseNativeWindowBuffer **buffer, int *fenceFd); |
| 122 | virtual int lockBuffer(BaseNativeWindowBuffer* buffer); |
| 123 | virtual int queueBuffer(BaseNativeWindowBuffer* buffer, int fenceFd); |
| 124 | virtual int cancelBuffer(BaseNativeWindowBuffer* buffer, int fenceFd); |
| 125 | virtual unsigned int type() const; |
| 126 | virtual unsigned int width() const; |
| 127 | virtual unsigned int height() const; |
| 128 | virtual unsigned int format() const; |
| 129 | virtual unsigned int defaultWidth() const; |
| 130 | virtual unsigned int defaultHeight() const; |
| 131 | virtual unsigned int queueLength() const; |
| 132 | virtual unsigned int transformHint() const; |
| 133 | // perform calls |
| 134 | virtual int setUsage(int usage); |
| 135 | virtual int setBuffersFormat(int format); |
| 136 | virtual int setBuffersDimensions(int width, int height); |
| 137 | virtual int setBufferCount(int cnt); |
| 138 | |
| 139 | private: |
| 140 | WaylandNativeWindowBuffer *addBuffer(); |
| 141 | void destroyBuffer(WaylandNativeWindowBuffer *); |
| 142 | void destroyBuffers(); |
| 143 | std::list<WaylandNativeWindowBuffer *> m_bufList; |
| 144 | std::list<WaylandNativeWindowBuffer *> fronted; |
| 145 | std::list<WaylandNativeWindowBuffer *> posted; |
| 146 | std::list<WaylandNativeWindowBuffer *> post_registered; |
| 147 | struct wl_egl_window *m_window; |
| 148 | struct wl_display *m_display; |
| 149 | unsigned int m_width; |
| 150 | unsigned int m_height; |
| 151 | unsigned int m_format; |
| 152 | unsigned int m_defaultWidth; |
| 153 | unsigned int m_defaultHeight; |
| 154 | unsigned int m_usage; |
| 155 | struct android_wlegl *m_android_wlegl; |
| 156 | alloc_device_t* m_alloc; |
| 157 | struct wl_registry *registry; |
| 158 | const gralloc_module_t* m_gralloc; |
| 159 | pthread_mutex_t mutex; |
| 160 | pthread_cond_t cond; |
| 161 | int m_freeBufs; |
| 162 | struct wl_callback *frame_callback; |
| 163 | static int wayland_roundtrip(WaylandNativeWindow *display); |
| 164 | }; |
| 165 | |
| 166 | #endif |
| 167 | // vim: noai:ts=4:sw=4:ss=4:expandtab |