146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* StormMesa implementation of SDL OpenGL support */ 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_cgxgl_c.h" 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_cgxvideo.h" 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 3046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerAmigaMesaContext glcont=NULL; 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Init OpenGL */ 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_Init(_THIS) 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i = 0; 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */ 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner struct Window *win = (struct Window *)SDL_Window; 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // default config. Always used... 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_Window; attributes[i++].ti_Data = (unsigned long)win; 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_Left; attributes[i++].ti_Data = 0; 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_Bottom; attributes[i++].ti_Data = 0; 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_Width; attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight; 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_Height; attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop; 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE; 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // double buffer ? 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_DoubleBuf; 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( this->gl_config.double_buffer ) { 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_TRUE; 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else { 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_FALSE; 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // RGB(A) Mode ? 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_RGBMode; 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( this->gl_config.red_size != 0 && 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.blue_size != 0 && 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.green_size != 0 ) { 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_TRUE; 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else { 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_FALSE; 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // no depth buffer ? 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( this->gl_config.depth_size == 0 ) { 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_NoDepth; 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_TRUE; 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // no stencil buffer ? 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( this->gl_config.stencil_size == 0 ) { 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_NoStencil; 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_TRUE; 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // no accum buffer ? 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( this->gl_config.accum_red_size != 0 && 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.accum_blue_size != 0 && 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.accum_green_size != 0 ) { 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = AMA_NoAccum; 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i++].ti_Data = GL_TRUE; 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // done... 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner attributes[i].ti_Tag = TAG_DONE; 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner glcont = AmigaMesaCreateContext(attributes); 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( glcont == NULL ) { 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Couldn't create OpenGL context"); 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_data->gl_active = 1; 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded = 1; 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("OpenGL support not configured"); 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Quit OpenGL */ 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid CGX_GL_Quit(_THIS) 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( glcont != NULL ) { 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner AmigaMesaDestroyContext(glcont); 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner glcont = NULL; 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_data->gl_active = 0; 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded = 0; 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Attach context to another window */ 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_Update(_THIS) 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner struct TagItem tags[2]; 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner struct Window *win = (struct Window*)SDL_Window; 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(glcont == NULL) { 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; //should never happen 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tags[0].ti_Tag = AMA_Window; 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tags[0].ti_Data = (unsigned long)win; 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tags[1].ti_Tag = TAG_DONE; 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner AmigaMesaSetRast(glcont, tags); 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("OpenGL support not configured"); 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Make the current context active */ 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_MakeCurrent(_THIS) 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if(glcont == NULL) 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner AmigaMesaMakeCurrent(glcont, glcont->buffer); 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid CGX_GL_SwapBuffers(_THIS) 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner AmigaMesaSwapBuffers(glcont); 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) { 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner GLenum mesa_attrib; 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(attrib) { 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_RED_SIZE: 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_RED_BITS; 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_GREEN_SIZE: 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_GREEN_BITS; 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_BLUE_SIZE: 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_BLUE_BITS; 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ALPHA_SIZE: 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_ALPHA_BITS; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_DOUBLEBUFFER: 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_DOUBLEBUFFER; 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_DEPTH_SIZE: 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_DEPTH_BITS; 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_STENCIL_SIZE: 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_STENCIL_BITS; 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_RED_SIZE: 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_ACCUM_RED_BITS; 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_GREEN_SIZE: 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_ACCUM_GREEN_BITS; 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_BLUE_SIZE: 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_ACCUM_BLUE_BITS; 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_ALPHA_SIZE: 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mesa_attrib = GL_ACCUM_ALPHA_BITS; 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default : 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner AmigaMesaGetConfig(glcont->visual, mesa_attrib, value); 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid *CGX_GL_GetProcAddress(_THIS, const char *proc) { 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner void *func = NULL; 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner func = AmiGetGLProc(proc); 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return func; 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint CGX_GL_LoadLibrary(_THIS, const char *path) { 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Library is always open */ 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded = 1; 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_VIDEO_OPENGL */ 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 213