diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 6acd400e0e..dc856746dc 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -321,10 +321,9 @@ static bool SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, if (!data) { SDL_Renderer *renderer = NULL; const char *render_driver = NULL; - const char *hint; // See if there's a render driver being requested - hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); + const char *hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); if (hint && *hint != '0' && *hint != '1' && SDL_strcasecmp(hint, "true") != 0 && SDL_strcasecmp(hint, "false") != 0 && @@ -333,20 +332,46 @@ static bool SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, } if (!render_driver) { - hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER); - if (hint && *hint && SDL_strcasecmp(hint, SDL_SOFTWARE_RENDERER) != 0) { - render_driver = hint; + render_driver = SDL_GetHint(SDL_HINT_RENDER_DRIVER); + } + + char *render_driver_copy = NULL; + if (render_driver && *render_driver) { + render_driver_copy = SDL_strdup(render_driver); + render_driver = render_driver_copy; + if (render_driver_copy) { // turn any "software" requests into "xxxxxxxx" so we don't end up in infinite recursion. + char *prev = render_driver_copy; + char *ptr = prev; + while ((ptr = SDL_strchr(ptr, ',')) != NULL) { + *ptr = '\0'; + const bool is_sw = (SDL_strcasecmp(prev, SDL_SOFTWARE_RENDERER) == 0); + *ptr = ','; + if (is_sw) { + SDL_memset(prev, 'x', SDL_strlen(SDL_SOFTWARE_RENDERER)); + ptr = prev; + } else { + ptr++; + prev = ptr; + } + } + + if (SDL_strcasecmp(prev, SDL_SOFTWARE_RENDERER) == 0) { + SDL_memset(prev, 'x', SDL_strlen(SDL_SOFTWARE_RENDERER)); + } } } + SDL_Log("render_driver == '%s'", render_driver); // Check to see if there's a specific driver requested if (render_driver) { renderer = SDL_CreateRenderer(window, render_driver); + SDL_free(render_driver_copy); if (!renderer) { // The error for this specific renderer has already been set return false; } } else { + SDL_assert(render_driver_copy == NULL); const int total = SDL_GetNumRenderDrivers(); for (i = 0; i < total; ++i) { const char *name = SDL_GetRenderDriver(i);