src/video/win32/SDL_win32opengl.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 28 Jul 2006 08:43:17 +0000
changeset 1952 420716272158
parent 1936 83946ee0ff1f
child 2150 abbe2c1dcf0a
permissions -rw-r--r--
Implemented X11 OpenGL support.
Added support for the SDL_VIDEO_OPENGL environment variable.
slouken@1913
     1
/*
slouken@1913
     2
    SDL - Simple DirectMedia Layer
slouken@1913
     3
    Copyright (C) 1997-2006 Sam Lantinga
slouken@1913
     4
slouken@1913
     5
    This library is free software; you can redistribute it and/or
slouken@1913
     6
    modify it under the terms of the GNU Lesser General Public
slouken@1913
     7
    License as published by the Free Software Foundation; either
slouken@1913
     8
    version 2.1 of the License, or (at your option) any later version.
slouken@1913
     9
slouken@1913
    10
    This library is distributed in the hope that it will be useful,
slouken@1913
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
slouken@1913
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
slouken@1913
    13
    Lesser General Public License for more details.
slouken@1913
    14
slouken@1913
    15
    You should have received a copy of the GNU Lesser General Public
slouken@1913
    16
    License along with this library; if not, write to the Free Software
slouken@1913
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
slouken@1913
    18
slouken@1913
    19
    Sam Lantinga
slouken@1913
    20
    slouken@libsdl.org
slouken@1913
    21
*/
slouken@1913
    22
#include "SDL_config.h"
slouken@1913
    23
slouken@1913
    24
#include "SDL_win32video.h"
slouken@1913
    25
slouken@1913
    26
/* WGL implementation of SDL OpenGL support */
slouken@1913
    27
slouken@1952
    28
#if SDL_VIDEO_OPENGL_WGL
slouken@1913
    29
#include "SDL_opengl.h"
slouken@1913
    30
slouken@1952
    31
#define DEFAULT_OPENGL "OPENGL32.DLL"
slouken@1913
    32
slouken@1913
    33
slouken@1913
    34
int
slouken@1913
    35
WIN_GL_LoadLibrary(_THIS, const char *path)
slouken@1913
    36
{
slouken@1913
    37
    LPTSTR wpath;
slouken@1913
    38
    HANDLE handle;
slouken@1913
    39
slouken@1913
    40
    if (_this->gl_config.driver_loaded) {
slouken@1913
    41
        if (path) {
slouken@1913
    42
            SDL_SetError("OpenGL library already loaded");
slouken@1913
    43
            return -1;
slouken@1913
    44
        } else {
slouken@1913
    45
            ++_this->gl_config.driver_loaded;
slouken@1913
    46
            return 0;
slouken@1913
    47
        }
slouken@1913
    48
    }
slouken@1913
    49
    if (path == NULL) {
slouken@1952
    50
        path = SDL_getenv("SDL_OPENGL_LIBRARY");
slouken@1952
    51
    }
slouken@1952
    52
    if (path == NULL) {
slouken@1952
    53
        path = DEFAULT_OPENGL;
slouken@1913
    54
    }
slouken@1913
    55
    wpath = WIN_UTF8ToString(path);
slouken@1913
    56
    handle = LoadLibrary(wpath);
slouken@1913
    57
    SDL_free(wpath);
slouken@1913
    58
    if (!handle) {
slouken@1913
    59
        char message[1024];
slouken@1913
    60
        SDL_snprintf(message, SDL_arraysize(message), "LoadLibrary(\"%s\")",
slouken@1913
    61
                     path);
slouken@1913
    62
        WIN_SetError(message);
slouken@1913
    63
        return -1;
slouken@1913
    64
    }
slouken@1913
    65
slouken@1913
    66
    /* Load function pointers */
slouken@1913
    67
    _this->gl_data->wglGetProcAddress = (void *(WINAPI *) (const char *))
slouken@1913
    68
        GetProcAddress(handle, "wglGetProcAddress");
slouken@1913
    69
    _this->gl_data->wglCreateContext = (HGLRC(WINAPI *) (HDC))
slouken@1913
    70
        GetProcAddress(handle, "wglCreateContext");
slouken@1913
    71
    _this->gl_data->wglDeleteContext = (BOOL(WINAPI *) (HGLRC))
slouken@1913
    72
        GetProcAddress(handle, "wglDeleteContext");
slouken@1913
    73
    _this->gl_data->wglMakeCurrent = (BOOL(WINAPI *) (HDC, HGLRC))
slouken@1913
    74
        GetProcAddress(handle, "wglMakeCurrent");
slouken@1913
    75
    _this->gl_data->wglSwapIntervalEXT = (void (WINAPI *) (int))
slouken@1913
    76
        GetProcAddress(handle, "wglSwapIntervalEXT");
slouken@1913
    77
    _this->gl_data->wglGetSwapIntervalEXT = (int (WINAPI *) (void))
slouken@1913
    78
        GetProcAddress(handle, "wglGetSwapIntervalEXT");
slouken@1913
    79
slouken@1913
    80
    if (!_this->gl_data->wglGetProcAddress ||
slouken@1913
    81
        !_this->gl_data->wglCreateContext ||
slouken@1913
    82
        !_this->gl_data->wglDeleteContext ||
slouken@1913
    83
        !_this->gl_data->wglMakeCurrent) {
slouken@1913
    84
        SDL_SetError("Could not retrieve OpenGL functions");
slouken@1913
    85
        FreeLibrary(handle);
slouken@1913
    86
        return -1;
slouken@1913
    87
    }
slouken@1913
    88
slouken@1913
    89
    _this->gl_config.dll_handle = handle;
slouken@1913
    90
    SDL_strlcpy(_this->gl_config.driver_path, path,
slouken@1913
    91
                SDL_arraysize(_this->gl_config.driver_path));
slouken@1913
    92
    _this->gl_config.driver_loaded = 1;
slouken@1913
    93
    return 0;
slouken@1913
    94
}
slouken@1913
    95
