diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 75adfab5a..25be260a1 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 35f70d3b3..518308ce7 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 057dce09f..1994c56f5 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