From 5a131570bb38edfde26bb3919ee14a71793279c7 Mon Sep 17 00:00:00 2001 From: espes Date: Thu, 2 Jul 2015 21:54:33 +1000 Subject: [PATCH] rejig glo extension stuff --- Makefile.target | 2 +- gl/glextensions.c | 9 +++++++++ gl/glextensions.h | 8 ++++++++ gl/gloffscreen.h | 25 +++++++++++++------------ gl/gloffscreen_cgl.c | 7 +++---- gl/gloffscreen_common.c | 19 +++++++++++++++++++ gl/gloffscreen_glx.c | 11 ++--------- gl/gloffscreen_wgl.c | 23 ----------------------- hw/xbox/nv2a.c | 21 +++++++-------------- 9 files changed, 62 insertions(+), 63 deletions(-) create mode 100644 gl/glextensions.c create mode 100644 gl/glextensions.h diff --git a/Makefile.target b/Makefile.target index 65948c31eb..3c8b733b06 100644 --- a/Makefile.target +++ b/Makefile.target @@ -131,7 +131,7 @@ obj-y += hw/$(TARGET_BASE_ARCH)/ endif # OpenGl Support -obj-gl-y += gl/gloffscreen_common.o +obj-gl-y += gl/gloffscreen_common.o gl/glextensions.o obj-gl-$(CONFIG_WIN32) += gl/gloffscreen_wgl.o obj-gl-$(CONFIG_DARWIN) += gl/gloffscreen_cgl.o obj-gl-$(CONFIG_LINUX) += gl/gloffscreen_glx.o diff --git a/gl/glextensions.c b/gl/glextensions.c new file mode 100644 index 0000000000..361a0cff23 --- /dev/null +++ b/gl/glextensions.c @@ -0,0 +1,9 @@ +#include "gloffscreen.h" +#include "glextensions.h" + +void (*glFrameTerminatorGREMEDY)(void); + +void glextensions_init(void) +{ + glFrameTerminatorGREMEDY = glo_get_extension_proc("glFrameTerminatorGREMEDY"); +} diff --git a/gl/glextensions.h b/gl/glextensions.h new file mode 100644 index 0000000000..33adc25960 --- /dev/null +++ b/gl/glextensions.h @@ -0,0 +1,8 @@ +#ifndef GLEXTEENSIONS_H_ +#define GLEXTEENSIONS_H_ + +extern void (*glFrameTerminatorGREMEDY)(void); + +void glextensions_init(void); + +#endif diff --git a/gl/gloffscreen.h b/gl/gloffscreen.h index f098320134..6ab6683755 100644 --- a/gl/gloffscreen.h +++ b/gl/gloffscreen.h @@ -29,6 +29,8 @@ #ifndef GLOFFSCREEN_H_ #define GLOFFSCREEN_H_ +#include + #ifdef __APPLE__ #include #elif defined(_WIN32) @@ -65,31 +67,30 @@ typedef struct _GloContext GloContext; #define GLO_FF_DEFAULT (GLO_FF_BITS_24|GLO_FF_DEPTH_24) /* Change current context */ -extern void glo_set_current(GloContext *context); +void glo_set_current(GloContext *context); /* Check GL Extensions */ -extern GLboolean glo_check_extension( - const GLubyte *extName, const GLubyte *extString); -void* glo_get_extension_proc(const GLubyte *extProc); +bool glo_check_extension(const char* ext_name); +void* glo_get_extension_proc(const char* extProc); /* Create an OpenGL context for a certain * pixel format. formatflags are from the * GLO_ constants */ -extern GloContext *glo_context_create(int formatFlags); +GloContext *glo_context_create(int formatFlags); /* Destroy a previouslu created OpenGL context */ -extern void glo_context_destroy(GloContext *context); +void glo_context_destroy(GloContext *context); /* 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); +int glo_flags_get_depth_bits(int formatFlags); +int glo_flags_get_stencil_bits(int formatFlags); +void glo_flags_get_rgba_bits(int formatFlags, int *rgba); +int glo_flags_get_bytes_per_pixel(int formatFlags); /* Score how close the given format flags match. 0=great, >0 not so great */ -extern int glo_flags_score(int formatFlagsExpected, int formatFlagsReal); +int glo_flags_score(int formatFlagsExpected, int formatFlagsReal); /* Note that this is top-down, not bottom-up as glReadPixels would do. */ -extern void glo_readpixels(GLenum gl_format, GLenum gl_type, +void glo_readpixels(GLenum gl_format, GLenum gl_type, unsigned int bytes_per_pixel, unsigned int stride, unsigned int width, unsigned int height, void *data); diff --git a/gl/gloffscreen_cgl.c b/gl/gloffscreen_cgl.c index 6374a71c57..448ae678a2 100644 --- a/gl/gloffscreen_cgl.c +++ b/gl/gloffscreen_cgl.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "qemu-common.h" @@ -68,11 +69,9 @@ GloContext *glo_context_create(int formatFlags) return context; } -/* Check if an extension is available. */ -GLboolean glo_check_extension(const GLubyte *extName, - const GLubyte *extString) +void* glo_get_extension_proc(const char* ext_proc) { - return gluCheckExtension(extName, extString); + return dlsym(RTLD_NEXT, ext_proc); } /* Set current context */ diff --git a/gl/gloffscreen_common.c b/gl/gloffscreen_common.c index 12f9955c54..cfc53c9106 100644 --- a/gl/gloffscreen_common.c +++ b/gl/gloffscreen_common.c @@ -162,3 +162,22 @@ void glo_readpixels(GLenum gl_format, GLenum gl_type, glPixelStorei(GL_PACK_ROW_LENGTH, rl); glPixelStorei(GL_PACK_ALIGNMENT, pa); } + + +bool glo_check_extension(const char* ext_name) +{ + const char *ext_string = (const char *) glGetString(GL_EXTENSIONS); + if (!ext_string) { + return false; + } + const char* p = ext_string; + const char* end = p + strlen(p); + while (p < end) { + size_t n = strcspn(p, " "); + if ((strlen(ext_name) == n) && (strncmp(ext_name, p, n) == 0)) { + return true; + } + p += (n + 1); + } + return false; +} diff --git a/gl/gloffscreen_glx.c b/gl/gloffscreen_glx.c index b94dc8fd1c..f8f134a1ec 100644 --- a/gl/gloffscreen_glx.c +++ b/gl/gloffscreen_glx.c @@ -112,16 +112,9 @@ GloContext *glo_context_create(int formatFlags) return context; } -/* Check if an extension is available. */ -GLboolean glo_check_extension(const GLubyte *extName, - const GLubyte *extString) +void* glo_get_extension_proc(const char* ext_proc) { - return gluCheckExtension(extName, extString); -} - -void* glo_get_extension_proc(const GLubyte *extProc) -{ - return glXGetProcAddress(extProc); + return glXGetProcAddress((const GLubyte *)ext_proc); } /* Set current context */ diff --git a/gl/gloffscreen_wgl.c b/gl/gloffscreen_wgl.c index cae32a0f67..99ec2ac1b4 100644 --- a/gl/gloffscreen_wgl.c +++ b/gl/gloffscreen_wgl.c @@ -281,26 +281,3 @@ void glo_context_destroy(GloContext *context) } free(context); } - - -/* Check extension implementation for Windows. - * The Glu 1.2 framework in Windows doesn't include them... */ -GLboolean glo_check_extension(const GLubyte *extName, - const GLubyte *extString) -{ - char *p = (char *) glGetString(GL_EXTENSIONS); - char *end; - if (p == NULL) { - return GL_FALSE; - } - end = p + strlen(p); - - while (p < end) { - int n = strcspn(p, " "); - if ((strlen(extName) == n) && (strncmp(extName, p, n) == 0)) { - return GL_TRUE; - } - p += (n + 1); - } - return GL_FALSE; -} diff --git a/hw/xbox/nv2a.c b/hw/xbox/nv2a.c index 62211ffc0b..18491dd7cf 100644 --- a/hw/xbox/nv2a.c +++ b/hw/xbox/nv2a.c @@ -27,6 +27,7 @@ #include "qemu/thread.h" #include "qapi/qmp/qstring.h" #include "gl/gloffscreen.h" +#include "gl/glextensions.h" #include "hw/xbox/swizzle.h" #include "hw/xbox/u_format_r11g11b10f.h" @@ -2144,24 +2145,16 @@ static void pgraph_init(PGRAPHState *pg) pg->gl_context = glo_context_create(GLO_FF_DEFAULT); assert(pg->gl_context); + glextensions_init(); + /* Check context capabilities */ - const GLubyte *extensions = glGetString(GL_EXTENSIONS); + assert(glo_check_extension("GL_EXT_texture_compression_s3tc")); - assert(glo_check_extension((const GLubyte *) - "GL_EXT_texture_compression_s3tc", - extensions)); + assert(glo_check_extension("GL_EXT_framebuffer_object")); - assert(glo_check_extension((const GLubyte *) - "GL_EXT_framebuffer_object", - extensions)); + assert(glo_check_extension("GL_ARB_texture_rectangle")); - assert(glo_check_extension((const GLubyte *) - "GL_ARB_texture_rectangle", - extensions)); - - assert(glo_check_extension((const GLubyte *) - "GL_ARB_vertex_array_bgra", - extensions)); + assert(glo_check_extension("GL_ARB_vertex_array_bgra")); GLint max_vertex_attributes; glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attributes);