aboutsummaryrefslogtreecommitdiffstats
path: root/emulator/opengl/host/include/libOpenglRender
diff options
context:
space:
mode:
authorJesse Hall <jessehall@google.com>2012-04-16 12:49:39 -0700
committerJesse Hall <jessehall@google.com>2012-04-16 15:54:18 -0700
commitce6c3389061fb9fcdefc94fab2044a8e11600b52 (patch)
treefedd1a11cbd21ec14bf00be83b8712054f8c5506 /emulator/opengl/host/include/libOpenglRender
parentad0111a77b0f0908cc945dc6e8e8949b75cb8886 (diff)
downloadsdk-ce6c3389061fb9fcdefc94fab2044a8e11600b52.zip
sdk-ce6c3389061fb9fcdefc94fab2044a8e11600b52.tar.gz
sdk-ce6c3389061fb9fcdefc94fab2044a8e11600b52.tar.bz2
Move emulator GLES from development.git to sdk.git
The emulator GLES support has two interfaces: a host shared library interface used by QEMU, and a protocol between the platform and the host. The host library interface is not versioned; QEMU and the GLES renderer must match. The protocol on the other hand must be backwards compatible: a new GLES renderer must support an older platform image. Thus for branching purposes it makes more sense to put the GLES renderer in sdk.git, which is branched along with qemu.git for SDK releases. Platform images will be built against the protocol version in the platform branch of sdk.git. Change-Id: I2c3bce627ecfd0a4b3e688d1839fe10755a21e58
Diffstat (limited to 'emulator/opengl/host/include/libOpenglRender')
-rw-r--r--emulator/opengl/host/include/libOpenglRender/IOStream.h102
-rw-r--r--emulator/opengl/host/include/libOpenglRender/render_api.h136
-rw-r--r--emulator/opengl/host/include/libOpenglRender/render_api_platform_types.h41
3 files changed, 279 insertions, 0 deletions
diff --git a/emulator/opengl/host/include/libOpenglRender/IOStream.h b/emulator/opengl/host/include/libOpenglRender/IOStream.h
new file mode 100644
index 0000000..445ec17
--- /dev/null
+++ b/emulator/opengl/host/include/libOpenglRender/IOStream.h
@@ -0,0 +1,102 @@
+/*
+* 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 __IO_STREAM_H__
+#define __IO_STREAM_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "ErrorLog.h"
+
+class IOStream {
+public:
+
+ IOStream(size_t bufSize) {
+ m_buf = NULL;
+ m_bufsize = bufSize;
+ m_free = 0;
+ }
+
+ virtual void *allocBuffer(size_t minSize) = 0;
+ virtual int commitBuffer(size_t size) = 0;
+ virtual const unsigned char *readFully( void *buf, size_t len) = 0;
+ virtual const unsigned char *read( void *buf, size_t *inout_len) = 0;
+ virtual int writeFully(const void* buf, size_t len) = 0;
+
+ virtual ~IOStream() {
+
+ // NOTE: m_buf is 'owned' by the child class thus we expect it to be released by it
+ }
+
+ unsigned char *alloc(size_t len) {
+
+ if (m_buf && len > m_free) {
+ if (flush() < 0) {
+ ERR("Failed to flush in alloc\n");
+ return NULL; // we failed to flush so something is wrong
+ }
+ }
+
+ if (!m_buf || len > m_bufsize) {
+ int allocLen = m_bufsize < len ? len : m_bufsize;
+ m_buf = (unsigned char *)allocBuffer(allocLen);
+ if (!m_buf) {
+ ERR("Alloc (%u bytes) failed\n", allocLen);
+ return NULL;
+ }
+ m_bufsize = m_free = allocLen;
+ }
+
+ unsigned char *ptr;
+
+ ptr = m_buf + (m_bufsize - m_free);
+ m_free -= len;
+
+ return ptr;
+ }
+
+ int flush() {
+
+ if (!m_buf || m_free == m_bufsize) return 0;
+
+ int stat = commitBuffer(m_bufsize - m_free);
+ m_buf = NULL;
+ m_free = 0;
+ return stat;
+ }
+
+ const unsigned char *readback(void *buf, size_t len) {
+ flush();
+ return readFully(buf, len);
+ }
+
+
+private:
+ unsigned char *m_buf;
+ size_t m_bufsize;
+ size_t m_free;
+};
+
+//
+// When a client opens a connection to the renderer, it should
+// send unsigned int value indicating the "clientFlags".
+// The following are the bitmask of the clientFlags.
+// currently only one bit is used which flags the server
+// it should exit.
+//
+#define IOSTREAM_CLIENT_EXIT_SERVER 1
+
+#endif
diff --git a/emulator/opengl/host/include/libOpenglRender/render_api.h b/emulator/opengl/host/include/libOpenglRender/render_api.h
new file mode 100644
index 0000000..9c76b3e
--- /dev/null
+++ b/emulator/opengl/host/include/libOpenglRender/render_api.h
@@ -0,0 +1,136 @@
+/*
+* 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 _OPENGL_RENDERER_RENDER_API_H
+#define _OPENGL_RENDERER_RENDER_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "render_api_platform_types.h"
+
+/* If a function with this signature is passed to initOpenGLRenderer(),
+ * it will be called by the renderer just before each new frame is displayed,
+ * providing a copy of the framebuffer contents.
+ *
+ * The callback will be called from one of the renderer's threads, so will
+ * probably need synchronization on any data structures it modifies. The
+ * pixels buffer may be overwritten as soon as the callback returns; if it needs
+ * the pixels afterwards it must copy them.
+ *
+ * The pixels buffer is intentionally not const: the callback may modify the
+ * data without copying to another buffer if it wants, e.g. in-place RGBA to RGB
+ * conversion, or in-place y-inversion.
+ *
+ * Parameters are:
+ * context The pointer optionally provided when the callback was
+ * registered. The client can use this to pass whatever
+ * information it wants to the callback.
+ * width, height Dimensions of the image, in pixels. Rows are tightly packed;
+ * there is no inter-row padding.
+ * ydir Indicates row order: 1 means top-to-bottom order, -1 means
+ * bottom-to-top order.
+ * format, type Format and type GL enums, as used in glTexImage2D() or
+ * glReadPixels(), describing the pixel format.
+ * pixels The framebuffer image.
+ *
+ * In the first implementation, ydir is always -1 (bottom to top), format and
+ * type are always GL_RGBA and GL_UNSIGNED_BYTE, and the width and height will
+ * always be the same as the ones passed to initOpenGLRenderer().
+ */
+typedef void (*OnPostFn)(void* context, int width, int height, int ydir,
+ int format, int type, unsigned char* pixels);
+
+// initLibrary - initialize the library and tries to load the corresponding
+// GLES translator libraries. This function must be called before anything
+// else to ensure that everything works. If it returns an error, then
+// you cannot use the library at all (this can happen under certain
+// environments where the desktop GL libraries are not available)
+//
+// returns true if the library could be initialized successfully;
+//
+bool initLibrary(void);
+
+// list of constants to be passed to setStreamMode, which determines
+// which
+#define STREAM_MODE_DEFAULT 0
+#define STREAM_MODE_TCP 1
+#define STREAM_MODE_UNIX 2
+#define STREAM_MODE_PIPE 3
+
+// Change the stream mode. This must be called before initOpenGLRenderer
+int setStreamMode(int mode);
+
+//
+// initOpenGLRenderer - initialize the OpenGL renderer process.
+// portNum is the tcp port number the renderer is listening to.
+// width and height are the framebuffer dimensions that will be
+// reported to the guest display driver.
+//
+// returns true if renderer has been started successfully;
+//
+// This function is *NOT* thread safe and should be called first
+// to initialize the renderer after initLibrary().
+//
+bool initOpenGLRenderer(int width, int height, int portNum,
+ OnPostFn onPost, void* onPostContext);
+
+//
+// createOpenGLSubwindow -
+// Create a native subwindow which is a child of 'window'
+// to be used for framebuffer display.
+// Framebuffer will not get displayed if a subwindow is not
+// created.
+// x,y,width,height are the dimensions of the rendering subwindow.
+// zRot is the rotation to apply on the framebuffer display image.
+//
+bool createOpenGLSubwindow(FBNativeWindowType window,
+ int x, int y, int width, int height, float zRot);
+
+//
+// destroyOpenGLSubwindow -
+// destroys the created native subwindow. Once destroyed,
+// Framebuffer content will not be visible until a new
+// subwindow will be created.
+//
+bool destroyOpenGLSubwindow();
+
+//
+// setOpenGLDisplayRotation -
+// set the framebuffer display image rotation in units
+// of degrees around the z axis
+//
+void setOpenGLDisplayRotation(float zRot);
+
+//
+// repaintOpenGLDisplay -
+// causes the OpenGL subwindow to get repainted with the
+// latest framebuffer content.
+//
+void repaintOpenGLDisplay();
+
+//
+// stopOpenGLRenderer - stops the OpenGL renderer process.
+// This functions is *NOT* thread safe and should be called
+// only if previous initOpenGLRenderer has returned true.
+//
+bool stopOpenGLRenderer();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/emulator/opengl/host/include/libOpenglRender/render_api_platform_types.h b/emulator/opengl/host/include/libOpenglRender/render_api_platform_types.h
new file mode 100644
index 0000000..38324e1
--- /dev/null
+++ b/emulator/opengl/host/include/libOpenglRender/render_api_platform_types.h
@@ -0,0 +1,41 @@
+/*
+* Copyright 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 _RENDER_API_PLATFORM_TYPES_H
+#define _RENDER_API_PLATFORM_TYPES_H
+
+#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#include <windows.h>
+
+typedef HDC FBNativeDisplayType;
+typedef HWND FBNativeWindowType;
+
+#elif defined(__linux__)
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+typedef Window FBNativeWindowType;
+
+#elif defined(__APPLE__)
+
+typedef void* FBNativeWindowType;
+
+#else
+#warning "Unsupported platform"
+#endif
+
+#endif // of _RENDER_API_PLATFORM_TYPES_H