From bb3c0fbd3e613987ff4d05bb0c137679d36f8955 Mon Sep 17 00:00:00 2001 From: wayo Date: Sun, 31 Mar 2013 22:45:14 -0600 Subject: [PATCH] Added gloffscreen.h and fixed gloffscreen_glx conditional. --- target-i386/gloffscreen.h | 131 ++++++++++++++++++++++++++++++++++ target-i386/gloffscreen_glx.c | 2 +- 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 target-i386/gloffscreen.h diff --git a/target-i386/gloffscreen.h b/target-i386/gloffscreen.h new file mode 100644 index 0000000000..8fb698b055 --- /dev/null +++ b/target-i386/gloffscreen.h @@ -0,0 +1,131 @@ +/* + * Offscreen OpenGL abstraction layer + * + * Copyright (c) 2010 Intel + * Written by: + * Gordon Williams + * Ian Molton + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef GLOFFSCREEN_H_ +#define GLOFFSCREEN_H_ + +/* Used to hold data for the OpenGL context */ +struct _GloContext; +typedef struct _GloContext GloContext; +/* Used to hold data for an offscreen surface. */ +struct _GloSurface; +typedef struct _GloSurface GloSurface; + +/* Format flags for glo_surface_create */ +#define GLO_FF_ALPHA_MASK (0x0001) +#define GLO_FF_NOALPHA (0x0000) +#define GLO_FF_ALPHA (0x0001) + +#define GLO_FF_BITS_MASK (0x00F0) +#define GLO_FF_BITS_16 (0x0020) +#define GLO_FF_BITS_24 (0x0030) +#define GLO_FF_BITS_32 (0x0040) + +#define GLO_FF_DEPTH_MASK (0x0F00) +#define GLO_FF_DEPTH_16 (0x0100) +#define GLO_FF_DEPTH_24 (0x0200) +#define GLO_FF_DEPTH_32 (0x0300) + +#define GLO_FF_STENCIL_MASK (0xF000) +#define GLO_FF_STENCIL_8 (0x1000) + +/* The only currently supported format */ +#define GLO_FF_DEFAULT (GLO_FF_BITS_24|GLO_FF_DEPTH_24)//(GLO_FF_BITS_32|GLO_FF_ALPHA) + +/* Has gloffscreen been previously initialised? */ +extern int glo_initialised(void); + +/* Initialise gloffscreen */ +extern void glo_init(void); + +/* Change current context */ +extern void glo_set_current(GloContext *context); + +/* Uninitialise gloffscreen */ +extern void glo_kill(void); + +/* Like wglGetProcAddress/glxGetProcAddress */ +extern void *glo_getprocaddress(const char *procName); + +/* OS-independent glXQueryExtensionsString */ +extern const char *glo_glXQueryExtensionsString(void); + +/* Create an OpenGL context for a certain pixel format. formatflags are from the GLO_ constants */ +extern GloContext *glo_context_create(int formatFlags); + +/* Destroy a previouslu created OpenGL context */ +extern void glo_context_destroy(GloContext *context); + +/* Create a surface with given width and height, */ +extern GloSurface *glo_surface_create(int width, int height, GloContext *context); + +/* Destroy the given surface */ +extern void glo_surface_destroy(GloSurface *surface); + +/* Make the given surface current */ +extern int glo_surface_makecurrent(GloSurface *surface); + +/* Get the contents of the given surface. Note that this is top-down, not + * bottom-up as glReadPixels would do. */ +extern void glo_surface_getcontents(GloSurface *surface, int stride, int type, void *data); + +/* Return the width and height of the given surface */ +extern void glo_surface_get_size(GloSurface *surface, int *width, int *height); + +/* Functions to decode the format flags */ +extern int glo_flags_get_depth_bits(int formatFlags); +extern int glo_flags_get_stencil_bits(int formatFlags); +extern void glo_flags_get_rgba_bits(int formatFlags, int *rgba); +extern int glo_flags_get_bytes_per_pixel(int formatFlags); +extern void glo_flags_get_readpixel_type(int formatFlags, int *glFormat, int *glType); +/* Score how close the given format flags match. 0=great, >0 not so great */ +extern int glo_flags_score(int formatFlagsExpected, int formatFlagsReal); + +/* Create a set of format flags from a null-terminated list + * of GLX fbConfig flags. If assumeBooleans is set, items such + * as GLX_RGBA/GLX_DOUBLEBUFFER are treated as booleans, not key-value pairs + * (glXChooseVisual treats them as booleans, glXChooseFBConfig as key-value pairs) + */ +extern int glo_flags_get_from_glx(const int *fbConfig, int assumeBooleans); +/* Use in place of glxGetConfig - returns information from flags based on a GLX enum */ +extern int glo_get_glx_from_flags(int formatFlags, int glxEnum); + + +/* In terms of speed, glReadPixels actually seems the best we can do. + * * On Windows PFB_DRAW_TO_BITMAP is software-only. + * * http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt would be + * useful if we didn't want the data right away (as we could avoid flushing the + * pipeline). + * * The internal data format seems to be GL_BGRA - and this is indeed faster. + * * Apple suggests using GL_UNSIGNED_INT_8_8_8_8_REV instead of + * GL_UNSIGNED_BYTE, but there don't appear to be any speed increase from + * doing this on Windows at least. + */ + + + +#endif /* GLOFFSCREEN_H_ */ diff --git a/target-i386/gloffscreen_glx.c b/target-i386/gloffscreen_glx.c index 23e48e9598..6fe4872996 100644 --- a/target-i386/gloffscreen_glx.c +++ b/target-i386/gloffscreen_glx.c @@ -24,7 +24,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#if !defined(_WIN32) || !defined(__APPLE__) +#if !defined(_WIN32) && !defined(__APPLE__) #include "gloffscreen.h" #include