From edee1134b22c54618d59ccfda0b8e3db73e94238 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Thu, 25 Nov 2004 15:47:49 +0000 Subject: [PATCH] Factorize OSMesa OpenGL code for Atari drivers --- configure.in | 24 +- src/video/SDL_video.c | 2 + src/video/ataricommon/Makefile.am | 2 + src/video/ataricommon/SDL_atarigl.c | 331 ++++++++++++++++++++++++++ src/video/ataricommon/SDL_atarigl_c.h | 62 +++++ src/video/gem/SDL_gemvideo.c | 276 ++------------------- src/video/gem/SDL_gemvideo.h | 10 - src/video/xbios/SDL_xbios.c | 152 ++---------- src/video/xbios/SDL_xbios.h | 10 - 9 files changed, 444 insertions(+), 425 deletions(-) create mode 100644 src/video/ataricommon/SDL_atarigl.c create mode 100644 src/video/ataricommon/SDL_atarigl_c.h diff --git a/configure.in b/configure.in index 7b809adc0..5eec89305 100644 --- a/configure.in +++ b/configure.in @@ -1130,14 +1130,22 @@ CheckMacGL() } dnl Check for Mesa offscreen rendering -CheckOSMesa() +CheckAtariOSMesa() { - if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then - AC_CHECK_HEADER(GL/osmesa.h, have_osmesa_hdr=yes) - AC_CHECK_LIB(OSMesa, OSMesaCreateContext, have_osmesa_lib=yes, have_osmesa_lib=no, -lm) - if test x$have_osmesa_hdr = xyes -a x$have_osmesa_lib = xyes; then - CFLAGS="$CFLAGS -DHAVE_OPENGL" - SYSTEM_LIBS="$SYSTEM_LIBS -lOSMesa" + if test "x$enable_video" = "xyes" -a "x$enable_video_opengl" = "xyes"; then + AC_PATH_PROG(OSMESA_CONFIG, osmesa-config, no) + if test "x$OSMESA_CONFIG" = "xno" -o "x$enable_atari_ldg" = "xno"; then + AC_CHECK_HEADER(GL/osmesa.h, have_osmesa_hdr=yes) + AC_CHECK_LIB(OSMesa, OSMesaCreateContext, have_osmesa_lib=yes, have_osmesa_lib=no, -lm) + if test "x$have_osmesa_hdr" = "xyes" -a "x$have_osmesa_lib" = "xyes"; then + CFLAGS="$CFLAGS -DHAVE_OPENGL" + SYSTEM_LIBS="$SYSTEM_LIBS -lOSMesa" + fi + else + OSMESA_CFLAGS=`$OSMESA_CONFIG --cflags` + OSMESA_LIBS=`$OSMESA_CONFIG --libs` + CFLAGS="$CFLAGS -DHAVE_OPENGL $OSMESA_CFLAGS" + SYSTEM_LIBS="$SYSTEM_LIBS $OSMESA_LIBS" fi fi } @@ -2584,8 +2592,8 @@ case "$target" in CheckAtariGemVideo CheckAtariAudio CheckAtariLdg + CheckAtariOSMesa CheckPTH - CheckOSMesa # Set up files for the audio library if test x$enable_threads = xyes -a x$enable_pth = xyes; then if test x$enable_audio = xyes; then diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 1980bd8af..0b9269576 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -747,6 +747,8 @@ SDL_Surface * SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags) #define __SDL_NOGETPROCADDR__ #elif defined(__QNXNTO__) && (_NTO_VERSION < 630) #define __SDL_NOGETPROCADDR__ +#elif defined(__MINT__) +#define __SDL_NOGETPROCADDR__ #endif #ifdef __SDL_NOGETPROCADDR__ #define SDL_PROC(ret,func,params) video->func=func; diff --git a/src/video/ataricommon/Makefile.am b/src/video/ataricommon/Makefile.am index 3a4899fc9..f01fd6e25 100644 --- a/src/video/ataricommon/Makefile.am +++ b/src/video/ataricommon/Makefile.am @@ -12,6 +12,8 @@ ATARICOMMON_SRCS = \ SDL_atarieddi_s.h \ SDL_atarievents.c \ SDL_atarievents_c.h \ + SDL_atarigl.c \ + SDL_atarigl_c.h \ SDL_atarikeys.h \ SDL_atarimxalloc.c \ SDL_atarimxalloc_c.h \ diff --git a/src/video/ataricommon/SDL_atarigl.c b/src/video/ataricommon/SDL_atarigl.c new file mode 100644 index 000000000..6790bdfad --- /dev/null +++ b/src/video/ataricommon/SDL_atarigl.c @@ -0,0 +1,331 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* Atari OSMesa.ldg implementation of SDL OpenGL support */ + +/*--- Includes ---*/ + +#ifdef HAVE_OPENGL +#include +#endif + +#include "SDL_video.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_atarigl_c.h" + +/*--- Variables ---*/ + +/*--- Functions prototypes ---*/ + +static void ConvertNull(SDL_Surface *surface); +static void Convert565To555be(SDL_Surface *surface); +static void Convert565To555le(SDL_Surface *surface); +static void Convert565le(SDL_Surface *surface); +static void ConvertBGRAToABGR(SDL_Surface *surface); + +/*--- Public functions ---*/ + +int SDL_AtariGL_Init(_THIS, SDL_Surface *current) +{ +#ifdef HAVE_OPENGL + GLenum osmesa_format; + SDL_PixelFormat *pixel_format; + Uint32 redmask; + + SDL_AtariGL_Quit(this); /* Destroy previous context if exist */ + + /* Init OpenGL context using OSMesa */ + gl_convert = ConvertNull; + + pixel_format = current->format; + redmask = pixel_format->Rmask; + switch (pixel_format->BitsPerPixel) { + case 15: + /* 1555, big and little endian, unsupported */ + osmesa_format = OSMESA_RGB_565; + if (redmask == 31<<10) { + gl_convert = Convert565To555be; + } else { + gl_convert = Convert565To555le; + } + break; + case 16: + if (redmask == 31<<11) { + osmesa_format = OSMESA_RGB_565; + } else { + /* 565, little endian, unsupported */ + osmesa_format = OSMESA_RGB_565; + gl_convert = Convert565le; + } + break; + case 24: + if (redmask == 255<<16) { + osmesa_format = OSMESA_RGB; + } else { + osmesa_format = OSMESA_BGR; + } + break; + case 32: + if (redmask == 255<<16) { + osmesa_format = OSMESA_ARGB; + } else if (redmask == 255<<8) { + osmesa_format = OSMESA_BGRA; + } else if (redmask == 255<<24) { + osmesa_format = OSMESA_RGBA; + } else { + /* ABGR format unsupported */ + osmesa_format = OSMESA_BGRA; + gl_convert = ConvertBGRAToABGR; + } + break; + default: + osmesa_format = OSMESA_COLOR_INDEX; + break; + } + + gl_ctx = OSMesaCreateContextExt( osmesa_format, this->gl_config.depth_size, + this->gl_config.stencil_size, this->gl_config.accum_red_size + + this->gl_config.accum_green_size + this->gl_config.accum_blue_size + + this->gl_config.accum_alpha_size, NULL ); + + gl_active = (gl_ctx != NULL); + return (gl_active); +#else + return 0; +#endif +} + +void SDL_AtariGL_Quit(_THIS) +{ +#ifdef HAVE_OPENGL + /* Shutdown OpenGL context */ + if (gl_ctx) { + OSMesaDestroyContext(gl_ctx); + gl_ctx = NULL; + } +#endif + gl_active = 0; +} + +int SDL_AtariGL_LoadLibrary(_THIS, const char *path) +{ +#ifdef HAVE_OPENGL + /* Library is always opened */ + this->gl_config.driver_loaded = 1; +#endif + return 0; +} + +void *SDL_AtariGL_GetProcAddress(_THIS, const char *proc) +{ + void *func = NULL; +#ifdef HAVE_OPENGL + if (gl_ctx != NULL) { + func = OSMesaGetProcAddress(proc); + } +#endif + return func; +} + +int SDL_AtariGL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) +{ +#ifdef HAVE_OPENGL + GLenum mesa_attrib; + SDL_Surface *surface; + + if (gl_ctx == NULL) { + return -1; + } + + switch(attrib) { + case SDL_GL_RED_SIZE: + mesa_attrib = GL_RED_BITS; + break; + case SDL_GL_GREEN_SIZE: + mesa_attrib = GL_GREEN_BITS; + break; + case SDL_GL_BLUE_SIZE: + mesa_attrib = GL_BLUE_BITS; + break; + case SDL_GL_ALPHA_SIZE: + mesa_attrib = GL_ALPHA_BITS; + break; + case SDL_GL_DOUBLEBUFFER: + surface = this->screen; + *value = ((surface->flags & SDL_DOUBLEBUF)==SDL_DOUBLEBUF); + return 0; + case SDL_GL_DEPTH_SIZE: + mesa_attrib = GL_DEPTH_BITS; + break; + case SDL_GL_STENCIL_SIZE: + mesa_attrib = GL_STENCIL_BITS; + break; + case SDL_GL_ACCUM_RED_SIZE: + mesa_attrib = GL_ACCUM_RED_BITS; + break; + case SDL_GL_ACCUM_GREEN_SIZE: + mesa_attrib = GL_ACCUM_GREEN_BITS; + break; + case SDL_GL_ACCUM_BLUE_SIZE: + mesa_attrib = GL_ACCUM_BLUE_BITS; + break; + case SDL_GL_ACCUM_ALPHA_SIZE: + mesa_attrib = GL_ACCUM_ALPHA_BITS; + break; + default : + return -1; + } + + glGetIntegerv(mesa_attrib, value); + return 0; +#else + return -1; +#endif +} + +int SDL_AtariGL_MakeCurrent(_THIS) +{ +#ifdef HAVE_OPENGL + SDL_Surface *surface; + GLenum type; + + if (gl_ctx == NULL) { + SDL_SetError("Invalid OpenGL context"); + return -1; + } + + surface = this->screen; + + if ((surface->format->BitsPerPixel == 15) || (surface->format->BitsPerPixel == 16)) { + type = GL_UNSIGNED_SHORT_5_6_5; + } else { + type = GL_UNSIGNED_BYTE; + } + + if (!OSMesaMakeCurrent(gl_ctx, surface->pixels, type, surface->w, surface->h)) { + SDL_SetError("Can not make OpenGL context current"); + return -1; + } + + /* OSMesa draws upside down */ + OSMesaPixelStore(OSMESA_Y_UP, 0); + + return 0; +#else + return -1; +#endif +} + +void SDL_AtariGL_SwapBuffers(_THIS) +{ +#ifdef HAVE_OPENGL + if (gl_ctx == NULL) { + return; + } + + gl_convert(this->screen); +#endif +} + +/*--- Private functions ---*/ + +static void ConvertNull(SDL_Surface *surface) +{ +} + +static void Convert565To555be(SDL_Surface *surface) +{ + int x,y, pitch; + unsigned short *line, *pixel; + + line = surface->pixels; + pitch = surface->pitch >> 1; + for (y=0; yh; y++) { + pixel = line; + for (x=0; xw; x++) { + unsigned short color = *pixel; + + *pixel++ = (color & 0x1f)|((color>>1) & 0xffe0); + } + + line += pitch; + } +} + +static void Convert565To555le(SDL_Surface *surface) +{ + int x,y, pitch; + unsigned short *line, *pixel; + + line = surface->pixels; + pitch = surface->pitch >>1; + for (y=0; yh; y++) { + pixel = line; + for (x=0; xw; x++) { + unsigned short color = *pixel; + + color = (color & 0x1f)|((color>>1) & 0xffe0); + *pixel++ = SDL_Swap16(color); + } + + line += pitch; + } +} + +static void Convert565le(SDL_Surface *surface) +{ + int x,y, pitch; + unsigned short *line, *pixel; + + line = surface->pixels; + pitch = surface->pitch >>1; + for (y=0; yh; y++) { + pixel = line; + for (x=0; xw; x++) { + unsigned short color = *pixel; + + *pixel++ = SDL_Swap16(color); + } + + line += pitch; + } +} + +static void ConvertBGRAToABGR(SDL_Surface *surface) +{ + int x,y, pitch; + unsigned long *line, *pixel; + + line = surface->pixels; + pitch = surface->pitch >>2; + for (y=0; yh; y++) { + pixel = line; + for (x=0; xw; x++) { + unsigned long color = *pixel; + + *pixel++ = (color<<24)|(color>>8); + } + + line += pitch; + } +} diff --git a/src/video/ataricommon/SDL_atarigl_c.h b/src/video/ataricommon/SDL_atarigl_c.h new file mode 100644 index 000000000..7cf921849 --- /dev/null +++ b/src/video/ataricommon/SDL_atarigl_c.h @@ -0,0 +1,62 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* Atari OSMesa.ldg implementation of SDL OpenGL support */ + +#ifndef _SDL_ATARIGL_H_ +#define _SDL_ATARIGL_H_ + +#ifdef HAVE_OPENGL +#include +#endif + +#include "SDL_sysvideo.h" +#define _THIS SDL_VideoDevice *this + +struct SDL_PrivateGLData { + /* to stop switching drivers while we have a valid context */ + int gl_active; + + /* for unsupported OSMesa buffer formats */ + void (*ConvertSurface)(SDL_Surface *surface); + +#ifdef HAVE_OPENGL + OSMesaContext ctx; +#endif +}; + +/* Old variable names */ +#define gl_active (this->gl_data->gl_active) +#define gl_ctx (this->gl_data->ctx) +#define gl_convert (this->gl_data->ConvertSurface) + +/* OpenGL functions */ +extern int SDL_AtariGL_Init(_THIS, SDL_Surface *current); +extern void SDL_AtariGL_Quit(_THIS); + +extern int SDL_AtariGL_LoadLibrary(_THIS, const char *path); +extern void *SDL_AtariGL_GetProcAddress(_THIS, const char *proc); +extern int SDL_AtariGL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); +extern int SDL_AtariGL_MakeCurrent(_THIS); +extern void SDL_AtariGL_SwapBuffers(_THIS); + +#endif /* _SDL_ATARIGL_H_ */ diff --git a/src/video/gem/SDL_gemvideo.c b/src/video/gem/SDL_gemvideo.c index 1569e165f..54bf3db8b 100644 --- a/src/video/gem/SDL_gemvideo.c +++ b/src/video/gem/SDL_gemvideo.c @@ -37,10 +37,6 @@ static char rcsid = #include #include -#ifdef HAVE_OPENGL -#include -#endif - /* Mint includes */ #include #include @@ -60,6 +56,8 @@ static char rcsid = #include "SDL_ataric2p_s.h" #include "SDL_atarieddi_s.h" #include "SDL_atarimxalloc_c.h" +#include "SDL_atarigl_c.h" + #include "SDL_gemvideo.h" #include "SDL_gemevents_c.h" #include "SDL_gemmouse_c.h" @@ -114,19 +112,7 @@ static void refresh_window(_THIS, int winhandle, short *rect); #ifdef HAVE_OPENGL /* OpenGL functions */ -static int GEM_GL_LoadLibrary(_THIS, const char *path); -static void *GEM_GL_GetProcAddress(_THIS, const char *proc); -static int GEM_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); -static int GEM_GL_MakeCurrent(_THIS); static void GEM_GL_SwapBuffers(_THIS); - -static void GEM_GL_ConvertNull(SDL_Surface *surface); -static void GEM_GL_Convert565To555be(SDL_Surface *surface); -static void GEM_GL_Convert565To555le(SDL_Surface *surface); -static void GEM_GL_Convert565le(SDL_Surface *surface); -static void GEM_GL_ConvertBGRAToABGR(SDL_Surface *surface); - -static void (*GEM_GL_Convert)(SDL_Surface *surface); #endif /* GEM driver bootstrap functions */ @@ -157,6 +143,8 @@ static SDL_VideoDevice *GEM_CreateDevice(int devindex) memset(device, 0, (sizeof *device)); device->hidden = (struct SDL_PrivateVideoData *) malloc((sizeof *device->hidden)); + device->gl_data = (struct SDL_PrivateGLData *) + malloc((sizeof *device->gl_data)); } if ( (device == NULL) || (device->hidden == NULL) ) { SDL_OutOfMemory(); @@ -166,6 +154,7 @@ static SDL_VideoDevice *GEM_CreateDevice(int devindex) return(0); } memset(device->hidden, 0, (sizeof *device->hidden)); + memset(device->gl_data, 0, sizeof(*device->gl_data)); /* Set the function pointers */ device->VideoInit = GEM_VideoInit; @@ -200,10 +189,10 @@ static SDL_VideoDevice *GEM_CreateDevice(int devindex) #ifdef HAVE_OPENGL /* OpenGL functions */ - device->GL_LoadLibrary = GEM_GL_LoadLibrary; - device->GL_GetProcAddress = GEM_GL_GetProcAddress; - device->GL_GetAttribute = GEM_GL_GetAttribute; - device->GL_MakeCurrent = GEM_GL_MakeCurrent; + device->GL_LoadLibrary = SDL_AtariGL_LoadLibrary; + device->GL_GetProcAddress = SDL_AtariGL_GetProcAddress; + device->GL_GetAttribute = SDL_AtariGL_GetAttribute; + device->GL_MakeCurrent = SDL_AtariGL_MakeCurrent; device->GL_SwapBuffers = GEM_GL_SwapBuffers; #endif @@ -483,10 +472,6 @@ int GEM_VideoInit(_THIS, SDL_PixelFormat *vformat) printf("sdl:video:gem: VideoInit(): done\n"); #endif -#ifdef HAVE_OPENGL - this->gl_config.driver_loaded = 1; -#endif - /* We're done! */ return(0); } @@ -507,11 +492,7 @@ SDL_Rect **GEM_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) static void GEM_FreeBuffers(_THIS) { #ifdef HAVE_OPENGL - /* Shutdown OpenGL context */ - if (GEM_ctx) { - OSMesaDestroyContext(GEM_ctx); - GEM_ctx = NULL; - } + SDL_AtariGL_Quit(this); #endif /* Release buffer */ @@ -760,59 +741,10 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current, #ifdef HAVE_OPENGL if (flags & SDL_OPENGL) { - GLenum format = OSMESA_COLOR_INDEX; /* 8 bits */ - - /* Init OpenGL context using OSMesa */ - GEM_GL_Convert = GEM_GL_ConvertNull; - switch (VDI_bpp) { - case 15: - /* 1555, big and little endian, unsupported */ - format = OSMESA_RGB_565; - if (VDI_redmask == 31<<10) { - GEM_GL_Convert = GEM_GL_Convert565To555be; - } else { - GEM_GL_Convert = GEM_GL_Convert565To555le; - } - break; - case 16: - if (VDI_redmask == 31<<11) { - format = OSMESA_RGB_565; - } else { - /* 565, little endian, unsupported */ - format = OSMESA_RGB_565; - GEM_GL_Convert = GEM_GL_Convert565le; - } - break; - case 24: - if (VDI_redmask == 255<<16) { - format = OSMESA_RGB; - } else { - format = OSMESA_BGR; - } - break; - case 32: - if (VDI_redmask == 255<<16) { - format = OSMESA_ARGB; - } else if (VDI_redmask == 255<<8) { - format = OSMESA_BGRA; - } else if (VDI_redmask == 255<<24) { - format = OSMESA_RGBA; - } else { - /* ABGR format unsupported */ - format = OSMESA_BGRA; - GEM_GL_Convert = GEM_GL_ConvertBGRAToABGR; - } - break; - } - - GEM_ctx = OSMesaCreateContextExt( format, this->gl_config.depth_size, - this->gl_config.stencil_size, this->gl_config.accum_red_size + - this->gl_config.accum_green_size + this->gl_config.accum_blue_size + - this->gl_config.accum_alpha_size, NULL ); - if (!GEM_ctx) { + if (!SDL_AtariGL_Init(this, current)) { GEM_FreeBuffers(this); - SDL_SetError("OSMesaCreateContext failed"); - return(NULL); + SDL_SetError("Can not create OpenGL context"); + return NULL; } modeflags |= SDL_OPENGL; @@ -1356,188 +1288,14 @@ static void refresh_window(_THIS, int winhandle, short *rect) #ifdef HAVE_OPENGL -static int GEM_GL_LoadLibrary(_THIS, const char *path) -{ - /* Library is always opened */ - this->gl_config.driver_loaded = 1; - - return 0; -} - -static void *GEM_GL_GetProcAddress(_THIS, const char *proc) -{ - void *func = NULL; - - if (GEM_ctx != NULL) { - func = OSMesaGetProcAddress(proc); - } - - return func; -} - -static int GEM_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) -{ - GLenum mesa_attrib; - - if (GEM_ctx == NULL) { - return -1; - } - - switch(attrib) { - case SDL_GL_RED_SIZE: - mesa_attrib = GL_RED_BITS; - break; - case SDL_GL_GREEN_SIZE: - mesa_attrib = GL_GREEN_BITS; - break; - case SDL_GL_BLUE_SIZE: - mesa_attrib = GL_BLUE_BITS; - break; - case SDL_GL_ALPHA_SIZE: - mesa_attrib = GL_ALPHA_BITS; - break; - case SDL_GL_DOUBLEBUFFER: - mesa_attrib = GL_DOUBLEBUFFER; - break; - case SDL_GL_DEPTH_SIZE: - mesa_attrib = GL_DEPTH_BITS; - break; - case SDL_GL_STENCIL_SIZE: - mesa_attrib = GL_STENCIL_BITS; - break; - case SDL_GL_ACCUM_RED_SIZE: - mesa_attrib = GL_ACCUM_RED_BITS; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - mesa_attrib = GL_ACCUM_GREEN_BITS; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - mesa_attrib = GL_ACCUM_BLUE_BITS; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - mesa_attrib = GL_ACCUM_ALPHA_BITS; - break; - default : - return -1; - } - - glGetIntegerv(mesa_attrib, value); - return 0; -} - -static int GEM_GL_MakeCurrent(_THIS) -{ - SDL_Surface *surface; - GLenum type; - - if (GEM_ctx == NULL) { - return -1; - } - - surface = this->screen; - - if ((surface->format->BitsPerPixel == 15) || (surface->format->BitsPerPixel == 16)) { - type = GL_UNSIGNED_SHORT_5_6_5; - } else { - type = GL_UNSIGNED_BYTE; - } - - if (!OSMesaMakeCurrent(GEM_ctx, surface->pixels, type, surface->w, surface->h)) { - SDL_SetError("Can not make OpenGL context current"); - return -1; - } - - /* OSMesa draws upside down */ - OSMesaPixelStore(OSMESA_Y_UP, 0); - - return 0; -} - static void GEM_GL_SwapBuffers(_THIS) { - GEM_GL_Convert(this->screen); - GEM_FlipHWSurface(this, this->screen); -} - -static void GEM_GL_ConvertNull(SDL_Surface *surface) -{ -} - -static void GEM_GL_Convert565To555be(SDL_Surface *surface) -{ - int x,y, pitch; - unsigned short *line, *pixel; - - line = surface->pixels; - pitch = surface->pitch >> 1; - for (y=0; yh; y++) { - pixel = line; - for (x=0; xw; x++) { - unsigned short color = *pixel; - - *pixel++ = (color & 0x1f)|((color>>1) & 0xffe0); - } - - line += pitch; - } -} - -static void GEM_GL_Convert565To555le(SDL_Surface *surface) -{ - int x,y, pitch; - unsigned short *line, *pixel; - - line = surface->pixels; - pitch = surface->pitch >>1; - for (y=0; yh; y++) { - pixel = line; - for (x=0; xw; x++) { - unsigned short color = *pixel; - - color = (color & 0x1f)|((color>>1) & 0xffe0); - *pixel++ = SDL_Swap16(color); - } - - line += pitch; - } -} - -static void GEM_GL_Convert565le(SDL_Surface *surface) -{ - int x,y, pitch; - unsigned short *line, *pixel; - - line = surface->pixels; - pitch = surface->pitch >>1; - for (y=0; yh; y++) { - pixel = line; - for (x=0; xw; x++) { - unsigned short color = *pixel; - - *pixel++ = SDL_Swap16(color); - } - - line += pitch; + if (gl_ctx == NULL) { + return; } -} - -static void GEM_GL_ConvertBGRAToABGR(SDL_Surface *surface) -{ - int x,y, pitch; - unsigned long *line, *pixel; - - line = surface->pixels; - pitch = surface->pitch >>2; - for (y=0; yh; y++) { - pixel = line; - for (x=0; xw; x++) { - unsigned long color = *pixel; - - *pixel++ = (color<<24)|(color>>8); - } - line += pitch; - } + gl_convert(this->screen); + GEM_FlipHWSurface(this, this->screen); } #endif diff --git a/src/video/gem/SDL_gemvideo.h b/src/video/gem/SDL_gemvideo.h index cf7cd5532..33ecf7347 100644 --- a/src/video/gem/SDL_gemvideo.h +++ b/src/video/gem/SDL_gemvideo.h @@ -28,10 +28,6 @@ static char rcsid = #ifndef _SDL_gemvideo_h #define _SDL_gemvideo_h -#ifdef HAVE_OPENGL -#include -#endif - #include "SDL_sysvideo.h" #include "SDL_mutex.h" @@ -89,10 +85,6 @@ struct SDL_PrivateVideoData { SDL_bool fullscreen; /* Fullscreen or windowed mode ? */ SDL_Rect *SDL_modelist[SDL_NUMMODES+1]; /* Mode list */ SDL_Surface *icon; /* The icon */ - -#ifdef HAVE_OPENGL - OSMesaContext ctx; /* OSMesa OpenGL context */ -#endif }; /* Hidden structure -> variables names */ @@ -139,8 +131,6 @@ struct SDL_PrivateVideoData { #define GEM_buffer2 (this->hidden->buffer2) #define GEM_bufops (this->hidden->buf2scr_ops) -#define GEM_ctx (this->hidden->ctx) - #define VDI_FBMASK(amask, rmask, gmask, bmask) \ VDI_alphamask = (amask); \ VDI_redmask = (rmask); \ diff --git a/src/video/xbios/SDL_xbios.c b/src/video/xbios/SDL_xbios.c index fb064dd0f..705e262fe 100644 --- a/src/video/xbios/SDL_xbios.c +++ b/src/video/xbios/SDL_xbios.c @@ -37,10 +37,6 @@ static char rcsid = #include #include -#ifdef HAVE_OPENGL -#include -#endif - /* Mint includes */ #include #include @@ -57,6 +53,7 @@ static char rcsid = #include "SDL_ataric2p_s.h" #include "SDL_atarievents_c.h" #include "SDL_atarimxalloc_c.h" +#include "SDL_atarigl_c.h" #include "SDL_xbios.h" #define XBIOS_VID_DRIVER_NAME "xbios" @@ -80,10 +77,6 @@ static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects); #ifdef HAVE_OPENGL /* OpenGL functions */ -static int XBIOS_GL_LoadLibrary(_THIS, const char *path); -static void *XBIOS_GL_GetProcAddress(_THIS, const char *proc); -static int XBIOS_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); -static int XBIOS_GL_MakeCurrent(_THIS); static void XBIOS_GL_SwapBuffers(_THIS); #endif @@ -196,6 +189,8 @@ static SDL_VideoDevice *XBIOS_CreateDevice(int devindex) memset(device, 0, (sizeof *device)); device->hidden = (struct SDL_PrivateVideoData *) malloc((sizeof *device->hidden)); + device->gl_data = (struct SDL_PrivateGLData *) + malloc((sizeof *device->gl_data)); } if ( (device == NULL) || (device->hidden == NULL) ) { SDL_OutOfMemory(); @@ -205,6 +200,7 @@ static SDL_VideoDevice *XBIOS_CreateDevice(int devindex) return(0); } memset(device->hidden, 0, (sizeof *device->hidden)); + memset(device->gl_data, 0, sizeof(*device->gl_data)); /* Video functions */ device->VideoInit = XBIOS_VideoInit; @@ -221,10 +217,10 @@ static SDL_VideoDevice *XBIOS_CreateDevice(int devindex) #ifdef HAVE_OPENGL /* OpenGL functions */ - device->GL_LoadLibrary = XBIOS_GL_LoadLibrary; - device->GL_GetProcAddress = XBIOS_GL_GetProcAddress; - device->GL_GetAttribute = XBIOS_GL_GetAttribute; - device->GL_MakeCurrent = XBIOS_GL_MakeCurrent; + device->GL_LoadLibrary = SDL_AtariGL_LoadLibrary; + device->GL_GetProcAddress = SDL_AtariGL_GetProcAddress; + device->GL_GetAttribute = SDL_AtariGL_GetAttribute; + device->GL_MakeCurrent = SDL_AtariGL_MakeCurrent; device->GL_SwapBuffers = XBIOS_GL_SwapBuffers; #endif @@ -415,10 +411,6 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat) /* Init chunky to planar routine */ SDL_Atari_C2pConvert = SDL_Atari_C2pConvert8; -#ifdef HAVE_OPENGL - this->gl_config.driver_loaded = 1; -#endif - /* We're done! */ return(0); } @@ -439,11 +431,7 @@ static void XBIOS_FreeBuffers(_THIS) int i; #ifdef HAVE_OPENGL - /* Shutdown OpenGL context */ - if (XBIOS_ctx) { - OSMesaDestroyContext(XBIOS_ctx); - XBIOS_ctx = NULL; - } + SDL_AtariGL_Quit(this); #endif for (i=0;i<2;i++) { @@ -583,23 +571,10 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current, #ifdef HAVE_OPENGL if (flags & SDL_OPENGL) { - GLenum format; - - /* Init OpenGL context using OSMesa */ - if (new_depth == 8) { - format = OSMESA_COLOR_INDEX; - } else { - format = OSMESA_RGB_565; - } - - XBIOS_ctx = OSMesaCreateContextExt( format, this->gl_config.depth_size, - this->gl_config.stencil_size, this->gl_config.accum_red_size + - this->gl_config.accum_green_size + this->gl_config.accum_blue_size + - this->gl_config.accum_alpha_size, NULL ); - if (!XBIOS_ctx) { + if (!SDL_AtariGL_Init(this, current)) { XBIOS_FreeBuffers(this); - SDL_SetError("OSMesaCreateContext failed"); - return(NULL); + SDL_SetError("Can not create OpenGL context"); + return NULL; } modeflags |= SDL_OPENGL; @@ -899,113 +874,14 @@ static void XBIOS_VideoQuit(_THIS) #ifdef HAVE_OPENGL -/* OpenGL functions */ -static int XBIOS_GL_LoadLibrary(_THIS, const char *path) -{ - /* Library is always opened */ - this->gl_config.driver_loaded = 1; - - return 0; -} - -static void *XBIOS_GL_GetProcAddress(_THIS, const char *proc) -{ - void *func = NULL; - - if (XBIOS_ctx != NULL) { - func = OSMesaGetProcAddress(proc); - } - - return func; -} - -static int XBIOS_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) -{ - GLenum mesa_attrib; - SDL_Surface *surface; - - if (XBIOS_ctx == NULL) { - return -1; - } - - switch(attrib) { - case SDL_GL_RED_SIZE: - mesa_attrib = GL_RED_BITS; - break; - case SDL_GL_GREEN_SIZE: - mesa_attrib = GL_GREEN_BITS; - break; - case SDL_GL_BLUE_SIZE: - mesa_attrib = GL_BLUE_BITS; - break; - case SDL_GL_ALPHA_SIZE: - mesa_attrib = GL_ALPHA_BITS; - break; - case SDL_GL_DOUBLEBUFFER: - surface = this->screen; - *value = ((surface->flags & SDL_DOUBLEBUF)==SDL_DOUBLEBUF); - return 0; - case SDL_GL_DEPTH_SIZE: - mesa_attrib = GL_DEPTH_BITS; - break; - case SDL_GL_STENCIL_SIZE: - mesa_attrib = GL_STENCIL_BITS; - break; - case SDL_GL_ACCUM_RED_SIZE: - mesa_attrib = GL_ACCUM_RED_BITS; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - mesa_attrib = GL_ACCUM_GREEN_BITS; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - mesa_attrib = GL_ACCUM_BLUE_BITS; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - mesa_attrib = GL_ACCUM_ALPHA_BITS; - break; - default : - return -1; - } - - glGetIntegerv(mesa_attrib, value); - return 0; -} - -static int XBIOS_GL_MakeCurrent(_THIS) -{ - SDL_Surface *surface; - GLenum type; - - if (XBIOS_ctx == NULL) { - return -1; - } - - surface = this->screen; - if ((surface->format->BitsPerPixel) == 8) { - type = GL_UNSIGNED_BYTE; - } else { - type = GL_UNSIGNED_SHORT_5_6_5; - } - - if (!OSMesaMakeCurrent(XBIOS_ctx, surface->pixels, type, surface->w, surface->h)) { - SDL_SetError("Can not make OpenGL context current"); - return -1; - } - - /* OSMesa draws upside down */ - OSMesaPixelStore(OSMESA_Y_UP, 0); - - return 0; -} - static void XBIOS_GL_SwapBuffers(_THIS) { - if (XBIOS_ctx == NULL) { + if (gl_ctx == NULL) { return; } XBIOS_FlipHWSurface(this, this->screen); - XBIOS_GL_MakeCurrent(this); + SDL_AtariGL_MakeCurrent(this); } #endif diff --git a/src/video/xbios/SDL_xbios.h b/src/video/xbios/SDL_xbios.h index 395c45e10..5120d8af9 100644 --- a/src/video/xbios/SDL_xbios.h +++ b/src/video/xbios/SDL_xbios.h @@ -28,10 +28,6 @@ static char rcsid = #ifndef _SDL_xbios_h #define _SDL_xbios_h -#ifdef HAVE_OPENGL -#include -#endif - #include "SDL_types.h" #include "SDL_sysvideo.h" @@ -73,9 +69,6 @@ struct SDL_PrivateVideoData { int frame_number; /* Number of frame for double buffer */ int pitch; /* Destination line width for C2P */ int width, height; /* Screen size for centered C2P */ -#ifdef HAVE_OPENGL - OSMesaContext ctx; /* OpenGL OSMesa context */ -#endif SDL_Rect *SDL_modelist[NUM_MODELISTS][SDL_NUMMODES+1]; xbiosmode_t *videomodes[NUM_MODELISTS][SDL_NUMMODES+1]; @@ -130,8 +123,5 @@ enum { #define XBIOS_pitch (this->hidden->pitch) #define XBIOS_width (this->hidden->width) #define XBIOS_height (this->hidden->height) -#ifdef HAVE_OPENGL -#define XBIOS_ctx (this->hidden->ctx) -#endif #endif /* _SDL_xbios_h */