slouken@1913
    96
void *
slouken@1913
    97
WIN_GL_GetProcAddress(_THIS, const char *proc)
slouken@1913
    98
{
slouken@1913
    99
    void *func;
slouken@1913
   100
slouken@1913
   101
    /* This is to pick up extensions */
slouken@1913
   102
    func = _this->gl_data->wglGetProcAddress(proc);
slouken@1913
   103
    if (!func) {
slouken@1913
   104
        /* This is probably a normal GL function */
slouken@1913
   105
        func = GetProcAddress(_this->gl_config.dll_handle, proc);
slouken@1913
   106
    }
slouken@1913
   107
    return func;
slouken@1913
   108
}
slouken@1913
   109
slouken@1913
   110
static void
slouken@1913
   111
WIN_GL_UnloadLibrary(_THIS)
slouken@1913
   112
{
slouken@1913
   113
    if (_this->gl_config.driver_loaded > 0) {
slouken@1913
   114
        if (--_this->gl_config.driver_loaded > 0) {
slouken@1913
   115
            return;
slouken@1913
   116
        }
slouken@1913
   117
        FreeLibrary((HMODULE) _this->gl_config.dll_handle);
slouken@1913
   118
        _this->gl_config.dll_handle = NULL;
slouken@1913
   119
    }
slouken@1913
   120
}
slouken@1913
   121
slouken@1913
   122
static void
slouken@1913
   123
WIN_GL_SetupPixelFormat(_THIS, PIXELFORMATDESCRIPTOR * pfd)
slouken@1913
   124
{
slouken@1913
   125
    SDL_zerop(pfd);
slouken@1913
   126
    pfd->nSize = sizeof(*pfd);
slouken@1913
   127
    pfd->nVersion = 1;
slouken@1913
   128
    pfd->dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL);
slouken@1913
   129
    if (_this->gl_config.double_buffer) {
slouken@1913
   130
        pfd->dwFlags |= PFD_DOUBLEBUFFER;
slouken@1913
   131
    }
slouken@1913
   132
    if (_this->gl_config.stereo) {
slouken@1913
   133
        pfd->dwFlags |= PFD_STEREO;
slouken@1913
   134
    }
slouken@1913
   135
    pfd->iLayerType = PFD_MAIN_PLANE;
