removed support for non-renderer graphics for SDL2 target
[rocksndiamonds.git] / src / libgame / sdl.c
index 2e03378df85eb285caff378748294fed1ba59d41..39920c8350fc739fb2a6a473348512ffce4209ff 100644 (file)
 
 /* 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 */
@@ -108,8 +114,15 @@ static void UpdateScreen(SDL_Rect *rect)
   }
 #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;
@@ -130,8 +143,16 @@ static void UpdateScreen(SDL_Rect *rect)
   // 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)
@@ -147,17 +168,14 @@ static void UpdateScreen(SDL_Rect *rect)
     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);
@@ -633,7 +651,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
   // 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);
@@ -648,11 +665,25 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
     (*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))
   {
@@ -702,12 +733,29 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
       // 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);
@@ -731,21 +779,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
     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
@@ -901,6 +934,42 @@ void SDLSetWindowScaling(int window_scaling_percent)
 
 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;
 
@@ -919,6 +988,7 @@ void SDLSetWindowScalingQuality(char *window_scaling_quality)
 
     SDLRedrawWindow();
   }
+#endif
 
   video.window_scaling_quality = window_scaling_quality;
 }
@@ -1045,7 +1115,6 @@ void SDLBlitTexture(Bitmap *bitmap,
                    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;
@@ -1068,7 +1137,6 @@ void SDLBlitTexture(Bitmap *bitmap,
 
   SDL_RenderCopy(sdl_renderer, texture, &src_rect, &dst_rect);
 #endif
-#endif
 }
 
 void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height,