src/video/SDL_sysvideo.h
author Sam Lantinga <slouken@libsdl.org>
Thu, 11 Jul 2013 22:59:20 -0700
changeset 7412 50211a1fd557
parent 7390 e4b98404baa4
child 7523 9e9ab1dc3811
permissions -rw-r--r--
Fixed bug 1946 - OpenGL contexts in threads

The SDL OpenGL context code is now properly thread aware. There are two new functions which return the current OpenGL window and context for the current thread.

There are still places in the cocoa driver where the OpenGL context needs to be updated when the view changes. These will need a different solution and still use the last globally set context to avoid changing behavior.
slouken@0
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@6885
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
slouken@0
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@0
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@0
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@0
    20
*/
slouken@1402
    21
#include "SDL_config.h"
slouken@0
    22
slouken@0
    23
#ifndef _SDL_sysvideo_h
slouken@0
    24
#define _SDL_sysvideo_h
slouken@0
    25
slouken@6602
    26
#include "SDL_messagebox.h"
eligottlieb@4782
    27
#include "SDL_shape.h"
jorgen@7390
    28
#include "SDL_thread.h"
slouken@0
    29
slouken@0
    30
/* The SDL video driver */
slouken@1895
    31
eligottlieb@4782
    32
typedef struct SDL_WindowShaper SDL_WindowShaper;
eligottlieb@4782
    33
typedef struct SDL_ShapeDriver SDL_ShapeDriver;
slouken@1895
    34
typedef struct SDL_VideoDisplay SDL_VideoDisplay;
slouken@0
    35
typedef struct SDL_VideoDevice SDL_VideoDevice;
slouken@0
    36
eligottlieb@4782
    37
/* Define the SDL window-shaper structure */
eligottlieb@4782
    38
struct SDL_WindowShaper
slouken@7191
    39
{
eligottlieb@4782
    40
    /* The window associated with the shaper */
eligottlieb@4782
    41
    SDL_Window *window;
slouken@7191
    42
eligottlieb@4851
    43
    /* The user's specified coordinates for the window, for once we give it a shape. */
eligottlieb@4851
    44
    Uint32 userx,usery;
slouken@7191
    45
eligottlieb@4807
    46
    /* The parameters for shape calculation. */
eligottlieb@4807
    47
    SDL_WindowShapeMode mode;
slouken@7191
    48
eligottlieb@4782
    49
    /* Has this window been assigned a shape? */
eligottlieb@4782
    50
    SDL_bool hasshape;
slouken@7191
    51
eligottlieb@4782
    52
    void *driverdata;
eligottlieb@4782
    53
};
eligottlieb@4782
    54
eligottlieb@4782
    55
/* Define the SDL shape driver structure */
eligottlieb@4782
    56
struct SDL_ShapeDriver
eligottlieb@4782
    57
{
eligottlieb@4782
    58
    SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);
egottlieb@4849
    59
    int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
eligottlieb@4782
    60
    int (*ResizeWindowShape)(SDL_Window *window);
eligottlieb@4782
    61
};
eligottlieb@4782
    62
slouken@5165
    63
typedef struct SDL_WindowUserData
slouken@5165
    64
{
slouken@5165
    65
    char *name;
slouken@5165
    66
    void *data;
slouken@5165
    67
    struct SDL_WindowUserData *next;
slouken@5165
    68
} SDL_WindowUserData;
slouken@5165
    69
slouken@1895
    70
/* Define the SDL window structure, corresponding to toplevel windows */
slouken@2753
    71
struct SDL_Window
slouken@2753
    72
{
slouken@3695
    73
    const void *magic;
slouken@2753
    74
    Uint32 id;
slouken@2753
    75
    char *title;
slouken@2753
    76
    int x, y;
slouken@2753
    77
    int w, h;
stopiccot@6681
    78
    int min_w, min_h;
slouken@6788
    79
    int max_w, max_h;
slouken@2753
    80
    Uint32 flags;
slouken@1895
    81
slouken@5398
    82
    /* Stored position and size for windowed mode */
slouken@5398
    83
    SDL_Rect windowed;
slouken@5398
    84
slouken@3500
    85
    SDL_DisplayMode fullscreen_mode;
slouken@7191
    86
slouken@5466
    87
    float brightness;
slouken@5466
    88
    Uint16 *gamma;
slouken@5466
    89
    Uint16 *saved_gamma;        /* (just offset into gamma) */
slouken@5466
    90
slouken@5166
    91
    SDL_Surface *surface;
slouken@5174
    92
    SDL_bool surface_valid;
slouken@5166
    93
eligottlieb@4782
    94
    SDL_WindowShaper *shaper;
slouken@3500
    95
slouken@5165
    96
    SDL_WindowUserData *data;
slouken@5165
    97
slouken@2753
    98
    void *driverdata;
slouken@3685
    99
slouken@3685
   100
    SDL_Window *prev;
slouken@3685
   101
    SDL_Window *next;
slouken@1895
   102
};
slouken@1895
   103
#define FULLSCREEN_VISIBLE(W) \
slouken@1895
   104
    (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
slouken@1895
   105
     ((W)->flags & SDL_WINDOW_SHOWN) && \
slouken@1895
   106
     !((W)->flags & SDL_WINDOW_MINIMIZED))
slouken@1895
   107
hfutrell@2742
   108
/*
hfutrell@2742
   109
 * Define the SDL display structure This corresponds to physical monitors
hfutrell@2742
   110
 * attached to the system.
slouken@1895
   111
 */
slouken@2753
   112
struct SDL_VideoDisplay
slouken@2753
   113
{
slouken@6787
   114
    char *name;
slouken@2753
   115
    int max_display_modes;
slouken@2753
   116
    int num_display_modes;
slouken@2753
   117
    SDL_DisplayMode *display_modes;
slouken@2753
   118
    SDL_DisplayMode desktop_mode;
slouken@2753
   119
    SDL_DisplayMode current_mode;
slouken@1895
   120
slouken@3517
   121
    SDL_Window *fullscreen_window;
slouken@1895
   122
slouken@2753
   123
    SDL_VideoDevice *device;
slouken@1895
   124
slouken@2753
   125
    void *driverdata;
slouken@1895
   126
};
slouken@1895
   127
slouken@5272
   128
/* Forward declaration */
slouken@5272
   129
struct SDL_SysWMinfo;
slouken@5272
   130
slouken@0
   131
/* Define the SDL video driver structure */
slouken@7191
   132
#define _THIS   SDL_VideoDevice *_this
slouken@0
   133
slouken@2753
   134
