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