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#include <dlfcn.h> 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL.h" 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ph_gl.h" 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION >= 630) 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* PhotonGL functions */ 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner GLPH_DECLARE_FUNCS; 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION < 630) 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ph_GL_SwapBuffers(_THIS) 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PgSetRegion(PtWidgetRid(window)); 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PdOpenGLContextSwapBuffers(oglctx); 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ph_GL_SwapBuffers(_THIS) 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_swap_buffers(oglbuffers); 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (attrib) 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_DOUBLEBUFFER: 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.double_buffer; 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_STENCIL_SIZE: 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.stencil_size; 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_DEPTH_SIZE: 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.depth_size; 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION >= 630) 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_RED_SIZE: 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.red_size; 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_GREEN_SIZE: 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.green_size; 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_BLUE_SIZE: 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.blue_size; 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ALPHA_SIZE: 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.alpha_size; 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_RED_SIZE: 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.accum_red_size; 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_GREEN_SIZE: 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.accum_green_size; 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_BLUE_SIZE: 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.accum_blue_size; 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_ACCUM_ALPHA_SIZE: 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.accum_alpha_size; 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDL_GL_STEREO: 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=this->gl_config.stereo; 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *value=0; 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION < 630) 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_GL_LoadLibrary(_THIS, const char* path) 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* if code compiled with SDL_VIDEO_OPENGL, that mean that library already linked */ 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded = 1; 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_GL_LoadLibrary(_THIS, const char* path) 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner void* handle; 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dlopen_flags=RTLD_WORLD | RTLD_GROUP; 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.dll_handle!=NULL) 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner handle = dlopen(path, dlopen_flags); 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (handle==NULL) 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_GL_LoadLibrary(): Could not load OpenGL library"); 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.dll_handle = handle; 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded = 1; 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_strlcpy(this->gl_config.driver_path, path, SDL_arraysize(this->gl_config.driver_path)); 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION < 630) 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid* ph_GL_GetProcAddress(_THIS, const char* proc) 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid* ph_GL_GetProcAddress(_THIS, const char* proc) 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner void* function; 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.dll_handle==NULL) 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ph_GL_LoadLibrary(this, DEFAULT_OPENGL); 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.dll_handle==NULL) 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner function=qnxgl_get_func(proc, oglctx, 0); 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (function==NULL) 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner function=dlsym(this->gl_config.dll_handle, proc); 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return function; 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION < 630) 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_GL_MakeCurrent(_THIS) 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PgSetRegion(PtWidgetRid(window)); 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglctx!=NULL) 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDCSetCurrent(oglctx); 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_GL_MakeCurrent(_THIS) 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PgSetRegion(PtWidgetRid(window)); 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglctx!=NULL) 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (qnxgl_set_current(oglctx) == -1) 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* 6.3.0 */ 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_NTO_VERSION < 630) 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This code is actual for the Photon3D Runtime which was available prior to 6.3 only */ 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags) 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDim_t dim; 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS]; 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int exposepost=0; 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int OGLargc; 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dim.w=width; 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dim.h=height; 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((oglctx!=NULL) && (oglflags==flags) && (oglbpp==bpp)) 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PdOpenGLContextResize(oglctx, &dim); 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDCSetCurrent(oglctx); 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglctx!=NULL) 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDCSetCurrent(NULL); 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDCRelease(oglctx); 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglctx=NULL; 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner exposepost=1; 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLargc=0; 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.depth_size) 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS; 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=this->gl_config.depth_size; 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.stencil_size) 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS; 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=this->gl_config.stencil_size; 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW; 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_FULLSCREEN) 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN; 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST; 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER; 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE; 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.double_buffer) 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib); 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib); 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglctx==NULL) 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): cannot create OpenGL context !\n"); 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhDCSetCurrent(oglctx); 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PtFlush(); 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglflags=flags; 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglbpp=bpp; 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (exposepost!=0) 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* OpenGL context has been recreated, so report about this fact */ 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateExpose(); 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else /* _NTO_VERSION */ 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This code is actual for the built-in PhGL support, which became available since 6.3 */ 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags) 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_buf_attrib_t qnxgl_attribs[PH_OGL_MAX_ATTRIBS]; 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_buf_attrib_t* qnxgl_attribs_slide; 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int num_interfaces = 0; 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int num_buffers = 0; 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialize the OpenGL subsystem */ 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner num_interfaces = qnxgl_init(NULL, NULL, 0); 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (num_interfaces < 0) 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): cannot initialize OpenGL subsystem !\n"); 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (num_interfaces == 0) 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): there are no available OpenGL renderers was found !\n"); 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Driver is linked */ 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.driver_loaded=1; 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialize the OpenGL context attributes */ 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide=qnxgl_attribs; 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Depth size */ 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.depth_size) 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(stderr, "setted depth size %d\n", this->gl_config.depth_size); 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_depth(qnxgl_attribs_slide, this->gl_config.depth_size); 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Stencil size */ 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.stencil_size) 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_stencil(qnxgl_attribs_slide, this->gl_config.stencil_size); 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* The sum of the accum bits of each channel */ 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((this->gl_config.accum_red_size != 0) && (this->gl_config.accum_blue_size != 0) && 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (this->gl_config.accum_green_size != 0)) 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_accum(qnxgl_attribs_slide, 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.accum_red_size + this->gl_config.accum_blue_size + 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.accum_green_size + this->gl_config.accum_alpha_size); 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Stereo mode */ 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.stereo) 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_stereo(qnxgl_attribs_slide); 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Fullscreen mode */ 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_hint_fullscreen(qnxgl_attribs_slide); 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Double buffering mode */ 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->gl_config.double_buffer) 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner num_buffers=2; 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner num_buffers=1; 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Loading the function pointers so we can use the extensions */ 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner GLPH_LOAD_FUNCS_GC(oglctx); 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set the buffers region to be that of our window's region */ 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = glph_attrib_set_region(qnxgl_attribs_slide, PtWidgetRid(window)); 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* End of the attributes array */ 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_attribs_slide = qnxgl_attrib_set_end(qnxgl_attribs_slide); 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Create the buffers with the specified color model */ 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(stderr, "ARGB: %d, %d, %d, %d\n", this->gl_config.alpha_size, this->gl_config.red_size, this->gl_config.green_size, this->gl_config.blue_size); 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglbuffers = qnxgl_buffers_create( 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner QNXGL_FORMAT_BEST_RGB, 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* __QNXGL_BUILD_FORMAT(0, __QNXGL_COLOR_MODEL_RGB, this->gl_config.alpha_size, 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->gl_config.red_size, this->gl_config.green_size, this->gl_config.blue_size), */ 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner num_buffers, width, height, qnxgl_attribs, -1); 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglbuffers == NULL) 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): failed to create OpenGL buffers !\n"); 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_finish(); 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Create a QNXGL context for the previously created buffer */ 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglctx = qnxgl_context_create(oglbuffers, NULL); 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (oglctx == NULL) 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): failed to create OpenGL context !\n"); 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_buffers_destroy(oglbuffers); 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_finish(); 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Attempt to make the context current so we can use OpenGL commands */ 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (qnxgl_set_current(oglctx) == -1) 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_SetupOpenGLContext(): failed to make the OpenGL context current !\n"); 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_context_destroy(oglctx); 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_buffers_destroy(oglbuffers); 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner qnxgl_finish(); 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PtFlush(); 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglflags=flags; 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner oglbpp=bpp; 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* _NTO_VERSION */ 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_VIDEO_OPENGL */ 407