struct SDL_VideoDevice
slouken@2753
   135
{
slouken@2753
   136
    /* * * */
slouken@2753
   137
    /* The name of this video driver */
slouken@2753
   138
    const char *name;
slouken@0
   139
slouken@2753
   140
    /* * * */
slouken@2753
   141
    /* Initialization/Query functions */
slouken@0
   142
slouken@2753
   143
    /*
slouken@2753
   144
     * Initialize the native video subsystem, filling in the list of
slouken@2753
   145
     * displays for this driver, returning 0 or -1 if there's an error.
slouken@2753
   146
     */
slouken@2753
   147
    int (*VideoInit) (_THIS);
slouken@0
   148
slouken@2753
   149
    /*
slouken@2753
   150
     * Reverse the effects VideoInit() -- called if VideoInit() fails or
slouken@2753
   151
     * if the application is shutting down the video subsystem.
slouken@2753
   152
     */
slouken@2753
   153
    void (*VideoQuit) (_THIS);
slouken@1913
   154
slouken@2753
   155
    /* * * */
slouken@2753
   156
    /*
slouken@2753
   157
     * Display functions
slouken@2753
   158
     */
slouken@0
   159
slouken@2753
   160
    /*
slouken@3528
   161
     * Get the bounds of a display
slouken@3528
   162
     */
slouken@3528
   163
    int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
slouken@3528
   164
slouken@3528
   165
    /*
slouken@5246
   166
     * Get a list of the available display modes for a display.
slouken@2753
   167
     */
slouken@3500
   168
    void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
slouken@0
   169
slouken@2753
   170
    /*
slouken@2753
   171
     * Setting the display mode is independent of creating windows, so
slouken@2753
   172
     * when the display mode is changed, all existing windows should have
slouken@2753
   173
     * their data updated accordingly, including the display surfaces
slouken@2753
   174
     * associated with them.
slouken@2753
   175
     */
slouken@3500
   176
    int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
slouken@0
   177
slouken@2753
   178
    /* * * */
slouken@2753
   179
    /*
slouken@2753
   180
     * Window functions
slouken@2753
   181
     */
slouken@2753
   182
    int (*CreateWindow) (_THIS, SDL_Window * window);
slouken@2753
   183
    int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
slouken@2753
   184
    void (*SetWindowTitle) (_THIS, SDL_Window * window);
slouken@2967
   185
    void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
slouken@2753
   186
    void (*SetWindowPosition) (_THIS, SDL_Window * window);
slouken@2753
   187
    void (*SetWindowSize) (_THIS, SDL_Window * window);
stopiccot@6681
   188
    void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
slouken@6788
   189
    void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
slouken@2753
   190
    void (*ShowWindow) (_THIS, SDL_Window * window);
slouken@2753
   191
    void (*HideWindow) (_THIS, SDL_Window * window);
slouken@2753
   192
    void (*RaiseWindow) (_THIS, SDL_Window * window);
slouken@2753
   193
    void (*MaximizeWindow) (_THIS, SDL_Window * window);
slouken@2753
   194
    void (*MinimizeWindow) (_THIS, SDL_Window * window);
slouken@2753
   195
    void (*RestoreWindow) (_THIS, SDL_Window * window);
icculus@6422
   196
    void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
slouken@5305
   197
    void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
slouken@5466
   198
    int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
slouken@5466
   199
    int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
slouken@6662
   200
    void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
slouken@2753
   201
    void (*DestroyWindow) (_THIS, SDL_Window * window);
slouken@5166
   202
    int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
slouken@7014
   203
    int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
slouken@5166
   204
    void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
jorgen@7089
   205
    void (*OnWindowEnter) (_THIS, SDL_Window * window);
slouken@5166
   206
eligottlieb@4782
   207
    /* * * */
eligottlieb@4782
   208
    /*
eligottlieb@4782
   209
     * Shaped-window functions
eligottlieb@4782
   210
     */
eligottlieb@4782
   211
    SDL_ShapeDriver shape_driver;
slouken@0
   212
slouken@2753
   213
    /* Get some platform dependent window information */
slouken@2753
   214
      SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
slouken@2753
   215
                                  struct SDL_SysWMinfo * info);
slouken@0
   216
slouken@2753
   217
    /* * * */
slouken@2753
   218
    /*
slouken@2753
   219
     * OpenGL support
slouken@2753
   220
     */
slouken@2753
   221
    int (*GL_LoadLibrary) (_THIS, const char *path);
slouken@2753
   222
    void *(*GL_GetProcAddress) (_THIS, const char *proc);
slouken@3057
   223
    void (*GL_UnloadLibrary) (_THIS);
slouken@2753
   224
      SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
slouken@2753
   225
    int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
slouken@2753
   226
    int (*GL_SetSwapInterval) (_THIS, int interval);
slouken@2753
   227
    int (*GL_GetSwapInterval) (_THIS);
slouken@2753
   228
    void (*GL_SwapWindow) (_THIS, SDL_Window * window);
slouken@2753
   229
    void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
slouken@0
   230
slouken@2753
   231
    /* * * */
slouken@2753
   232
    /*
slouken@2753
   233
     * Event manager functions
slouken@2753
   234
     */
slouken@2753
   235
    void (*PumpEvents) (_THIS);
slouken@0
   236
slouken@3025
   237
    /* Suspend the screensaver */
slouken@3025
   238
    void (*SuspendScreenSaver) (_THIS);
slouken@3025
   239
slouken@3280
   240
    /* Text input */
