From abaf21058bd6fcb03001901a4b18132750dc2078 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 5 Feb 2011 10:35:36 -0800 Subject: [PATCH] Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints. --- include/SDL_hints.h | 26 ++++++++++++++++++++++++++ src/render/SDL_render.c | 22 +++++++++++++++++----- src/video/SDL_video.c | 8 ++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 4f3a00f32..27f430f9e 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -67,6 +67,32 @@ extern "C" { */ #define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" +/** + * \brief A variable specifying which render driver to use. + * + * If the application doesn't pick a specific renderer to use, this variable + * specifies the name of the preferred renderer. If the preferred renderer + * can't be initialized, the normal default renderer is used. + * + * This variable is case insensitive and can be set to the following values: + * "direct3d" + * "opengl" + * "opengles" + * "software" + */ +#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" + +/** + * \brief A variable controlling whether updates to the SDL 1.2 screen surface should be synchronized with the vertical refresh, to avoid tearing. + * + * This variable can be set to the following values: + * "0" - Disable vsync + * "1" - Enable vsync + * + * By default SDL does not sync screen surface updates with vertical refresh. + */ +#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" + /** * \brief An enumeration of hint priorities diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index fa7ab60d2..7a6bf0aa4 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -23,6 +23,7 @@ /* The SDL 2D rendering system */ +#include "SDL_hints.h" #include "SDL_render.h" #include "SDL_sysrender.h" #include "../video/SDL_pixels_c.h" @@ -94,21 +95,32 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) { SDL_Renderer *renderer = NULL; int n = SDL_GetNumRenderDrivers(); + const char *hint; - if (index < 0) { - char *override = SDL_getenv("SDL_VIDEO_RENDERER"); + hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC); + if (hint) { + if (*hint == '0') { + flags &= ~SDL_RENDERER_PRESENTVSYNC; + } else { + flags |= SDL_RENDERER_PRESENTVSYNC; + } + } - if (override) { + if (index < 0) { + hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER); + if (hint) { for (index = 0; index < n; ++index) { const SDL_RenderDriver *driver = render_drivers[index]; - if (SDL_strcasecmp(override, driver->info.name) == 0) { + if (SDL_strcasecmp(hint, driver->info.name) == 0) { /* Create a new renderer instance */ renderer = driver->CreateRenderer(window, flags); break; } } - } else { + } + + if (!renderer) { for (index = 0; index < n; ++index) { const SDL_RenderDriver *driver = render_drivers[index]; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index f34936331..c2ab5a885 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -117,6 +117,14 @@ ShouldUseTextureFramebuffer() return SDL_TRUE; } + /* If the user has specified a software renderer we can't use a + texture framebuffer, or renderer creation will go recursive. + */ + hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER); + if (hint && SDL_strcasecmp(hint, "software") == 0) { + return SDL_FALSE; + } + /* See if the user or application wants a specific behavior */ hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); if (hint) {