/* SDL internal variables */
#if defined(TARGET_SDL2)
+#define USE_TARGET_TEXTURE TRUE
+#define USE_TARGET_TEXTURE_ONLY FALSE
+
static SDL_Window *sdl_window = NULL;
static SDL_Renderer *sdl_renderer = NULL;
+#if USE_TARGET_TEXTURE
+static SDL_Texture *sdl_texture_stream = NULL;
+static SDL_Texture *sdl_texture_target = NULL;
+#else
static SDL_Texture *sdl_texture = NULL;
+#endif
static boolean fullscreen_enabled = FALSE;
-
-#define USE_RENDERER TRUE
#endif
/* stuff needed to work around SDL/Windows fullscreen drawing bug */
}
#endif
+#if USE_TARGET_TEXTURE
+#if USE_TARGET_TEXTURE_ONLY
+ SDL_Texture *sdl_texture = sdl_texture_target;
+#else
+ SDL_Texture *sdl_texture = sdl_texture_stream;
+#endif
+#endif
+
#if defined(TARGET_SDL2)
-#if USE_RENDERER
if (rect)
{
int bytes_x = screen->pitch / video.width;
// clear render target buffer
SDL_RenderClear(sdl_renderer);
+#if USE_TARGET_TEXTURE
+ SDL_SetRenderTarget(sdl_renderer, sdl_texture_target);
+
+ // copy backbuffer to render target buffer
+ if (sdl_texture != sdl_texture_target)
+ SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
+#else
// copy backbuffer to render target buffer
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
+#endif
#if !USE_FINAL_SCREEN_BITMAP
// copy global animations to render target buffer, if defined (below border)
gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_2);
#endif
+#if USE_TARGET_TEXTURE
+ SDL_SetRenderTarget(sdl_renderer, NULL);
+ SDL_RenderCopy(sdl_renderer, sdl_texture_target, NULL, NULL);
+#endif
+
// show render target buffer on screen
SDL_RenderPresent(sdl_renderer);
-#else
-
- if (rect)
- SDL_UpdateWindowSurfaceRects(sdl_window, rect, 1);
- else
- SDL_UpdateWindowSurface(sdl_window);
-#endif
-
#else // TARGET_SDL
if (rect)
SDL_UpdateRects(screen, 1, rect);
// store if initial screen mode is fullscreen mode when changing screen size
video.fullscreen_initial = fullscreen;
-#if USE_RENDERER
float window_scaling_factor = (float)setup.window_scaling_percent / 100;
#if !USE_DESKTOP_FULLSCREEN
float screen_scaling_factor = (fullscreen ? 1 : window_scaling_factor);
(*backbuffer)->surface = NULL;
}
+#if USE_TARGET_TEXTURE
+ if (sdl_texture_stream)
+ {
+ SDL_DestroyTexture(sdl_texture_stream);
+ sdl_texture_stream = NULL;
+ }
+
+ if (sdl_texture_target)
+ {
+ SDL_DestroyTexture(sdl_texture_target);
+ sdl_texture_target = NULL;
+ }
+#else
if (sdl_texture)
{
SDL_DestroyTexture(sdl_texture);
sdl_texture = NULL;
}
+#endif
if (!(fullscreen && fullscreen_enabled))
{
// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, setup.window_scaling_quality);
+#if USE_TARGET_TEXTURE
+ sdl_texture_stream = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STREAMING,
+ width, height);
+
+ sdl_texture_target = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_TARGET,
+ width, height);
+#else
sdl_texture = SDL_CreateTexture(sdl_renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
width, height);
+#endif
+#if USE_TARGET_TEXTURE
+ if (sdl_texture_stream != NULL &&
+ sdl_texture_target != NULL)
+#else
if (sdl_texture != NULL)
+#endif
{
// use SDL default values for RGB masks and no alpha channel
new_surface = SDL_CreateRGBSurface(0, width, height, 32, 0,0,0, 0);
Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError());
}
-#else
-
- if (sdl_window)
- SDL_DestroyWindow(sdl_window);
-
- sdl_window = SDL_CreateWindow(program.window_title,
- SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED,
- width, height,
- surface_flags);
-
- if (sdl_window != NULL)
- new_surface = SDL_GetWindowSurface(sdl_window);
-#endif
-
#else
new_surface = SDL_SetVideoMode(width, height, video.depth, surface_flags);
#endif
void SDLSetWindowScalingQuality(char *window_scaling_quality)
{
+#if USE_TARGET_TEXTURE
+ SDL_Texture *new_texture;
+
+ if (sdl_texture_stream == NULL ||
+ sdl_texture_target == NULL)
+ return;
+
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, window_scaling_quality);
+
+ new_texture = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STREAMING,
+ video.width, video.height);
+
+ if (new_texture != NULL)
+ {
+ SDL_DestroyTexture(sdl_texture_stream);
+
+ sdl_texture_stream = new_texture;
+ }
+
+ new_texture = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_TARGET,
+ video.width, video.height);
+
+ if (new_texture != NULL)
+ {
+ SDL_DestroyTexture(sdl_texture_target);
+
+ sdl_texture_target = new_texture;
+ }
+
+ SDLRedrawWindow();
+
+#else
if (sdl_texture == NULL)
return;
SDLRedrawWindow();
}
+#endif
video.window_scaling_quality = window_scaling_quality;
}
int dst_x, int dst_y, int mask_mode)
{
#if defined(TARGET_SDL2)
-#if USE_RENDERER
SDL_Texture *texture;
SDL_Rect src_rect;
SDL_Rect dst_rect;
SDL_RenderCopy(sdl_renderer, texture, &src_rect, &dst_rect);
#endif
-#endif
}
void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height,
{
SDL_BlitSurface(surface_cross, &src_rect, surface_source, &src_rect);
SDL_BlitSurface(surface_screen, &dst_rect, surface_target, &src_rect);
+
+ draw_global_border_function(DRAW_BORDER_TO_FADE_SOURCE);
+ draw_global_border_function(DRAW_BORDER_TO_FADE_TARGET);
}
else if (fade_mode & FADE_TYPE_FADE_IN)
{
SDL_BlitSurface(surface_black, &src_rect, surface_source, &src_rect);
SDL_BlitSurface(surface_screen, &dst_rect, surface_target, &src_rect);
+
+ draw_global_border_function(DRAW_BORDER_TO_FADE_TARGET);
}
else /* FADE_TYPE_FADE_OUT */
{
SDL_BlitSurface(surface_screen, &dst_rect, surface_source, &src_rect);
SDL_BlitSurface(surface_black, &src_rect, surface_target, &src_rect);
+
+ draw_global_border_function(DRAW_BORDER_TO_FADE_SOURCE);
}
time_current = SDL_GetTicks();