slouken@3280
   241
    void (*StartTextInput) (_THIS);
slouken@3280
   242
    void (*StopTextInput) (_THIS);
slouken@3280
   243
    void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
slouken@3280
   244
slouken@6392
   245
    /* Screen keyboard */
philipp@7135
   246
    SDL_bool (*HasScreenKeyboardSupport) (_THIS);
philipp@7135
   247
    void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
philipp@7135
   248
    void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
philipp@7135
   249
    SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
slouken@6392
   250
slouken@4495
   251
    /* Clipboard */
slouken@4495
   252
    int (*SetClipboardText) (_THIS, const char *text);
slouken@4495
   253
    char * (*GetClipboardText) (_THIS);
slouken@4495
   254
    SDL_bool (*HasClipboardText) (_THIS);
slouken@4495
   255
slouken@6602
   256
    /* MessageBox */
slouken@6602
   257
    int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
slouken@6602
   258
slouken@2753
   259
    /* * * */
slouken@2753
   260
    /* Data common to all drivers */
slouken@3025
   261
    SDL_bool suspend_screensaver;
slouken@2753
   262
    int num_displays;
slouken@2753
   263
    SDL_VideoDisplay *displays;
slouken@5246
   264
    SDL_Window *windows;
slouken@3695
   265
    Uint8 window_magic;
slouken@2753
   266
    Uint32 next_object_id;
slouken@4495
   267
    char * clipboard_text;
slouken@0
   268
slouken@2753
   269
    /* * * */
slouken@2753
   270
    /* Data used by the GL drivers */
slouken@2753
   271
    struct
slouken@2753
   272
    {
slouken@2753
   273
        int red_size;
slouken@2753
   274
        int green_size;
slouken@2753
   275
        int blue_size;
slouken@2753
   276
        int alpha_size;
slouken@2753
   277
        int depth_size;
slouken@2753
   278
        int buffer_size;
slouken@2753
   279
        int stencil_size;
slouken@2753
   280
        int double_buffer;
slouken@2753
   281
        int accum_red_size;
slouken@2753
   282
        int accum_green_size;
slouken@2753
   283
        int accum_blue_size;
slouken@2753
   284
        int accum_alpha_size;
slouken@2753
   285
        int stereo;
slouken@2753
   286
        int multisamplebuffers;
slouken@2753
   287
        int multisamplesamples;
slouken@2753
   288
        int accelerated;
slouken@3100
   289
        int major_version;
slouken@3100
   290
        int minor_version;
slouken@6296
   291
        int flags;
slouken@6296
   292
        int profile_mask;
slouken@6370
   293
        int use_egl;
slouken@6393
   294
        int share_with_current_context;
slouken@2753
   295
        int retained_backing;
slouken@2753
   296
        int driver_loaded;
slouken@2753
   297
        char driver_path[256];
slouken@2753
   298
        void *dll_handle;
slouken@2753
   299
    } gl_config;
slouken@0
   300
slouken@2753
   301
    /* * * */
icculus@5563
   302
    /* Cache current GL context; don't call the OS when it hasn't changed. */
icculus@5563
   303
    SDL_Window *current_glwin;
icculus@5563
   304
    SDL_GLContext current_glctx;
slouken@7412
   305
    SDL_TLSID current_glwin_tls;
slouken@7412
   306
    SDL_TLSID current_glctx_tls;
icculus@5563
   307
icculus@5563
   308
    /* * * */
slouken@2753
   309
    /* Data private to this driver */
slouken@2753
   310
    void *driverdata;
slouken@2753
   311
    struct SDL_GLDriverData *gl_data;
slouken@0
   312
slouken@6370
   313
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
slouken@3161
   314
    struct SDL_PrivateGLESData *gles_data;
slouken@3161
   315
#endif
slouken@3161
   316
slouken@2753
   317
    /* * * */
slouken@2753
   318
    /* The function used to dispose of this structure */
slouken@2753
   319
    void (*free) (_THIS);
slouken@1895
   320
};
slouken@0
   321
slouken@2753
   322
