Mercurial > sdl-ios-xcode
diff src/video/cybergfx/SDL_cgxgl.c @ 255:dcb5e869f8b5
Updated Amiga port by Gabriele Greco
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 16 Dec 2001 20:00:27 +0000 |
parents | e8157fcb3114 |
children | f6ffac90895c |
line wrap: on
line diff
--- a/src/video/cybergfx/SDL_cgxgl.c Fri Dec 14 13:13:20 2001 +0000 +++ b/src/video/cybergfx/SDL_cgxgl.c Sun Dec 16 20:00:27 2001 +0000 @@ -25,189 +25,117 @@ "@(#) $Id$"; #endif -// #include <stdlib.h> /* For getenv() prototype */ -// #include <string.h> +/* StormMesa implementation of SDL OpenGL support */ -#include "SDL_events_c.h" #include "SDL_error.h" +#include "SDL_cgxgl_c.h" #include "SDL_cgxvideo.h" -#include "SDL_cgxgl_c.h" -#define DEFAULT_OPENGL "libGL.so.1" +#ifdef HAVE_OPENGL +AmigaMesaContext glcont=NULL; +#endif -/* return the preferred visual to use for openGL graphics */ -void *CGX_GL_GetVisual(_THIS) +/* Init OpenGL */ +int CGX_GL_Init(_THIS) { #ifdef HAVE_OPENGL - /* 64 seems nice. */ - int attribs[64]; - int i; + int i = 0; + struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */ + struct Window *win = (struct Window *)SDL_Window; - /* load the gl driver from a default path */ - if ( ! this->gl_config.driver_loaded ) { - /* no driver has been loaded, use default (ourselves) */ - if ( X11_GL_LoadLibrary(this, NULL) < 0 ) { - return NULL; - } - } - - /* See if we already have a window which we must use */ - if ( SDL_windowid ) { - XWindowAttributes a; - XVisualInfo vi_in; - int out_count; + // default config. Always used... + attributes[i].ti_Tag = AMA_Window; attributes[i++].ti_Data = (unsigned long)win; + attributes[i].ti_Tag = AMA_Left; attributes[i++].ti_Data = 0; + attributes[i].ti_Tag = AMA_Bottom; attributes[i++].ti_Data = 0; + attributes[i].ti_Tag = AMA_Width; attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight; + attributes[i].ti_Tag = AMA_Height; attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop; + attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE; - XGetWindowAttributes(SDL_Display, SDL_Window, &a); - vi_in.screen = SDL_Screen; - vi_in.visualid = XVisualIDFromVisual(a.visual); - glx_visualinfo = XGetVisualInfo(SDL_Display, - VisualScreenMask|VisualIDMask, &vi_in, &out_count); - return glx_visualinfo; + // double buffer ? + attributes[i].ti_Tag = AMA_DoubleBuf; + if ( this->gl_config.double_buffer ) { + attributes[i++].ti_Data = GL_TRUE; + } + else { + attributes[i++].ti_Data = GL_FALSE; } - - /* Setup our GLX attributes according to the gl_config. */ - i = 0; - attribs[i++] = GLX_RGBA; - attribs[i++] = GLX_RED_SIZE; - attribs[i++] = this->gl_config.red_size; - attribs[i++] = GLX_GREEN_SIZE; - attribs[i++] = this->gl_config.green_size; - attribs[i++] = GLX_BLUE_SIZE; - attribs[i++] = this->gl_config.blue_size; - - if( this->gl_config.alpha_size ) { - attribs[i++] = GLX_ALPHA_SIZE; - attribs[i++] = this->gl_config.alpha_size; + // RGB(A) Mode ? + attributes[i].ti_Tag = AMA_RGBMode; + if ( this->gl_config.red_size != 0 && + this->gl_config.blue_size != 0 && + this->gl_config.green_size != 0 ) { + attributes[i++].ti_Data = GL_TRUE; } - - if( this->gl_config.buffer_size ) { - attribs[i++] = GLX_BUFFER_SIZE; - attribs[i++] = this->gl_config.buffer_size; + else { + attributes[i++].ti_Data = GL_FALSE; } - - if( this->gl_config.double_buffer ) { - attribs[i++] = GLX_DOUBLEBUFFER; + // no depth buffer ? + if ( this->gl_config.depth_size == 0 ) { + attributes[i].ti_Tag = AMA_NoDepth; + attributes[i++].ti_Data = GL_TRUE; + } + // no stencil buffer ? + if ( this->gl_config.stencil_size == 0 ) { + attributes[i].ti_Tag = AMA_NoStencil; + attributes[i++].ti_Data = GL_TRUE; } - - attribs[i++] = GLX_DEPTH_SIZE; - attribs[i++] = this->gl_config.depth_size; - - if( this->gl_config.stencil_size ) { - attribs[i++] = GLX_STENCIL_SIZE; - attribs[i++] = this->gl_config.stencil_size; + // no accum buffer ? + if ( this->gl_config.accum_red_size != 0 && + this->gl_config.accum_blue_size != 0 && + this->gl_config.accum_green_size != 0 ) { + attributes[i].ti_Tag = AMA_NoAccum; + attributes[i++].ti_Data = GL_TRUE; } - - if( this->gl_config.accum_red_size ) { - attribs[i++] = GLX_ACCUM_RED_SIZE; - attribs[i++] = this->gl_config.accum_red_size; - } - - if( this->gl_config.accum_green_size ) { - attribs[i++] = GLX_ACCUM_GREEN_SIZE; - attribs[i++] = this->gl_config.accum_green_size; - } + // done... + attributes[i].ti_Tag = TAG_DONE; - if( this->gl_config.accum_blue_size ) { - attribs[i++] = GLX_ACCUM_BLUE_SIZE; - attribs[i++] = this->gl_config.accum_blue_size; + glcont = AmigaMesaCreateContext(attributes); + if ( glcont == NULL ) { + SDL_SetError("Couldn't create OpenGL context"); + return(-1); } - - if( this->gl_config.accum_alpha_size ) { - attribs[i++] = GLX_ACCUM_ALPHA_SIZE; - attribs[i++] = this->gl_config.accum_alpha_size; - } + this->gl_data->gl_active = 1; + this->gl_config.driver_loaded = 1; - attribs[i++] = None; - - glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, - SDL_Screen, attribs); - if( !glx_visualinfo ) { - SDL_SetError( "Couldn't find matching GLX visual"); - return NULL; - } - return glx_visualinfo; + return(0); #else - SDL_SetError("CGX driver is not yet supporting OpenGL"); - return NULL; + SDL_SetError("OpenGL support not configured"); + return(-1); #endif } -int CGX_GL_CreateWindow(_THIS, int w, int h) +/* Quit OpenGL */ +void CGX_GL_Quit(_THIS) { - int retval; #ifdef HAVE_OPENGL - XSetWindowAttributes attributes; - unsigned long mask; - unsigned long black; - - black = (glx_visualinfo->visual == DefaultVisual(SDL_Display, - SDL_Screen)) - ? BlackPixel(SDL_Display, SDL_Screen) : 0; - attributes.background_pixel = black; - attributes.border_pixel = black; - attributes.colormap = SDL_XColorMap; - mask = CWBackPixel | CWBorderPixel | CWColormap; - - SDL_Window = XCreateWindow(SDL_Display, WMwindow, - 0, 0, w, h, 0, glx_visualinfo->depth, - InputOutput, glx_visualinfo->visual, - mask, &attributes); - if ( !SDL_Window ) { - SDL_SetError("Could not create window"); - return -1; + if ( glcont != NULL ) { + AmigaMesaDestroyContext(glcont); + glcont = NULL; + this->gl_data->gl_active = 0; + this->gl_config.driver_loaded = 0; } - retval = 0; -#else - SDL_SetError("CGX driver is not yet supporting OpenGL"); - retval = -1; #endif - return(retval); } -int CGX_GL_CreateContext(_THIS) -{ - int retval; -#ifdef HAVE_OPENGL - /* We do this to create a clean separation between X and GLX errors. */ - XSync( SDL_Display, False ); - glx_context = this->gl_data->glXCreateContext(GFX_Display, - glx_visualinfo, NULL, True); - XSync( GFX_Display, False ); - - if (glx_context == NULL) { - SDL_SetError("Could not create GL context"); - return -1; - } - - gl_active = 1; -#else - SDL_SetError("CGX driver is not yet supporting OpenGL"); -#endif - if ( gl_active ) { - retval = 0; - } else { - retval = -1; - } - return(retval); -} - -void CGX_GL_Shutdown(_THIS) +/* Attach context to another window */ +int CGX_GL_Update(_THIS) { #ifdef HAVE_OPENGL - /* Clean up OpenGL */ - if( glx_context ) { - this->gl_data->glXMakeCurrent(GFX_Display, None, NULL); - - if (glx_context != NULL) - this->gl_data->glXDestroyContext(GFX_Display, glx_context); + struct TagItem tags[2]; + struct Window *win = (struct Window*)SDL_Window; + if(glcont == NULL) { + return -1; //should never happen + } + tags[0].ti_Tag = AMA_Window; + tags[0].ti_Data = (unsigned long)win; + tags[1].ti_Tag = TAG_DONE; + AmigaMesaSetRast(glcont, tags); - if( this->gl_data->glXReleaseBuffersMESA ) { - this->gl_data->glXReleaseBuffersMESA(GFX_Display,SDL_Window); - } - glx_context = NULL; - } - gl_active = 0; -#endif /* HAVE_OPENGL */ + return 0; +#else + SDL_SetError("OpenGL support not configured"); + return -1; +#endif } #ifdef HAVE_OPENGL @@ -215,175 +143,75 @@ /* Make the current context active */ int CGX_GL_MakeCurrent(_THIS) { - int retval; - - retval = 0; - if ( ! this->gl_data->glXMakeCurrent(GFX_Display, - SDL_Window, glx_context) ) { - SDL_SetError("Unable to make GL context current"); - retval = -1; - } - XSync( GFX_Display, False ); - - /* More Voodoo X server workarounds... Grr... */ - SDL_Lock_EventThread(); - X11_CheckDGAMouse(this); - SDL_Unlock_EventThread(); - - return(retval); -} - -/* Get attribute data from glX. */ -int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) -{ - int retval; - int glx_attrib = None; + if(glcont == NULL) + return -1; - switch( attrib ) { - case SDL_GL_RED_SIZE: - glx_attrib = GLX_RED_SIZE; - break; - case SDL_GL_GREEN_SIZE: - glx_attrib = GLX_GREEN_SIZE; - break; - case SDL_GL_BLUE_SIZE: - glx_attrib = GLX_BLUE_SIZE; - break; - case SDL_GL_ALPHA_SIZE: - glx_attrib = GLX_ALPHA_SIZE; - break; - case SDL_GL_DOUBLEBUFFER: - glx_attrib = GLX_DOUBLEBUFFER; - break; - case SDL_GL_BUFFER_SIZE: - glx_attrib = GLX_BUFFER_SIZE; - break; - case SDL_GL_DEPTH_SIZE: - glx_attrib = GLX_DEPTH_SIZE; - break; - case SDL_GL_STENCIL_SIZE: - glx_attrib = GLX_STENCIL_SIZE; - break; - case SDL_GL_ACCUM_RED_SIZE: - glx_attrib = GLX_ACCUM_RED_SIZE; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - glx_attrib = GLX_ACCUM_GREEN_SIZE; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - glx_attrib = GLX_ACCUM_BLUE_SIZE; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - glx_attrib = GLX_ACCUM_ALPHA_SIZE; - break; - default: - return(-1); - } - - retval = this->gl_data->glXGetConfig(GFX_Display, glx_visualinfo, glx_attrib, value); - - return retval; + AmigaMesaMakeCurrent(glcont, glcont->buffer); + return 0; } void CGX_GL_SwapBuffers(_THIS) { - this->gl_data->glXSwapBuffers(GFX_Display, SDL_Window); + AmigaMesaSwapBuffers(glcont); +} + +int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) { + GLenum mesa_attrib; + + 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; + } + + AmigaMesaGetConfig(glcont->visual, mesa_attrib, value); + return 0; +} + +void *CGX_GL_GetProcAddress(_THIS, const char *proc) { + void *func = NULL; + func = AmiGetGLProc(proc); + return func; +} + +int CGX_GL_LoadLibrary(_THIS, const char *path) { + /* Library is always open */ + this->gl_config.driver_loaded = 1; + + return 0; } #endif /* HAVE_OPENGL */ -void CGX_GL_UnloadLibrary(_THIS) -{ -#ifdef HAVE_OPENGL - if ( this->gl_config.driver_loaded ) { - dlclose(this->gl_config.dll_handle); - - this->gl_data->glXChooseVisual = NULL; - this->gl_data->glXCreateContext = NULL; - this->gl_data->glXDestroyContext = NULL; - this->gl_data->glXMakeCurrent = NULL; - this->gl_data->glXSwapBuffers = NULL; - - this->gl_config.dll_handle = NULL; - this->gl_config.driver_loaded = 0; - } -#endif -} - -#ifdef HAVE_OPENGL - -/* Passing a NULL path means load pointers from the application */ -int CGX_GL_LoadLibrary(_THIS, const char* path) -{ - void* handle; - int dlopen_flags; - - if ( gl_active ) { - SDL_SetError("OpenGL context already created"); - return -1; - } - -#ifdef RTLD_GLOBAL - dlopen_flags = RTLD_LAZY | RTLD_GLOBAL; -#else - dlopen_flags = RTLD_LAZY; -#endif - handle = dlopen(path, dlopen_flags); - /* Catch the case where the application isn't linked with GL */ - if ( (dlsym(handle, "glXChooseVisual") == NULL) && (path == NULL) ) { - dlclose(handle); - path = getenv("SDL_VIDEO_GL_DRIVER"); - if ( path == NULL ) { - path = DEFAULT_OPENGL; - } - handle = dlopen(path, dlopen_flags); - } - if ( handle == NULL ) { - SDL_SetError("Could not load OpenGL library"); - return -1; - } - - /* Unload the old driver and reset the pointers */ - X11_GL_UnloadLibrary(this); - - /* Load new function pointers */ - this->gl_data->glXChooseVisual = dlsym(handle, "glXChooseVisual"); - this->gl_data->glXCreateContext = dlsym(handle, "glXCreateContext"); - this->gl_data->glXDestroyContext = dlsym(handle, "glXDestroyContext"); - this->gl_data->glXMakeCurrent = dlsym(handle, "glXMakeCurrent"); - this->gl_data->glXSwapBuffers = dlsym(handle, "glXSwapBuffers"); - this->gl_data->glXGetConfig = dlsym(handle, "glXGetConfig"); - /* We don't compare below for this in case we're not using Mesa. */ - this->gl_data->glXReleaseBuffersMESA = dlsym( handle, "glXReleaseBuffersMESA" ); - - if ( (this->gl_data->glXChooseVisual == NULL) || - (this->gl_data->glXCreateContext == NULL) || - (this->gl_data->glXDestroyContext == NULL) || - (this->gl_data->glXMakeCurrent == NULL) || - (this->gl_data->glXSwapBuffers == NULL) || - (this->gl_data->glXGetConfig == NULL) ) { - SDL_SetError("Could not retrieve OpenGL functions"); - return -1; - } - - this->gl_config.dll_handle = handle; - this->gl_config.driver_loaded = 1; - if ( path ) { - strncpy(this->gl_config.driver_path, path, - sizeof(this->gl_config.driver_path)-1); - } else { - strcpy(this->gl_config.driver_path, ""); - } - return 0; -} - -void *CGX_GL_GetProcAddress(_THIS, const char* proc) -{ - void* handle; - - handle = this->gl_config.dll_handle; - - return dlsym(handle, proc); -} - -#endif /* HAVE_OPENGL */