DEADSOFTWARE

properly check for FBO support; add OES_framebuffer_object to noGL
[d2df-sdl.git] / src / game / sdl2 / g_system.pas
index bfb76fb5bae1f5a69f01ff3f575ade72c80c2810..6fff48bf9df526a268efb91334fdc23c31984b08 100644 (file)
@@ -78,10 +78,17 @@ implementation
   begin
     gWinSizeX := w;
     gWinSizeY := h;
-    gScreenWidth := w;
-    gScreenHeight := h;
     gRC_Width := w;
     gRC_Height := h;
+    if glRenderToFBO then
+    begin
+      // store real window size in gWinSize, downscale resolution now
+      w := round(w / r_pixel_scale);
+      h := round(h / r_pixel_scale);
+      e_ResizeFramebuffer(w, h);
+    end;
+    gScreenWidth := w;
+    gScreenHeight := h;
     {$IFDEF ENABLE_HOLMES}
       fuiScrWdt := w;
       fuiScrHgt := h;
@@ -150,8 +157,15 @@ implementation
         if context <> nil then
         begin
           {$IFDEF NOGL_INIT}
-            nogl_Init;
+          nogl_Init;
+          if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
+          {$ELSE}
+          if glRenderToFBO and (not Load_GL_ARB_framebuffer_object()) then
           {$ENDIF}
+          begin
+            e_LogWriteln('SDL: no framebuffer object support detected');
+            glRenderToFBO := False
+          end;
           if (fullscreen = false) and (maximized = false) and (wc = false) then
           begin
             SDL_GetWindowPosition(window, @x, @y);
@@ -209,6 +223,8 @@ implementation
 
   procedure sys_Repaint;
   begin
+    if glRenderToFBO then
+      e_BlitFramebuffer(gWinSizeX, gWinSizeY);
     SDL_GL_SwapWindow(window)
   end;
 
@@ -531,11 +547,15 @@ implementation
         flags := SDL_INIT_TIMER or $00004000;
       {$ENDIF}
     {$ELSE}
-      flags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
+      flags := SDL_INIT_TIMER or SDL_INIT_VIDEO;
     {$ENDIF}
     SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
     if SDL_Init(flags) <> 0 then
       raise Exception.Create('SDL: Init failed: ' + SDL_GetError);
+    {$IFNDEF HEADLESS}
+      if SDL_InitSubSystem(SDL_INIT_JOYSTICK) <> 0 then
+        e_LogWritefln('SDL: Init subsystem failed: %s', [SDL_GetError()]);
+    {$ENDIF}
     SDL_ShowCursor(SDL_DISABLE);
   end;