summaryrefslogtreecommitdiff
path: root/src/android-framebuffer.cpp
diff options
context:
space:
mode:
authorPekka Paalanen <ppaalanen@gmail.com>2012-05-30 15:53:45 +0300
committerKristian Høgsberg <krh@bitplanet.net>2012-05-31 13:54:01 -0400
commit3ae50bb45c4087da7b6de7733e8b44a5ea720398 (patch)
tree51b638bbce5593228d5c0387a396fba1ec700956 /src/android-framebuffer.cpp
parentdaed3bc1aaa8181188d223257c87292a27cf4270 (diff)
Add Android backend
The Android backend provides basic EGL/GLES2 graphics, where everything is always composited. Overlays are not used. Input is stubbed, therefore there is no input yet. This adds the first C++ source file into Weston compositor. The Android gralloc and fb HAL glue code to the Android EGL library is in C++, and there is no way to access it from plain C. We have a simple wrapper to the required C++ class API. Android forces the C++ file name extension to .cpp. The android backend is compiled by default. However, all Android specific calls are protected with #ifdef ANDROID, so it will build also without Android headers. The binary produced without the Android build system is useless, but allows build-testing generic Weston changes. Therefore the android backend is not installed. Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Diffstat (limited to 'src/android-framebuffer.cpp')
-rw-r--r--src/android-framebuffer.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/android-framebuffer.cpp b/src/android-framebuffer.cpp
new file mode 100644
index 0000000..1dfe9e8
--- /dev/null
+++ b/src/android-framebuffer.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2012 Collabora, Ltd.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders not be used in
+ * advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. The copyright holders make
+ * no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <cstdlib>
+
+#include "android-framebuffer.h"
+
+#ifdef ANDROID
+
+#include <ui/FramebufferNativeWindow.h>
+
+class AndroidFramebuffer {
+public:
+ int init();
+
+ struct android_framebuffer fb_;
+
+private:
+ android::sp<android::FramebufferNativeWindow> nativefb_;
+};
+
+int AndroidFramebuffer::init()
+{
+ struct ANativeWindow *window;
+ const framebuffer_device_t *fbdev;
+ int ret1, ret2, ret3;
+
+ nativefb_ = new android::FramebufferNativeWindow();
+ fbdev = nativefb_->getDevice();
+
+ if (!fbdev)
+ return -1;
+
+ fb_.priv = this;
+
+ window = nativefb_.get();
+ ret1 = window->query(window, NATIVE_WINDOW_WIDTH, &fb_.width);
+ ret2 = window->query(window, NATIVE_WINDOW_HEIGHT, &fb_.height);
+ ret3 = window->query(window, NATIVE_WINDOW_FORMAT, &fb_.format);
+ fb_.xdpi = window->xdpi;
+ fb_.ydpi = window->ydpi;
+ fb_.refresh_rate = fbdev->fps;
+
+ if (ret1 != android::NO_ERROR ||
+ ret2 != android::NO_ERROR ||
+ ret3 != android::NO_ERROR)
+ return -1;
+
+ fb_.native_window = reinterpret_cast<EGLNativeWindowType>(window);
+ return 0;
+}
+
+void
+android_framebuffer_destroy(struct android_framebuffer *fb)
+{
+ AndroidFramebuffer *afb = static_cast<AndroidFramebuffer*>(fb->priv);
+
+ delete afb;
+}
+
+struct android_framebuffer *
+android_framebuffer_create(void)
+{
+ AndroidFramebuffer *afb = new AndroidFramebuffer;
+
+ if (afb->init() < 0) {
+ delete afb;
+ return NULL;
+ }
+
+ return &afb->fb_;
+}
+
+#endif /* ANDROID */