mirror of
https://github.com/encounter/SDL.git
synced 2025-05-30 19:21:22 +00:00
Added support for SDL_RENDERER_PRESENTVSYNC to the software renderer
This fixes https://github.com/libsdl-org/SDL/issues/4612
This commit is contained in:
parent
ea9bece5ed
commit
fcfd19db86
@ -833,7 +833,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
|
|||||||
goto error;
|
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)) {
|
if (SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE)) {
|
||||||
flags |= SDL_RENDERER_PRESENTVSYNC;
|
flags |= SDL_RENDERER_PRESENTVSYNC;
|
||||||
} else {
|
} else {
|
||||||
|
@ -859,9 +859,22 @@ SW_CreateRendererForSurface(SDL_Surface * surface)
|
|||||||
static SDL_Renderer *
|
static SDL_Renderer *
|
||||||
SW_CreateRenderer(SDL_Window * window, Uint32 flags)
|
SW_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
{
|
{
|
||||||
|
const char *hint;
|
||||||
SDL_Surface *surface;
|
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);
|
surface = SDL_GetWindowSurface(window);
|
||||||
|
|
||||||
|
/* Reset the vsync hint if we set it above */
|
||||||
|
if (!hint || !*hint) {
|
||||||
|
SDL_SetHint(SDL_HINT_RENDER_VSYNC, "");
|
||||||
|
}
|
||||||
|
|
||||||
if (!surface) {
|
if (!surface) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -872,7 +885,7 @@ SDL_RenderDriver SW_RenderDriver = {
|
|||||||
SW_CreateRenderer,
|
SW_CreateRenderer,
|
||||||
{
|
{
|
||||||
"software",
|
"software",
|
||||||
SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE,
|
SDL_RENDERER_SOFTWARE | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,
|
||||||
8,
|
8,
|
||||||
{
|
{
|
||||||
SDL_PIXELFORMAT_ARGB8888,
|
SDL_PIXELFORMAT_ARGB8888,
|
||||||
|
@ -172,53 +172,9 @@ typedef struct {
|
|||||||
int bytes_per_pixel;
|
int bytes_per_pixel;
|
||||||
} SDL_WindowTextureData;
|
} SDL_WindowTextureData;
|
||||||
|
|
||||||
static SDL_bool
|
|
||||||
ShouldUseTextureFramebuffer()
|
|
||||||
{
|
|
||||||
const char *hint;
|
|
||||||
|
|
||||||
/* If there's no native framebuffer support then there's no option */
|
|
||||||
if (!_this->CreateWindowFramebuffer) {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If this is the dummy driver there is no texture support */
|
|
||||||
if (_this->is_dummy) {
|
|
||||||
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) {
|
|
||||||
if (*hint == '0' || SDL_strcasecmp(hint, "false") == 0) {
|
|
||||||
return SDL_FALSE;
|
|
||||||
} else {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Each platform has different performance characteristics */
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
/* GDI BitBlt() is way faster than Direct3D dynamic textures right now.
|
|
||||||
*/
|
|
||||||
return SDL_FALSE;
|
|
||||||
|
|
||||||
#elif defined(__MACOSX__)
|
|
||||||
/* Mac OS X uses OpenGL as the native fast path (for cocoa and X11) */
|
|
||||||
return SDL_TRUE;
|
|
||||||
|
|
||||||
#elif defined(__LINUX__)
|
|
||||||
/* Properly configured OpenGL drivers are faster than MIT-SHM */
|
|
||||||
#if SDL_VIDEO_OPENGL
|
#if SDL_VIDEO_OPENGL
|
||||||
/* Ugh, find a way to cache this value! */
|
static SDL_bool
|
||||||
|
HasAcceleratedOpenGL()
|
||||||
{
|
{
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
SDL_GLContext context;
|
SDL_GLContext context;
|
||||||
@ -247,6 +203,50 @@ ShouldUseTextureFramebuffer()
|
|||||||
}
|
}
|
||||||
return hasAcceleratedOpenGL;
|
return hasAcceleratedOpenGL;
|
||||||
}
|
}
|
||||||
|
#endif /* SDL_VIDEO_OPENGL */
|
||||||
|
|
||||||
|
static SDL_bool
|
||||||
|
ShouldUseTextureFramebuffer()
|
||||||
|
{
|
||||||
|
const char *hint;
|
||||||
|
|
||||||
|
/* If there's no native framebuffer support then there's no option */
|
||||||
|
if (!_this->CreateWindowFramebuffer) {
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If this is the dummy driver there is no texture support */
|
||||||
|
if (_this->is_dummy) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See if the user or application wants a specific behavior */
|
||||||
|
hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION);
|
||||||
|
if (hint) {
|
||||||
|
if (*hint == '0' || SDL_strcasecmp(hint, "false") == 0) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
} else {
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Each platform has different performance characteristics */
|
||||||
|
#if defined(__WIN32__)
|
||||||
|
/* GDI BitBlt() is way faster than Direct3D dynamic textures right now.
|
||||||
|
*/
|
||||||
|
return SDL_FALSE;
|
||||||
|
|
||||||
|
#elif defined(__MACOSX__)
|
||||||
|
/* Mac OS X uses OpenGL as the native fast path (for cocoa and X11) */
|
||||||
|
return SDL_TRUE;
|
||||||
|
|
||||||
|
#elif defined(__LINUX__)
|
||||||
|
/* Properly configured OpenGL drivers are faster than MIT-SHM */
|
||||||
|
#if SDL_VIDEO_OPENGL
|
||||||
|
{
|
||||||
|
static SDL_bool hasAcceleratedOpenGL = HasAcceleratedOpenGL();
|
||||||
|
return hasAcceleratedOpenGL;
|
||||||
|
}
|
||||||
#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
|
#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
|
||||||
/* Let's be optimistic about this! */
|
/* Let's be optimistic about this! */
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user