X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fsdl2%2Fg_system.pas;h=29a81b01e0a38102289a515cf5500aa2156530ef;hb=7cd25bdadc9813ee693a5b4cabb87bbe3348b707;hp=bfb76fb5bae1f5a69f01ff3f575ade72c80c2810;hpb=5301ecea6db1b7e6e3de991b8a8d420e53ee220f;p=d2df-sdl.git diff --git a/src/game/sdl2/g_system.pas b/src/game/sdl2/g_system.pas index bfb76fb..29a81b0 100644 --- a/src/game/sdl2/g_system.pas +++ b/src/game/sdl2/g_system.pas @@ -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); @@ -177,8 +191,12 @@ implementation end else begin + if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0; + SDL_SetWindowFullscreen(window, flags); SDL_SetWindowSize(window, w, h); - if wc then + if maximized then SDL_MaximizeWindow(window); + // always reset to center when changing fullscreen->windowed for safety purposes + if wc or (gFullscreen and not fullscreen) or (gWinMaximized and not maximized) then begin x := SDL_WINDOWPOS_CENTERED; y := SDL_WINDOWPOS_CENTERED @@ -194,10 +212,6 @@ implementation SDL_GetWindowPosition(window, @x, @y); wx := x; wy := y end; - if maximized then - SDL_MaximizeWindow(window); - if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0; - SDL_SetWindowFullscreen(window, flags); gFullScreen := fullscreen; gWinMaximized := maximized; gRC_FullScreen := fullscreen; @@ -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;