X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=407667452dbac5f8632587e9014d403159acd1f8;hb=3eb5d3a10dc341e94a1290bbe1f9735e18e83e5f;hp=41af967e18a1e583c3212c3877ba1e503a458d30;hpb=233a6e8536ef2ff2c799011417b9f55e1db54300;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 41af967e..40766745 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -4,7 +4,7 @@ // (c) 1995-2014 by Artsoft Entertainment // Holger Schemel // info@artsoft.org -// http://www.artsoft.org/ +// https://www.artsoft.org/ // ---------------------------------------------------------------------------- // sdl.c // ============================================================================ @@ -330,6 +330,15 @@ static void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) SDL_SetSurfaceAlphaMod(surface, alpha); } +const char *SDLGetRendererName(void) +{ + static SDL_RendererInfo renderer_info; + + SDL_GetRendererInfo(sdl_renderer, &renderer_info); + + return renderer_info.name; +} + SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { SDL_PixelFormat format; @@ -428,6 +437,10 @@ void SDLFreeBitmapTextures(Bitmap *bitmap) void SDLInitVideoDisplay(void) { + // set hint to select render driver as specified in setup config file + if (!strEqual(setup.system.sdl_renderdriver, ARG_DEFAULT)) + SDL_SetHint(SDL_HINT_RENDER_DRIVER, setup.system.sdl_renderdriver); + // initialize SDL video if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError()); @@ -502,6 +515,14 @@ static boolean SDLCreateScreen(boolean fullscreen) #if 1 int renderer_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; + + video.vsync_mode = VSYNC_MODE_OFF; + + if (!strEqual(setup.vsync_mode, STR_VSYNC_MODE_OFF)) + { + renderer_flags |= SDL_RENDERER_PRESENTVSYNC; + video.vsync_mode = VSYNC_MODE_NORMAL; + } #else /* If SDL_CreateRenderer() is called from within a VirtualBox Windows VM _without_ enabling 2D/3D acceleration and/or guest additions installed, @@ -574,6 +595,7 @@ static boolean SDLCreateScreen(boolean fullscreen) // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, setup.window_scaling_quality); + // required for setting adaptive vsync when using OpenGL renderer SDLSetScreenVsyncMode(setup.vsync_mode); sdl_texture_stream = SDL_CreateTexture(sdl_renderer, @@ -855,15 +877,25 @@ void SDLSetScreenRenderingMode(char *screen_rendering_mode) void SDLSetScreenVsyncMode(char *vsync_mode) { - int interval = - (strEqual(vsync_mode, STR_VSYNC_MODE_NORMAL) ? VSYNC_MODE_NORMAL : - strEqual(vsync_mode, STR_VSYNC_MODE_ADAPTIVE) ? VSYNC_MODE_ADAPTIVE : - VSYNC_MODE_OFF); + // changing vsync mode without re-creating renderer only supported by OpenGL + if (!strPrefixLower((char *)SDLGetRendererName(), "opengl")) + return; + + int interval = VSYNC_MODE_STR_TO_INT(vsync_mode); int result = SDL_GL_SetSwapInterval(interval); // if adaptive vsync requested, but not supported, retry with normal vsync if (result == -1 && interval == VSYNC_MODE_ADAPTIVE) - SDL_GL_SetSwapInterval(VSYNC_MODE_NORMAL); + { + interval = VSYNC_MODE_NORMAL; + + result = SDL_GL_SetSwapInterval(interval); + } + + if (result == -1) + interval = VSYNC_MODE_OFF; + + video.vsync_mode = interval; } void SDLRedrawWindow(void) @@ -2557,6 +2589,9 @@ static void setJoystickButton(int nr, int button_id_raw, int button_state) void HandleJoystickEvent(Event *event) { + // when using joystick, disable overlay touch buttons + runtime.uses_touch_device = FALSE; + switch (event->type) { case SDL_CONTROLLERDEVICEADDED: