DEADSOFTWARE

render: disable FBO on devices which not support NPOT textures
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 27 Jan 2022 20:04:18 +0000 (23:04 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 9 Jun 2023 07:57:34 +0000 (10:57 +0300)
src/game/opengl/r_render.pas
src/game/opengl/r_window.pas

index 2e356dd1b68d4e3ab8ffce0c8cb976a501c48e47..203c9c2d3038c2359caf6e7d0e8c547772ea6ba7 100644 (file)
@@ -63,24 +63,113 @@ implementation
   var
     LoadedGL: Boolean = false;
 
+  function GLExtensionList (): SSArray;
+    var s: PChar; i, j, num: GLint;
+  begin
+    result := nil;
+    s := glGetString(GL_EXTENSIONS);
+    if s <> nil then
+    begin
+      num := 0;
+      i := 0;
+      j := 0;
+      while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
+      while (s[i] <> #0) do
+      begin
+        while (s[i] <> #0) and (s[i] <> ' ') do Inc(i);
+        SetLength(result, num+1);
+        result[num] := Copy(s, j+1, i-j);
+        while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
+        j := i;
+        Inc(num)
+      end
+    end
+  end;
+
+  function GLExtensionSupported (ext: AnsiString): Boolean;
+    var e: AnsiString;
+  begin
+    {$IFDEF NOGL_INIT}
+      Result := nogl_ExtensionSupported(ext);
+    {$ELSE}
+      result := false;
+      for e in GLExtensionList() do
+      begin
+        if strEquCI1251(e, ext) then
+        begin
+          result := true;
+          exit
+        end
+      end
+    {$ENDIF}
+  end;
+
+  function HaveNPOTSupport (): Boolean;
+  begin
+    Result := GLExtensionSupported('GL_ARB_texture_non_power_of_two') or
+              GLExtensionSupported('GL_OES_texture_npot')
+  end;
+
+  function HaveFBOSupport (): Boolean;
+  begin
+    Result := GLExtensionSupported('GL_ARB_framebuffer_object') or
+              GLExtensionSupported('GL_OES_framebuffer_object')
+  end;
+
+  procedure PrintGLSupportedExtensions;
+  begin
+    e_LogWritefln('GL Vendor: %s', [glGetString(GL_VENDOR)]);
+    e_LogWritefln('GL Renderer: %s', [glGetString(GL_RENDERER)]);
+    e_LogWritefln('GL Version: %s', [glGetString(GL_VERSION)]);
+    e_LogWritefln('GL Shaders: %s', [glGetString(GL_SHADING_LANGUAGE_VERSION)]);
+    e_LogWritefln('GL Extensions: %s', [glGetString(GL_EXTENSIONS)]);
+  end;
+
+  procedure r_Window_Initialize;
+  begin
+{$IFNDEF USE_SYSSTUB}
+    PrintGLSupportedExtensions;
+    glLegacyNPOT := not HaveNPOTSupport();
+{$ELSE}
+    glLegacyNPOT := False;
+    glRenderToFBO := False;
+{$ENDIF}
+    if glNPOTOverride and glLegacyNPOT then
+    begin
+      glLegacyNPOT := true;
+      e_logWriteln('NPOT texture emulation: FORCED')
+    end
+    else
+    begin
+      if glLegacyNPOT then
+        e_logWriteln('NPOT texture emulation: enabled')
+      else
+        e_logWriteln('NPOT texture emulation: disabled')
+    end
+  end;
+
   procedure LoadGL;
+    var fboload: Boolean;
   begin
     if LoadedGL = false then
     begin
       {$IFDEF NOGL_INIT}
         nogl_Init;
-        if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
-        begin
-          e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
-          glRenderToFBO := false
-        end;
-      {$ELSE}
-        if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
+      {$ENDIF}
+      if glRenderToFBO then
+      begin
+        fboload := True;
+        {$IFDEF NOGL_INIT}
+          fboload := True; // !!! but if not?
+        {$ELSE}
+          fboload := Load_GL_ARB_framebuffer_object();
+        {$ENDIF}
+        if (fboload = False) or (HaveFBOSupport() = False) or (HaveNPOTSupport() = False) then
         begin
           e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
           glRenderToFBO := false
         end;
-      {$ENDIF}
+      end;
       LoadedGL := true
     end
   end;
index a35aaeff85842493e4df5fe2b7aafda01b8e7cfb..9b7100f4ea05ff642754341043a7cf188f0d8a8d 100644 (file)
@@ -18,7 +18,6 @@ unit r_window;
 interface
 
   procedure r_Window_DrawLoading (forceUpdate: Boolean);
-  procedure r_Window_Initialize;
 
 implementation
 
@@ -68,73 +67,4 @@ implementation
     end;
   end;
 
-  function GLExtensionList (): SSArray;
-    var s: PChar; i, j, num: GLint;
-  begin
-    result := nil;
-    s := glGetString(GL_EXTENSIONS);
-    if s <> nil then
-    begin
-      num := 0;
-      i := 0;
-      j := 0;
-      while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
-      while (s[i] <> #0) do
-      begin
-        while (s[i] <> #0) and (s[i] <> ' ') do Inc(i);
-        SetLength(result, num+1);
-        result[num] := Copy(s, j+1, i-j);
-        while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
-        j := i;
-        Inc(num)
-      end
-    end
-  end;
-
-  function GLExtensionSupported (ext: AnsiString): Boolean;
-    var e: AnsiString;
-  begin
-    result := false;
-    for e in GLExtensionList() do
-    begin
-      if strEquCI1251(e, ext) then
-      begin
-        result := true;
-        exit
-      end
-    end
-  end;
-
-  procedure PrintGLSupportedExtensions;
-  begin
-    e_LogWritefln('GL Vendor: %s', [glGetString(GL_VENDOR)]);
-    e_LogWritefln('GL Renderer: %s', [glGetString(GL_RENDERER)]);
-    e_LogWritefln('GL Version: %s', [glGetString(GL_VERSION)]);
-    e_LogWritefln('GL Shaders: %s', [glGetString(GL_SHADING_LANGUAGE_VERSION)]);
-    e_LogWritefln('GL Extensions: %s', [glGetString(GL_EXTENSIONS)]);
-  end;
-
-  procedure r_Window_Initialize;
-  begin
-{$IFNDEF USE_SYSSTUB}
-    PrintGLSupportedExtensions;
-    glLegacyNPOT := not (GLExtensionSupported('GL_ARB_texture_non_power_of_two') or GLExtensionSupported('GL_OES_texture_npot'));
-{$ELSE}
-    glLegacyNPOT := False;
-    glRenderToFBO := False;
-{$ENDIF}
-    if glNPOTOverride and glLegacyNPOT then
-    begin
-      glLegacyNPOT := true;
-      e_logWriteln('NPOT texture emulation: FORCED')
-    end
-    else
-    begin
-      if glLegacyNPOT then
-        e_logWriteln('NPOT texture emulation: enabled')
-      else
-        e_logWriteln('NPOT texture emulation: disabled')
-    end
-  end;
-
 end.