src/video/SDL_sysvideo.h
author Sam Lantinga
Fri, 27 Jan 2017 21:23:27 -0800
changeset 10861 71d8f9afb690
parent 10806 36f40b8cc979
child 10880 5a77f977ad95
permissions -rw-r--r--
Fixed bug 3569 - GL_UpdateViewport leaves PROJECTION matrix selected

Tom Seddon

GL_ActivateRenderer may call GL_UpdateViewport, which leaves the GL_PROJECTION matrix selected. But after GL_ResetState, the GL_MODELVIEW matrix is selected, suggesting that's the intended default state.

It seems at least like these should be consistent. Presumably GL_UpdateViewport should be doing a glMatrixMode(GL_MODELVIEW) before it finishes.
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
     4 
     5   This software is provided 'as-is', without any express or implied
     6   warranty.  In no event will the authors be held liable for any damages
     7   arising from the use of this software.
     8 
     9   Permission is granted to anyone to use this software for any purpose,
    10   including commercial applications, and to alter it and redistribute it
    11   freely, subject to the following restrictions:
    12 
    13   1. The origin of this software must not be misrepresented; you must not
    14      claim that you wrote the original software. If you use this software
    15      in a product, an acknowledgment in the product documentation would be
    16      appreciated but is not required.
    17   2. Altered source versions must be plainly marked as such, and must not be
    18      misrepresented as being the original software.
    19   3. This notice may not be removed or altered from any source distribution.
    20 */
    21 #include "../SDL_internal.h"
    22 
    23 #ifndef SDL_sysvideo_h_
    24 #define SDL_sysvideo_h_
    25 
    26 #include "SDL_messagebox.h"
    27 #include "SDL_shape.h"
    28 #include "SDL_thread.h"
    29 
    30 /* The SDL video driver */
    31 
    32 typedef struct SDL_WindowShaper SDL_WindowShaper;
    33 typedef struct SDL_ShapeDriver SDL_ShapeDriver;
    34 typedef struct SDL_VideoDisplay SDL_VideoDisplay;
    35 typedef struct SDL_VideoDevice SDL_VideoDevice;
    36 
    37 /* Define the SDL window-shaper structure */
    38 struct SDL_WindowShaper
    39 {
    40     /* The window associated with the shaper */
    41     SDL_Window *window;
    42 
    43     /* The user's specified coordinates for the window, for once we give it a shape. */
    44     Uint32 userx,usery;
    45 
    46     /* The parameters for shape calculation. */
    47     SDL_WindowShapeMode mode;
    48 
    49     /* Has this window been assigned a shape? */
    50     SDL_bool hasshape;
    51 
    52     void *driverdata;
    53 };
    54 
    55 /* Define the SDL shape driver structure */
    56 struct SDL_ShapeDriver
    57 {
    58     SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);
    59     int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
    60     int (*ResizeWindowShape)(SDL_Window *window);
    61 };
    62 
    63 typedef struct SDL_WindowUserData
    64 {
    65     char *name;
    66     void *data;
    67     struct SDL_WindowUserData *next;
    68 } SDL_WindowUserData;
    69 
    70 /* Define the SDL window structure, corresponding to toplevel windows */
    71 struct SDL_Window
    72 {
    73     const void *magic;
    74     Uint32 id;
    75     char *title;
    76     SDL_Surface *icon;
    77     int x, y;
    78     int w, h;
    79     int min_w, min_h;
    80     int max_w, max_h;
    81     Uint32 flags;
    82     Uint32 last_fullscreen_flags;
    83 
    84     /* Stored position and size for windowed mode */
    85     SDL_Rect windowed;
    86 
    87     SDL_DisplayMode fullscreen_mode;
    88 
    89     float opacity;
    90 
    91     float brightness;
    92     Uint16 *gamma;
    93     Uint16 *saved_gamma;        /* (just offset into gamma) */
    94 
    95     SDL_Surface *surface;
    96     SDL_bool surface_valid;
    97 
    98     SDL_bool is_hiding;
    99     SDL_bool is_destroying;
   100     SDL_bool is_dropping;       /* drag/drop in progress, expecting SDL_SendDropComplete(). */
   101 
   102     SDL_WindowShaper *shaper;
   103 
   104     SDL_HitTest hit_test;
   105     void *hit_test_data;
   106 
   107     SDL_WindowUserData *data;
   108 
   109     void *driverdata;
   110 
   111     SDL_Window *prev;
   112     SDL_Window *next;
   113 };
   114 #define FULLSCREEN_VISIBLE(W) \
   115     (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
   116      ((W)->flags & SDL_WINDOW_SHOWN) && \
   117      !((W)->flags & SDL_WINDOW_MINIMIZED))
   118 
   119 /*
   120  * Define the SDL display structure This corresponds to physical monitors
   121  * attached to the system.
   122  */
   123 struct SDL_VideoDisplay
   124 {
   125     char *name;
   126     int max_display_modes;
   127     int num_display_modes;
   128     SDL_DisplayMode *display_modes;
   129     SDL_DisplayMode desktop_mode;
   130     SDL_DisplayMode current_mode;
   131 
   132     SDL_Window *fullscreen_window;
   133 
   134     SDL_VideoDevice *device;
   135 
   136     void *driverdata;
   137 };
   138 
   139 /* Forward declaration */
   140 struct SDL_SysWMinfo;
   141 
   142 /* Define the SDL video driver structure */
   143 #define _THIS   SDL_VideoDevice *_this
   144 
   145 struct SDL_VideoDevice
   146 {
   147     /* * * */
   148     /* The name of this video driver */
   149     const char *name;
   150 
   151     /* * * */
   152     /* Initialization/Query functions */
   153 
   154     /*
   155      * Initialize the native video subsystem, filling in the list of
   156      * displays for this driver, returning 0 or -1 if there's an error.
   157      */
   158     int (*VideoInit) (_THIS);
   159 
   160     /*
   161      * Reverse the effects VideoInit() -- called if VideoInit() fails or
   162      * if the application is shutting down the video subsystem.
   163      */
   164     void (*VideoQuit) (_THIS);
   165 
   166     /* * * */
   167     /*
   168      * Display functions
   169      */
   170 
   171     /*
   172      * Get the bounds of a display
   173      */
   174     int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   175 
   176     /*
   177      * Get the dots/pixels-per-inch of a display
   178      */
   179     int (*GetDisplayDPI) (_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
   180 
   181     /*
   182      * Get the usable bounds of a display (bounds minus menubar or whatever)
   183      */
   184     int (*GetDisplayUsableBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   185 
   186     /*
   187      * Get a list of the available display modes for a display.
   188      */
   189     void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
   190 
   191     /*
   192      * Setting the display mode is independent of creating windows, so
   193      * when the display mode is changed, all existing windows should have
   194      * their data updated accordingly, including the display surfaces
   195      * associated with them.
   196      */
   197     int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
   198 
   199     /* * * */
   200     /*
   201      * Window functions
   202      */
   203     int (*CreateWindow) (_THIS, SDL_Window * window);
   204     int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
   205     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   206     void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
   207     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   208     void (*SetWindowSize) (_THIS, SDL_Window * window);
   209     void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
   210     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
   211     int (*GetWindowBordersSize) (_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);
   212     int (*SetWindowOpacity) (_THIS, SDL_Window * window, float opacity);
   213     int (*SetWindowModalFor) (_THIS, SDL_Window * modal_window, SDL_Window * parent_window);
   214     int (*SetWindowInputFocus) (_THIS, SDL_Window * window);
   215     void (*ShowWindow) (_THIS, SDL_Window * window);
   216     void (*HideWindow) (_THIS, SDL_Window * window);
   217     void (*RaiseWindow) (_THIS, SDL_Window * window);
   218     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   219     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   220     void (*RestoreWindow) (_THIS, SDL_Window * window);
   221     void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
   222     void (*SetWindowResizable) (_THIS, SDL_Window * window, SDL_bool resizable);
   223     void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
   224     int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
   225     int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
   226     void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
   227     void (*DestroyWindow) (_THIS, SDL_Window * window);
   228     int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
   229     int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
   230     void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
   231     void (*OnWindowEnter) (_THIS, SDL_Window * window);
   232 
   233     /* * * */
   234     /*
   235      * Shaped-window functions
   236      */
   237     SDL_ShapeDriver shape_driver;
   238 
   239     /* Get some platform dependent window information */
   240     SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   241                                 struct SDL_SysWMinfo * info);
   242 
   243     /* * * */
   244     /*
   245      * OpenGL support
   246      */
   247     int (*GL_LoadLibrary) (_THIS, const char *path);
   248     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   249     void (*GL_UnloadLibrary) (_THIS);
   250       SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
   251     int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
   252     void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   253     int (*GL_SetSwapInterval) (_THIS, int interval);
   254     int (*GL_GetSwapInterval) (_THIS);
   255     int (*GL_SwapWindow) (_THIS, SDL_Window * window);
   256     void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
   257 
   258     /* * * */
   259     /*
   260      * Event manager functions
   261      */
   262     void (*PumpEvents) (_THIS);
   263 
   264     /* Suspend the screensaver */
   265     void (*SuspendScreenSaver) (_THIS);
   266 
   267     /* Text input */
   268     void (*StartTextInput) (_THIS);
   269     void (*StopTextInput) (_THIS);
   270     void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
   271 
   272     /* Screen keyboard */
   273     SDL_bool (*HasScreenKeyboardSupport) (_THIS);
   274     void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
   275     void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
   276     SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
   277 
   278     /* Clipboard */
   279     int (*SetClipboardText) (_THIS, const char *text);
   280     char * (*GetClipboardText) (_THIS);
   281     SDL_bool (*HasClipboardText) (_THIS);
   282 
   283     /* MessageBox */
   284     int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
   285 
   286     /* Hit-testing */
   287     int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);
   288 
   289     /* * * */
   290     /* Data common to all drivers */
   291     SDL_bool is_dummy;
   292     SDL_bool suspend_screensaver;
   293     int num_displays;
   294     SDL_VideoDisplay *displays;
   295     SDL_Window *windows;
   296     SDL_Window *grabbed_window;
   297     Uint8 window_magic;
   298     Uint32 next_object_id;
   299     char *clipboard_text;
   300 
   301     /* * * */
   302     /* Data used by the GL drivers */
   303     struct
   304     {
   305         int red_size;
   306         int green_size;
   307         int blue_size;
   308         int alpha_size;
   309         int depth_size;
   310         int buffer_size;
   311         int stencil_size;
   312         int double_buffer;
   313         int accum_red_size;
   314         int accum_green_size;
   315         int accum_blue_size;
   316         int accum_alpha_size;
   317         int stereo;
   318         int multisamplebuffers;
   319         int multisamplesamples;
   320         int accelerated;
   321         int major_version;
   322         int minor_version;
   323         int flags;
   324         int profile_mask;
   325         int share_with_current_context;
   326         int release_behavior;
   327         int framebuffer_srgb_capable;
   328         int retained_backing;
   329         int driver_loaded;
   330         char driver_path[256];
   331         void *dll_handle;
   332     } gl_config;
   333 
   334     /* * * */
   335     /* Cache current GL context; don't call the OS when it hasn't changed. */
   336     /* We have the global pointers here so Cocoa continues to work the way
   337        it always has, and the thread-local storage for the general case.
   338      */
   339     SDL_Window *current_glwin;
   340     SDL_GLContext current_glctx;
   341     SDL_TLSID current_glwin_tls;
   342     SDL_TLSID current_glctx_tls;
   343 
   344     /* * * */
   345     /* Data private to this driver */
   346     void *driverdata;
   347     struct SDL_GLDriverData *gl_data;
   348     
   349 #if SDL_VIDEO_OPENGL_EGL
   350     struct SDL_EGL_VideoData *egl_data;
   351 #endif
   352     
   353 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
   354     struct SDL_PrivateGLESData *gles_data;
   355 #endif
   356 
   357     /* * * */
   358     /* The function used to dispose of this structure */
   359     void (*free) (_THIS);
   360 };
   361 
   362 typedef struct VideoBootStrap
   363 {
   364     const char *name;
   365     const char *desc;
   366     int (*available) (void);
   367     SDL_VideoDevice *(*create) (int devindex);
   368 } VideoBootStrap;
   369 
   370 #if SDL_VIDEO_DRIVER_COCOA
   371 extern VideoBootStrap COCOA_bootstrap;
   372 #endif
   373 #if SDL_VIDEO_DRIVER_X11
   374 extern VideoBootStrap X11_bootstrap;
   375 #endif
   376 #if SDL_VIDEO_DRIVER_MIR
   377 extern VideoBootStrap MIR_bootstrap;
   378 #endif
   379 #if SDL_VIDEO_DRIVER_DIRECTFB
   380 extern VideoBootStrap DirectFB_bootstrap;
   381 #endif
   382 #if SDL_VIDEO_DRIVER_WINDOWS
   383 extern VideoBootStrap WINDOWS_bootstrap;
   384 #endif
   385 #if SDL_VIDEO_DRIVER_WINRT
   386 extern VideoBootStrap WINRT_bootstrap;
   387 #endif
   388 #if SDL_VIDEO_DRIVER_HAIKU
   389 extern VideoBootStrap HAIKU_bootstrap;
   390 #endif
   391 #if SDL_VIDEO_DRIVER_PANDORA
   392 extern VideoBootStrap PND_bootstrap;
   393 #endif
   394 #if SDL_VIDEO_DRIVER_UIKIT
   395 extern VideoBootStrap UIKIT_bootstrap;
   396 #endif
   397 #if SDL_VIDEO_DRIVER_ANDROID
   398 extern VideoBootStrap Android_bootstrap;
   399 #endif
   400 #if SDL_VIDEO_DRIVER_PSP
   401 extern VideoBootStrap PSP_bootstrap;
   402 #endif
   403 #if SDL_VIDEO_DRIVER_RPI
   404 extern VideoBootStrap RPI_bootstrap;
   405 #endif
   406 #if SDL_VIDEO_DRIVER_DUMMY
   407 extern VideoBootStrap DUMMY_bootstrap;
   408 #endif
   409 #if SDL_VIDEO_DRIVER_WAYLAND
   410 extern VideoBootStrap Wayland_bootstrap;
   411 #endif
   412 #if SDL_VIDEO_DRIVER_NACL
   413 extern VideoBootStrap NACL_bootstrap;
   414 #endif
   415 #if SDL_VIDEO_DRIVER_VIVANTE
   416 extern VideoBootStrap VIVANTE_bootstrap;
   417 #endif
   418 #if SDL_VIDEO_DRIVER_EMSCRIPTEN
   419 extern VideoBootStrap Emscripten_bootstrap;
   420 #endif
   421 
   422 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
   423 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   424 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   425 extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
   426 extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
   427 extern void *SDL_GetDisplayDriverData( int displayIndex );
   428 
   429 extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor);
   430 
   431 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
   432 
   433 extern void SDL_OnWindowShown(SDL_Window * window);
   434 extern void SDL_OnWindowHidden(SDL_Window * window);
   435 extern void SDL_OnWindowResized(SDL_Window * window);
   436 extern void SDL_OnWindowMinimized(SDL_Window * window);
   437 extern void SDL_OnWindowRestored(SDL_Window * window);
   438 extern void SDL_OnWindowEnter(SDL_Window * window);
   439 extern void SDL_OnWindowLeave(SDL_Window * window);
   440 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   441 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   442 extern void SDL_UpdateWindowGrab(SDL_Window * window);
   443 extern SDL_Window * SDL_GetFocusWindow(void);
   444 
   445 extern SDL_bool SDL_ShouldAllowTopmost(void);
   446 
   447 extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);
   448 
   449 #endif /* SDL_sysvideo_h_ */
   450 
   451 /* vi: set ts=4 sw=4 expandtab: */