slouken@1913
   136
    pfd->iPixelType = PFD_TYPE_RGBA;
slouken@1913
   137
    pfd->cRedBits = _this->gl_config.red_size;
slouken@1913
   138
    pfd->cGreenBits = _this->gl_config.green_size;
slouken@1913
   139
    pfd->cBlueBits = _this->gl_config.blue_size;
slouken@1913
   140
    pfd->cAlphaBits = _this->gl_config.alpha_size;
slouken@1913
   141
    if (_this->gl_config.buffer_size) {
slouken@1913
   142
        pfd->cColorBits =
slouken@1913
   143
            _this->gl_config.buffer_size - _this->gl_config.alpha_size;
slouken@1913
   144
    } else {
slouken@1913
   145
        pfd->cColorBits = (pfd->cRedBits + pfd->cGreenBits + pfd->cBlueBits);
slouken@1913
   146
    }
slouken@1913
   147
    pfd->cAccumRedBits = _this->gl_config.accum_red_size;
slouken@1913
   148
    pfd->cAccumGreenBits = _this->gl_config.accum_green_size;
slouken@1913
   149
    pfd->cAccumBlueBits = _this->gl_config.accum_blue_size;
slouken@1913
   150
    pfd->cAccumAlphaBits = _this->gl_config.accum_alpha_size;
slouken@1913
   151
    pfd->cAccumBits =
slouken@1913
   152
        (pfd->cAccumRedBits + pfd->cAccumGreenBits + pfd->cAccumBlueBits +
slouken@1913
   153
         pfd->cAccumAlphaBits);
slouken@1913
   154
    pfd->cDepthBits = _this->gl_config.depth_size;
slouken@1913
   155
    pfd->cStencilBits = _this->gl_config.stencil_size;
slouken@1913
   156
}
slouken@1913
   157
slouken@1913
   158
static SDL_bool
slouken@1913
   159
HasExtension(const char *extension, const char *extensions)
slouken@1913
   160
{
slouken@1913
   161
    const char *start;
slouken@1913
   162
    const char *where, *terminator;
slouken@1913
   163
slouken@1913
   164
    /* Extension names should not have spaces. */
slouken@1913
   165
    where = SDL_strchr(extension, ' ');
slouken@1913
   166
    if (where || *extension == '\0')
slouken@1913
   167
        return SDL_FALSE;
slouken@1913
   168
slouken@1913
   169
    if (!extensions)
slouken@1913
   170
        return SDL_FALSE;
slouken@1913
   171
slouken@1913
   172
    /* It takes a bit of care to be fool-proof about parsing the
slouken@1913
   173
     * OpenGL extensions string. Don't be fooled by sub-strings,
slouken@1913
   174
     * etc. */
slouken@1913
   175
slouken@1913
   176
    start = extensions;
slouken@1913
   177
slouken@1913
   178
    for (;;) {
slouken@1913
   179
        where = SDL_strstr(start, extension);
slouken@1913
   180
        if (!where)
slouken@1913
   181
            break;
slouken@1913
   182
slouken@1913
   183
        terminator = where + SDL_strlen(extension);
slouken@1913
   184
        if (where == start || *(where - 1) == ' ')
slouken@1913
   185
            if (*terminator == ' ' || *terminator == '\0')
slouken@1913
   186
                return SDL_TRUE;
slouken@1913
   187
slouken@1913
   188
        start = terminator;
slouken@1913
   189
    }
slouken@1913
   190
    return SDL_FALSE;
slouken@1913
   191
}
slouken@1913
   192
slouken@1913
   193
static void
slouken@1913
   194
WIN_GL_InitExtensions(_THIS)
slouken@1913
   195
{
slouken@1913
   196
    HWND hwnd;
slouken@1913
   197
    HDC hdc;
slouken@1913
   198
    PIXELFORMATDESCRIPTOR pfd;
slouken@1913
   199
    int pixel_format;
slouken@1913
   200
    HGLRC hglrc;
slouken@1913
   201
    const char *(WINAPI * wglGetExtensionsStringARB) (HDC) = 0;
slouken@1913
   202
    const char *extensions;
slouken@1913
   203
slouken@1913
   204
    hwnd =
slouken@1913
   205
        CreateWindow(SDL_Appname, SDL_Appname, (WS_POPUP | WS_DISABLED), 0, 0,
slouken@1913
   206
                     10, 10, NULL, NULL, SDL_Instance, NULL);
slouken@1913
   207
    WIN_PumpEvents(_this);
slouken@1913
   208
slouken@1913
   209
    hdc = GetDC(hwnd);
slouken@1913
   210
slouken@1913
   211
    WIN_GL_SetupPixelFormat(_this, &pfd);
slouken@1913
   212
    pixel_format = ChoosePixelFormat(hdc, &pfd);
slouken@1913
   213
    SetPixelFormat(hdc, pixel_format, &pfd);
slouken@1913
   214
slouken@1913
   215
    hglrc = _this->gl_data->wglCreateContext(hdc);
slouken@1913
   216
    if (hglrc) {
slouken@1913
   217
        _this->gl_data->wglMakeCurrent(hdc, hglrc);
slouken@1913
   218
    }
slouken@1913
   219
slouken@1913
   220
    wglGetExtensionsStringARB = (const char *(WINAPI *) (HDC))
slouken@1913
   221
        _this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB");
slouken@1913
   222
    if (wglGetExtensionsStringARB) {
slouken@1913
   223
        extensions = wglGetExtensionsStringARB(hdc);
slouken@1913
   224
    } else {
slouken@1913
   225
        extensions = NULL;
slouken@1913
   226
    }
slouken@1913
   227
slouken@1913
   228
    /* Check for WGL_ARB_pixel_format */
slouken@1913
   229
    _this->gl_data->WGL_ARB_pixel_format = 0;
slouken@1913
   230
    if (HasExtension("WGL_ARB_pixel_format", extensions)) {
slouken@1913
   231
        _this->gl_data->wglChoosePixelFormatARB = (BOOL(WINAPI *)
slouken@1913
   232
                                                   (HDC, const int *,
slouken@1913
   233
                                                    const FLOAT *, UINT,
slouken@1913
   234
                                                    int *, UINT *))
slouken@1913
   235
            WIN_GL_GetProcAddress(_this, "wglChoosePixelFormatARB");
slouken@1913
   236
        _this->gl_data->wglGetPixelFormatAttribivARB =
slouken@1913
   237
            (BOOL(WINAPI *) (HDC, int, int, UINT, const int *, int *))
slouken@1913
   238
            WIN_GL_GetProcAddress(_this, "wglGetPixelFormatAttribivARB");
slouken@1913
   239
slouken@1913
   240
        if ((_this->gl_data->wglChoosePixelFormatARB != NULL) &&
slouken@1913
   241
            (_this->gl_data->wglGetPixelFormatAttribivARB != NULL)) {
slouken@1913
   242
            _this->gl_data->WGL_ARB_pixel_format = 1;
slouken@1913
   243
        }
slouken@1913
   244
    }
slouken@1913
   245
slouken@1913
   246
    /* Check for WGL_EXT_swap_control */
slouken@1913
   247
    if (HasExtension("WGL_EXT_swap_control", extensions)) {
slouken@1913
   248
        _this->gl_data->wglSwapIntervalEXT =
slouken@1913
   249
            WIN_GL_GetProcAddress(_this, "wglSwapIntervalEXT");
slouken@1913
   250
        _this->gl_data->wglGetSwapIntervalEXT =
slouken@1913
   251
            WIN_GL_GetProcAddress(_this, "wglGetSwapIntervalEXT");
slouken@1913
   252
    }
slouken@1913
   253
slouken@1913
   254
    if (hglrc) {
slouken@1913
   255
        _this->gl_data->wglMakeCurrent(NULL, NULL);
slouken@1913
   256
        _this->gl_data->wglDeleteContext(hglrc);
slouken@1913
   257
    }
slouken@1913
   258
    ReleaseDC(hwnd, hdc);
slouken@1913
   259
    DestroyWindow(hwnd);
slouken@1913
   260
    WIN_PumpEvents(_this);
slouken@1913
   261
}
slouken@1913
   262
slouken@1913
   263
static int
slouken@1913
   264
