Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
authorSam Lantinga <slouken@libsdl.org>
Sat, 05 Feb 2011 10:35:36 -0800
changeset 5192 ef5a61ea3202
parent 5191 93052810ceb5
child 5193 e96c5be3e0b5
Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
include/SDL_hints.h
src/render/SDL_render.c
src/video/SDL_video.c
--- a/include/SDL_hints.h	Sat Feb 05 10:11:27 2011 -0800
+++ b/include/SDL_hints.h	Sat Feb 05 10:35:36 2011 -0800
@@ -67,6 +67,32 @@
  */
 #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
--- a/src/render/SDL_render.c	Sat Feb 05 10:11:27 2011 -0800
+++ b/src/render/SDL_render.c	Sat Feb 05 10:35:36 2011 -0800
@@ -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_Renderer *renderer = NULL;
     int n = SDL_GetNumRenderDrivers();
+    const char *hint;
+
+    hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
+    if (hint) {
+        if (*hint == '0') {
+            flags &= ~SDL_RENDERER_PRESENTVSYNC;
+        } else {
+            flags |= SDL_RENDERER_PRESENTVSYNC;
+        }
+    }
 
     if (index < 0) {
-        char *override = SDL_getenv("SDL_VIDEO_RENDERER");
-
-        if (override) {
+        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];
 
--- a/src/video/SDL_video.c	Sat Feb 05 10:11:27 2011 -0800
+++ b/src/video/SDL_video.c	Sat Feb 05 10:35:36 2011 -0800
@@ -117,6 +117,14 @@
         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) {