typedef struct VideoBootStrap
slouken@2753
   323
{
slouken@2753
   324
    const char *name;
slouken@2753
   325
    const char *desc;
slouken@2753
   326
    int (*available) (void);
slouken@2753
   327
    SDL_VideoDevice *(*create) (int devindex);
slouken@2753
   328
} VideoBootStrap;
slouken@0
   329
slouken@1931
   330
#if SDL_VIDEO_DRIVER_COCOA
slouken@1931
   331
extern VideoBootStrap COCOA_bootstrap;
slouken@1361
   332
#endif
slouken@1361
   333
#if SDL_VIDEO_DRIVER_X11
slouken@0
   334
extern VideoBootStrap X11_bootstrap;
slouken@0
   335
#endif
slouken@1361
   336
#if SDL_VIDEO_DRIVER_DIRECTFB
slouken@167
   337
extern VideoBootStrap DirectFB_bootstrap;
slouken@167
   338
#endif
slouken@5062
   339
#if SDL_VIDEO_DRIVER_WINDOWS
slouken@5062
   340
extern VideoBootStrap WINDOWS_bootstrap;
slouken@1361
   341
#endif
slouken@1361
   342
#if SDL_VIDEO_DRIVER_BWINDOW
slouken@1361
   343
extern VideoBootStrap BWINDOW_bootstrap;
slouken@1361
   344
#endif
slouken@5150
   345
#if SDL_VIDEO_DRIVER_PANDORA
slouken@5150
   346
extern VideoBootStrap PND_bootstrap;
slouken@3083
   347
#endif
hfutrell@2742
   348
#if SDL_VIDEO_DRIVER_UIKIT
hfutrell@2742
   349
extern VideoBootStrap UIKIT_bootstrap;
hfutrell@2742
   350
#endif
slouken@5150
   351
#if SDL_VIDEO_DRIVER_ANDROID
slouken@5150
   352
extern VideoBootStrap Android_bootstrap;
slouken@5150
   353
#endif
kimonline@7009
   354
#if SDL_VIDEO_DRIVER_PSP
kimonline@7009
   355
extern VideoBootStrap PSP_bootstrap;
kimonline@7009
   356
#endif
slouken@1361
   357
#if SDL_VIDEO_DRIVER_DUMMY
slouken@173
   358
extern VideoBootStrap DUMMY_bootstrap;
slouken@173
   359
#endif
slouken@1361
   360
slouken@4472
   361
extern SDL_VideoDevice *SDL_GetVideoDevice(void);
slouken@2753
   362
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
slouken@2753
   363
extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
slouken@3500
   364
extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
slouken@5246
   365
extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
slouken@1895
   366
slouken@2753
   367
extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
slouken@1895
   368
slouken@2753
   369
extern void SDL_OnWindowShown(SDL_Window * window);
slouken@2753
   370
extern void SDL_OnWindowHidden(SDL_Window * window);
slouken@5166
   371
extern void SDL_OnWindowResized(SDL_Window * window);
slouken@3502
   372
extern void SDL_OnWindowMinimized(SDL_Window * window);
slouken@3502
   373
extern void SDL_OnWindowRestored(SDL_Window * window);
jorgen@7089
   374
extern void SDL_OnWindowEnter(SDL_Window * window);
jorgen@7089
   375
extern void SDL_OnWindowLeave(SDL_Window * window);
slouken@2753
   376
extern void SDL_OnWindowFocusGained(SDL_Window * window);
slouken@2753
   377
extern void SDL_OnWindowFocusLost(SDL_Window * window);
slouken@6662
   378
extern void SDL_UpdateWindowGrab(SDL_Window * window);
slouken@3685
   379
extern SDL_Window * SDL_GetFocusWindow(void);
slouken@0
   380
philipp@7178
   381
extern SDL_bool SDL_ShouldAllowTopmost(void);
slouken@6784
   382
slouken@2753
   383
#endif /* _SDL_sysvideo_h */
slouken@1895
   384
slouken@1895
   385
/* vi: set ts=4 sw=4 expandtab: */