* added OpenGL ES support
[LazOpenGLCore.git] / uglcFrameBufferObject.pas
index b08fba3..a0d75e0 100644 (file)
@@ -39,7 +39,7 @@ unit uglcFrameBufferObject;
 interface
 
 uses
-  Classes, SysUtils, fgl, dglOpenGl, uglcTypes;
+  Classes, SysUtils, fgl, {$IFNDEF OPENGL_ES}dglOpenGl{$ELSE}dglOpenGLES{$ENDIF}, uglcTypes;
 
 type
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -126,6 +126,9 @@ type
     fWidth: Integer;
     fHeight: Integer;
     fBuffers: TglcAttachmentContainerList;
+{$IFDEF OPENGL_ES}
+    fOldViewport: array[0..3] of GLint;
+{$ENDIF}
 
     function GetBuffer(const aIndex: Integer): TglcBuffer;
     procedure SetBuffer(const aIndex: Integer; const aValue: TglcBuffer);
@@ -322,8 +325,8 @@ begin
 
   glGenTextures(1, @fID);
   Bind(false);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, {$IFNDEF OPENGL_ES}GL_CLAMP{$ELSE}GL_CLAMP_TO_EDGE{$ENDIF});
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, {$IFNDEF OPENGL_ES}GL_CLAMP{$ELSE}GL_CLAMP_TO_EDGE{$ENDIF});
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   Unbind(false);
@@ -466,6 +469,7 @@ begin
       raise EglcFrameBufferObject.Create('Incomplete attachment');
     GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
       raise EglcFrameBufferObject.Create('Missing attachment');
+{$IFNDEF OPENGL_ES}
     GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
       raise EglcFrameBufferObject.Create('Incomplete dimensions');
     GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
@@ -474,6 +478,7 @@ begin
       raise EglcFrameBufferObject.Create('Incomplete draw buffer');
     GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
       raise EglcFrameBufferObject.Create('Incomplete read buffer');
+{$ENDIF}
     GL_FRAMEBUFFER_UNSUPPORTED:
       raise EglcFrameBufferObject.Create('Framebufferobjects unsupported');
   end;
@@ -490,7 +495,9 @@ procedure TglcFrameBufferObject.UpdateAndCheckFBO;
 
 var
   buff: array of GLenum;
+{$IFNDEF OPENGL_ES}
   b: GLboolean;
+{$ENDIF}
   i: Integer;
 begin
   if (fBuffers.Count = 0) then
@@ -508,14 +515,24 @@ begin
   //set Read and Draw Buffer
   if (Length(buff) = 0) then begin
     glReadBuffer(GL_NONE);
+{$IFNDEF OPENGL_ES}
     glDrawBuffer(GL_NONE);
+{$ELSE}
+    SetLength(buff, 1);
+    buff[0] := GL_NONE;
+    glDrawBuffers(1, @buff[0]);
+{$ENDIF}
   end else begin
     glDrawBuffers(Length(buff), @buff[0]);
+{$IFNDEF OPENGL_ES}
     glGetBooleanv(GL_DOUBLEBUFFER, @b);
     if b then
       glReadBuffer(GL_BACK)
     else
       glReadBuffer(GL_FRONT);
+{$ELSE}
+    glReadBuffer(GL_FRONT);
+{$ENDIF}
   end;
   Unbind(false);
 end;
@@ -612,7 +629,11 @@ procedure TglcFrameBufferObject.Bind(const aSetViewport: Boolean = true);
 begin
   glBindFramebuffer(GL_FRAMEBUFFER, fID);
   if aSetViewport then begin
+{$IFNDEF OPENGL_ES}
     glPushAttrib(GL_VIEWPORT_BIT);
+{$ELSE}
+    glGetIntegerv(GL_VIEWPORT, @fOldViewport[0]);
+{$ENDIF}
     glViewPort(0, 0, fWidth, fHeight);
   end;
 end;
@@ -622,7 +643,11 @@ end;
 procedure TglcFrameBufferObject.Unbind(const aResetViewport: Boolean = true);
 begin
   if aResetViewport then
+{$IFNDEF OPENGL_ES}
     glPopAttrib;
+{$ELSE}
+    glViewport(fOldViewport[0], fOldViewport[1], fOldViewport[2], fOldViewport[3]);
+{$ENDIF}
   glBindFramebuffer(GL_FRAMEBUFFER, 0);
 end;