blob: 990903e27a4b0ebe21dc177635619c8076f46bd1 [file] [log] [blame]
/*
* 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
/* This header and its declarations must be usable from C code.
*
* If RENDER_API_NO_PROTOTYPES is #defined before including this header, only
* the interface function pointer types will be declared, not the prototypes.
* This allows the client to use those names for its function pointer variables.
*
* All interfaces which can fail return an int, with zero indicating failure
* and anything else indicating success.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include "render_api_platform_types.h"
#if defined(RENDER_API_NO_PROTOTYPES)
#define DECL(ret, name, args) \
typedef ret (* name##Fn) args
#else
#define DECL(ret, name, args) \
typedef ret (* name##Fn) args ; \
ret name args
#endif
/* 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)
*/
DECL(int, initLibrary, (void));
/* list of constants to be passed to setStreamMode */
#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 */
DECL(int, setStreamMode, (int mode));
/* initOpenGLRenderer - initialize the OpenGL renderer process.
*
* width and height are the framebuffer dimensions that will be reported to the
* guest display driver.
*
* addr is a buffer of addrLen bytes that will receive the address that clients
* should connect to. The interpretation depends on the transport:
* - TCP: The buffer contains the port number as a string. The server is
* listening only on the loopback address.
* - Win32 and UNIX named pipes: The buffer contains the full path clients
* should connect to.
*
* This function is *NOT* thread safe and should be called first
* to initialize the renderer after initLibrary().
*/
DECL(int, initOpenGLRenderer, (int width, int height, char* addr, size_t addrLen));
/* getHardwareStrings - describe the GPU hardware and driver.
* The underlying GL's vendor/renderer/version strings are returned to the
* caller. The pointers become invalid after a call to stopOpenGLRenderer().
*/
DECL(void, getHardwareStrings, (const char** vendor, const char** renderer,
const char** version));
/* A per-frame callback can be registered with setPostCallback(); to remove it
* pass NULL for both parameters. While a callback is registered, the renderer
* will call it 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);
DECL(void, setPostCallback, (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.
*/
DECL(int, 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.
*/
DECL(int, destroyOpenGLSubwindow, (void));
/* setOpenGLDisplayRotation -
* set the framebuffer display image rotation in units
* of degrees around the z axis
*/
DECL(void, setOpenGLDisplayRotation, (float zRot));
/* repaintOpenGLDisplay -
* causes the OpenGL subwindow to get repainted with the
* latest framebuffer content.
*/
DECL(void, repaintOpenGLDisplay, (void));
/* stopOpenGLRenderer - stops the OpenGL renderer process.
* This functions is *NOT* thread safe and should be called
* only if previous initOpenGLRenderer has returned true.
*/
DECL(int, stopOpenGLRenderer, (void));
#ifdef __cplusplus
}
#endif
#endif