WIN_GL_Initialize(_THIS)
slouken@1913
   265
{
slouken@1913
   266
    if (_this->gl_data) {
slouken@1913
   267
        ++_this->gl_data->initialized;
slouken@1913
   268
        return 0;
slouken@1913
   269
    }
slouken@1913
   270
slouken@1913
   271
    _this->gl_data =
slouken@1913
   272
        (struct SDL_GLDriverData *) SDL_calloc(1,
slouken@1913
   273
                                               sizeof(struct
slouken@1913
   274
                                                      SDL_GLDriverData));
slouken@1913
   275
    if (!_this->gl_data) {
slouken@1913
   276
        SDL_OutOfMemory();
slouken@1913
   277
        return -1;
slouken@1913
   278
    }
slouken@1913
   279
    _this->gl_data->initialized = 1;
slouken@1913
   280
slouken@1913
   281
    if (WIN_GL_LoadLibrary(_this, NULL) < 0) {
slouken@1913
   282
        return -1;
slouken@1913
   283
    }
slouken@1913
   284
slouken@1913
   285
    /* Initialize extensions */
slouken@1913
   286
    WIN_GL_InitExtensions(_this);
slouken@1913
   287
slouken@1913
   288
    return 0;
slouken@1913
   289
}
slouken@1913
   290
slouken@1952
   291
static void
slouken@1952
   292
WIN_GL_Shutdown(_THIS)
slouken@1952
   293
{
slouken@1952
   294
    if (!_this->gl_data || (--_this->gl_data->initialized > 0)) {
slouken@1952
   295
        return;
slouken@1952
   296
    }
slouken@1952
   297
slouken@1952
   298
    WIN_GL_UnloadLibrary(_this);
slouken@1952
   299
slouken@1952
   300
    SDL_free(_this->gl_data);
slouken@1952
   301
    _this->gl_data = NULL;
slouken@1952
   302
}
slouken@1952
   303
slouken@1913
   304
int
slouken@1913
   305
WIN_GL_SetupWindow(_THIS, SDL_Window * window)
slouken@1913
   306
{
slouken@1913
   307
    HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc;
slouken@1913
   308
    PIXELFORMATDESCRIPTOR pfd;
slouken@1913
   309
    int pixel_format;
slouken@1913
   310
    unsigned int matching;
slouken@1913
   311
    int iAttribs[64];
slouken@1913
   312
    int *iAttr;
slouken@1913
   313
    float fAttribs[1] = { 0 };
slouken@1913
   314
slouken@1913
   315
    if (WIN_GL_Initialize(_this) < 0) {
slouken@1913
   316
        return -1;
slouken@1913
   317
    }
slouken@1913
   318
slouken@1913
   319
    WIN_GL_SetupPixelFormat(_this, &pfd);
slouken@1913
   320
slouken@1913
   321
    /* setup WGL_ARB_pixel_format attribs */
slouken@1913
   322
    iAttr = &iAttribs[0];
slouken@1913
   323
slouken@1913
   324
    *iAttr++ = WGL_DRAW_TO_WINDOW_ARB;
slouken@1913
   325
    *iAttr++ = GL_TRUE;
slouken@1913
   326
    *iAttr++ = WGL_ACCELERATION_ARB;
slouken@1913
   327
    *iAttr++ = WGL_FULL_ACCELERATION_ARB;
slouken@1913
   328
    *iAttr++ = WGL_RED_BITS_ARB;
slouken@1913
   329
    *iAttr++ = _this->gl_config.red_size;
slouken@1913
   330
    *iAttr++ = WGL_GREEN_BITS_ARB;
slouken@1913
   331
    *iAttr++ = _this->gl_config.green_size;
slouken@1913
   332
    *iAttr++ = WGL_BLUE_BITS_ARB;
slouken@1913
   333
    *iAttr++ = _this->gl_config.blue_size;
slouken@1913
   334
slouken@1913
   335
    if (_this->gl_config.alpha_size) {
slouken@1913
   336
        *iAttr++ = WGL_ALPHA_BITS_ARB;
slouken@1913
   337
        *iAttr++ = _this->gl_config.alpha_size;
slouken@1913
   338
    }
slouken@1913
   339
slouken@1913
   340
    *iAttr++ = WGL_DOUBLE_BUFFER_ARB;
slouken@1913
   341
    *iAttr++ = _this->gl_config.double_buffer;
slouken@1913
   342
slouken@1913
   343
    *iAttr++ = WGL_DEPTH_BITS_ARB;
slouken@1913
   344
    *iAttr++ = _this->gl_config.depth_size;
slouken@1913
   345
slouken@1913
   346
    if (_this->gl_config.stencil_size) {
slouken@1913
   347
        *iAttr++ = WGL_STENCIL_BITS_ARB;
slouken@1913
   348
        *iAttr++ = _this->gl_config.stencil_size;
slouken@1913
   349
    }
slouken@1913
   350
slouken@1913
   351
    if (_this->gl_config.accum_red_size) {
slouken@1913
   352
        *iAttr++ = WGL_ACCUM_RED_BITS_ARB;
slouken@1913
   353
        *iAttr++ = _this->gl_config.accum_red_size;
slouken@1913
   354
    }
slouken@1913
   355
slouken@1913
   356
    if (_this->gl_config.accum_green_size) {
slouken@1913
   357
        *iAttr++ = WGL_ACCUM_GREEN_BITS_ARB;
slouken@1913
   358
        *iAttr++ = _this->gl_config.accum_green_size;
slouken@1913
   359
    }
slouken@1913
   360
slouken@1913
   361
    if (_this->gl_config.accum_blue_size) {
slouken@1913
   362
        *iAttr++ = WGL_ACCUM_BLUE_BITS_ARB;
slouken@1913
   363
        *iAttr++ = _this->gl_config.accum_blue_size;
slouken@1913
   364
    }
slouken@1913
   365
slouken@1913
   366
    if (_this->gl_config.accum_alpha_size) {
slouken@1913
   367
        *iAttr++ = WGL_ACCUM_ALPHA_BITS_ARB;
slouken@1913
   368
        *iAttr++ = _this->gl_config.accum_alpha_size;
slouken@1913
   369
    }
slouken@1913
   370
slouken@1913
   371
    if (_this->gl_config.stereo) {
slouken@1913
   372
        *iAttr++ = WGL_STEREO_ARB;
slouken@1913
   373
        *iAttr++ = GL_TRUE;
slouken@1913
   374
    }
slouken@1913
   375
slouken@1913
   376
    if (_this->gl_config.multisamplebuffers) {
slouken@1913
   377
        *iAttr++ = WGL_SAMPLE_BUFFERS_ARB;
slouken@1913
   378
        *iAttr++ = _this->gl_config.multisamplebuffers;
slouken@1913
   379
    }
slouken@1913
   380
slouken@1913
   381
    if (_this->gl_config.multisamplesamples) {
slouken@1913
   382
        *iAttr++ = WGL_SAMPLES_ARB;
slouken@1913
   383
        *iAttr++ = _this->gl_config.multisamplesamples;
slouken@1913
   384
    }
slouken@1913
   385
slouken@1913
   386
    if (_this->gl_config.accelerated >= 0) {
slouken@1913
   387
        *iAttr++ = WGL_ACCELERATION_ARB;
slouken@1913
   388
        *iAttr++ =
slouken@1913
   389
            (_this->gl_config.
slouken@1913
   390
             accelerated ? WGL_GENERIC_ACCELERATION_ARB :
slouken@1913
   391
             WGL_NO_ACCELERATION_ARB);
slouken@1913
   392
    }
slouken@1913
   393
slouken@1913
   394
    *iAttr = 0;
slouken@1913
   395
slouken@1913
   396
    /* Choose and set the closest available pixel format */
slouken@1913
   397
    if (!_this->gl_data->WGL_ARB_pixel_format
slouken@1913
   398
        || !_this->gl_data->wglChoosePixelFormatARB(hdc, iAttribs, fAttribs,
slouken@1913
   399
                                                    1, &pixel_format,
slouken@1913
   400
                                                    &matching) || !matching) {
slouken@1913
   401
        pixel_format = ChoosePixelFormat(hdc, &pfd);
slouken@1913
   402
    }
slouken@1913
   403
    if (!pixel_format) {
slouken@1913
   404
        SDL_SetError("No matching GL pixel format available");
slouken@1913
   405
        return -1;
slouken@1913
   406
    }
slouken@1913
   407
    if (!SetPixelFormat(hdc, pixel_format, &pfd)) {
slouken@1913
   408
        WIN_SetError("SetPixelFormat()");
slouken@1913
   409
        return (-1);
slouken@1913
   410
    }
slouken@1913
   411
    return 0;
slouken@1913
   412
}
slouken@1913
   413
