DEADSOFTWARE

decouple repainting from blitting the FBO; draw touch overlay after FBO
[d2df-sdl.git] / src / engine / e_graphics.pas
index d9761c13e02a1108c460c82896f7c7beca4e6687..5edceb2c5f9d3c754a4d2f2f8e969fcd46410849 100644 (file)
@@ -64,6 +64,7 @@ procedure e_SetViewPort(X, Y, Width, Height: Word);
 procedure e_ResizeWindow(Width, Height: Integer);
 function e_ResizeFramebuffer(Width, Height: Integer): Boolean;
 procedure e_BlitFramebuffer(WinWidth, WinHeight: Integer);
+procedure e_SetRenderTarget(Framebuffer: Boolean);
 
 procedure e_Draw(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean;
                  Blending: Boolean; Mirror: TMirrorType = TMirrorType.None);
@@ -201,6 +202,7 @@ var
   //e_SavedTextures: array of TSavedTexture;
   e_FBO: GLuint = 0;
   e_RBO: GLuint = 0;
+  e_RBOSupported: Boolean = True;
   e_Frame: GLuint = 0;
   e_FrameW: Integer = -1;
   e_FrameH: Integer = -1;
@@ -440,27 +442,29 @@ begin
 
   glBindFramebuffer(GL_FRAMEBUFFER, e_FBO);
   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, e_Frame, 0);
-
-{$IFNDEF USE_GLES1}
-  glGenRenderbuffers(1, @e_RBO);
-  glBindRenderbuffer(GL_RENDERBUFFER, e_RBO);
-  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Width, Height);
-  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, e_RBO);
   if glCheckFramebufferStatus(GL_FRAMEBUFFER) <> GL_FRAMEBUFFER_COMPLETE then
   begin
-    e_LogWriteln('GL: can''t construct framebuffer with depth+stencil attachment');
-    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
-    glDeleteRenderbuffers(1, @e_RBO); e_RBO := 0;
+    e_LogWriteln('GL: can''t construct framebuffer with color attachment');
+    DestroyFramebuffer;
     Exit;
   end;
-{$ENDIF}
 
-  if glCheckFramebufferStatus(GL_FRAMEBUFFER) <> GL_FRAMEBUFFER_COMPLETE then
+{$IFNDEF USE_GLES1}
+  if e_RBOSupported then
   begin
-    e_LogWriteln('GL: can''t construct framebuffer with color attachment');
-    DestroyFramebuffer;
-    Exit;
+    glGenRenderbuffers(1, @e_RBO);
+    glBindRenderbuffer(GL_RENDERBUFFER, e_RBO);
+    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Width, Height);
+    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, e_RBO);
+    if glCheckFramebufferStatus(GL_FRAMEBUFFER) <> GL_FRAMEBUFFER_COMPLETE then
+    begin
+      e_LogWriteln('GL: can''t construct framebuffer with depth+stencil attachment, trying without');
+      e_RBOSupported := False;
+      Result := e_ResizeFramebuffer(Width, Height);
+      Exit;
+    end;
   end;
+{$ENDIF}
 
   Result := True;
 end;
@@ -487,15 +491,22 @@ begin
   glTexCoord2f(u, v); glVertex2i(x1, y0);
 end;
 
+procedure e_SetRenderTarget(Framebuffer: Boolean);
+begin
+  if (e_FBO = 0) or e_NoGraphics then exit;
+  if Framebuffer then
+    glBindFramebuffer(GL_FRAMEBUFFER, e_FBO)
+  else
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+end;
+
 procedure e_BlitFramebuffer(WinWidth, WinHeight: Integer);
 begin
   if (e_FBO = 0) or (e_Frame = 0) or e_NoGraphics then exit;
 
   glDisable(GL_BLEND);
   glEnable(GL_TEXTURE_2D);
-  glBindFramebuffer(GL_FRAMEBUFFER, 0);
   glBindTexture(GL_TEXTURE_2D, e_Frame);
-  e_SetViewPort(0, 0, WinWidth, WinHeight);
   glColor4ub(255, 255, 255, 255);
 
   glBegin(GL_QUADS);
@@ -504,9 +515,6 @@ begin
     glTexCoord2f(1, 0); glVertex2i(WinWidth, WinHeight);
     glTexCoord2f(1, 1); glVertex2i(WinWidth,         0);
   glEnd();
-
-  glBindFramebuffer(GL_FRAMEBUFFER, e_FBO);
-  e_SetViewPort(0, 0, e_FrameW, e_FrameH);
 end;
 
 procedure e_Draw(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean;