Added support for SDL_RENDERER_PRESENTVSYNC to the software renderer This fixes https://github.com/libsdl-org/SDL/issues/4612
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 75adfab..25be260 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -833,7 +833,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
goto error;
}
- if (SDL_GetHint(SDL_HINT_RENDER_VSYNC)) {
+ hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
+ if (hint && *hint) {
if (SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE)) {
flags |= SDL_RENDERER_PRESENTVSYNC;
} else {
diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c
index 35f70d3..518308c 100644
--- a/src/render/software/SDL_render_sw.c
+++ b/src/render/software/SDL_render_sw.c
@@ -859,9 +859,22 @@ SW_CreateRendererForSurface(SDL_Surface * surface)
static SDL_Renderer *
SW_CreateRenderer(SDL_Window * window, Uint32 flags)
{
+ const char *hint;
SDL_Surface *surface;
+ /* Set the vsync hint based on our flags, if it's not already set */
+ hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
+ if (!hint || !*hint) {
+ SDL_SetHint(SDL_HINT_RENDER_VSYNC, (flags & SDL_RENDERER_PRESENTVSYNC) ? "1" : "0");
+ }
+
surface = SDL_GetWindowSurface(window);
+
+ /* Reset the vsync hint if we set it above */
+ if (!hint || !*hint) {
+ SDL_SetHint(SDL_HINT_RENDER_VSYNC, "");
+ }
+
if (!surface) {
return NULL;
}
@@ -872,7 +885,7 @@ SDL_RenderDriver SW_RenderDriver = {
SW_CreateRenderer,
{
"software",
- SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE,
+ SDL_RENDERER_SOFTWARE | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,
8,
{
SDL_PIXELFORMAT_ARGB8888,
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 057dce0..1994c56 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -172,6 +172,39 @@ typedef struct {
int bytes_per_pixel;
} SDL_WindowTextureData;
+#if SDL_VIDEO_OPENGL
+static SDL_bool
+HasAcceleratedOpenGL()
+{
+ SDL_Window *window;
+ SDL_GLContext context;
+ SDL_bool hasAcceleratedOpenGL = SDL_FALSE;
+
+ window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN);
+ if (window) {
+ context = SDL_GL_CreateContext(window);
+ if (context) {
+ const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
+ const char *vendor = NULL;
+
+ glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
+ if (glGetStringFunc) {
+ vendor = (const char *) glGetStringFunc(GL_VENDOR);
+ }
+ /* Add more vendors here at will... */
+ if (vendor &&
+ (SDL_strstr(vendor, "ATI Technologies") ||
+ SDL_strstr(vendor, "NVIDIA"))) {
+ hasAcceleratedOpenGL = SDL_TRUE;
+ }
+ SDL_GL_DeleteContext(context);
+ }
+ SDL_DestroyWindow(window);
+ }
+ return hasAcceleratedOpenGL;
+}
+#endif /* SDL_VIDEO_OPENGL */
+
static SDL_bool
ShouldUseTextureFramebuffer()
{
@@ -187,14 +220,6 @@ ShouldUseTextureFramebuffer()
return SDL_FALSE;
}
- /* 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) {
@@ -218,33 +243,8 @@ ShouldUseTextureFramebuffer()
#elif defined(__LINUX__)
/* Properly configured OpenGL drivers are faster than MIT-SHM */
#if SDL_VIDEO_OPENGL
- /* Ugh, find a way to cache this value! */
{
- SDL_Window *window;
- SDL_GLContext context;
- SDL_bool hasAcceleratedOpenGL = SDL_FALSE;
-
- window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN);
- if (window) {
- context = SDL_GL_CreateContext(window);
- if (context) {
- const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
- const char *vendor = NULL;
-
- glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
- if (glGetStringFunc) {
- vendor = (const char *) glGetStringFunc(GL_VENDOR);
- }
- /* Add more vendors here at will... */
- if (vendor &&
- (SDL_strstr(vendor, "ATI Technologies") ||
- SDL_strstr(vendor, "NVIDIA"))) {
- hasAcceleratedOpenGL = SDL_TRUE;
- }
- SDL_GL_DeleteContext(context);
- }
- SDL_DestroyWindow(window);
- }
+ static SDL_bool hasAcceleratedOpenGL = HasAcceleratedOpenGL();
return hasAcceleratedOpenGL;
}
#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2