slouken@1913
   414
void
slouken@1913
   415
WIN_GL_CleanupWindow(_THIS, SDL_Window * window)
slouken@1913
   416
{
slouken@1913
   417
    WIN_GL_Shutdown(_this);
slouken@1913
   418
}
slouken@1913
   419
slouken@1913
   420
SDL_GLContext
slouken@1913
   421
WIN_GL_CreateContext(_THIS, SDL_Window * window)
slouken@1913
   422
{
slouken@1913
   423
    HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc;
slouken@1913
   424
slouken@1913
   425
    return _this->gl_data->wglCreateContext(hdc);
slouken@1913
   426
}
slouken@1913
   427
slouken@1913
   428
int
slouken@1913
   429
WIN_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
slouken@1913
   430
{
slouken@1913
   431
    HDC hdc;
slouken@1913
   432
    int status;
slouken@1913
   433
slouken@1913
   434
    if (window) {
slouken@1913
   435
        hdc = ((SDL_WindowData *) window->driverdata)->hdc;
slouken@1913
   436
    } else {
slouken@1913
   437
        hdc = NULL;
slouken@1913
   438
    }
slouken@1913
   439
    if (!_this->gl_data->wglMakeCurrent(hdc, (HGLRC) context)) {
slouken@1913
   440
        WIN_SetError("wglMakeCurrent()");
slouken@1913
   441
        status = -1;
slouken@1913
   442
    } else {
slouken@1913
   443
        status = 0;
slouken@1913
   444
    }
slouken@1913
   445
    return status;
slouken@1913
   446
}
slouken@1913
   447
slouken@1913
   448
int
slouken@1913
   449
WIN_GL_SetSwapInterval(_THIS, int interval)
slouken@1913
   450
{
slouken@1913
   451
    if (_this->gl_data->wglSwapIntervalEXT) {
slouken@1913
   452
        _this->gl_data->wglSwapIntervalEXT(interval);
slouken@1913
   453
        return 0;
slouken@1913
   454
    } else {
slouken@1913
   455
        SDL_Unsupported();
slouken@1913
   456
        return -1;
slouken@1913
   457
    }
slouken@1913
   458
}
slouken@1913
   459
slouken@1913
   460
int
slouken@1913
   461
WIN_GL_GetSwapInterval(_THIS)
slouken@1913
   462
{
slouken@1913
   463
    if (_this->gl_data->wglGetSwapIntervalEXT) {
slouken@1913
   464
        return _this->gl_data->wglGetSwapIntervalEXT();
slouken@1913
   465
    } else {
slouken@1913
   466
        SDL_Unsupported();
slouken@1913
   467
        return -1;
slouken@1913
   468
    }
slouken@1913
   469
}
slouken@1913
   470
slouken@1913
   471
void
slouken@1913
   472
WIN_GL_SwapWindow(_THIS, SDL_Window * window)
slouken@1913
   473
{
slouken@1913
   474
    HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc;
slouken@1913
   475
slouken@1913
   476
    SwapBuffers(hdc);
slouken@1913
   477
}
slouken@1913
   478
slouken@1913
   479
void
slouken@1913
   480
WIN_GL_DeleteContext(_THIS, SDL_GLContext context)
slouken@1913
   481
{
slouken@1936
   482
    _this->gl_data->wglDeleteContext((HGLRC) context);
slouken@1913
   483
}
slouken@1913
   484
slouken@1952
   485
#endif /* SDL_VIDEO_OPENGL_WGL */
slouken@1913
   486
slouken@1913
   487
/* vi: set ts=4 sw=4 expandtab: */