* added OpenGL ES support
[LazOpenGLCore.git] / uglcArrayBuffer.pas
index 8a65b62..87814e6 100644 (file)
@@ -82,7 +82,7 @@ unit uglcArrayBuffer;
 interface
 
 uses
-  dglOpenGL, sysutils, uglcTypes;
+  {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils, uglcTypes;
 
 type
   EglcArrayBuffer = class(Exception);
@@ -103,6 +103,7 @@ type
 
     procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
     function MapBuffer(const aAccess: TglcBufferAccess): Pointer;
+    function MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
     procedure UnmapBuffer;
     procedure Bind;
     procedure Unbind;
@@ -133,14 +134,40 @@ begin
   result := nil;
   if (fDataCount * fDataSize) <= 0 then
     exit;
+{$IFNDEF OPENGL_ES}
   result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
+{$ELSE}
+  if not GL_OES_mapbuffer then
+    raise EglcArrayBuffer.Create('map buffer is not supported by video card');
+  result := glMapBufferOES(GLenum(fTarget), GLenum(aAccess));
+{$ENDIF}
   glcCheckAndRaiseError;
 end;
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
+function TglcArrayBuffer.MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
+begin
+  {$IFNDEF OPENGL_ES}
+  if not (GL_ARB_map_buffer_range or GL_VERSION_3_0) then
+    raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
+  result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
+  {$ELSE}
+  if not GL_VERSION_3_0 then
+    raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
+  result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
+  {$ENDIF}
+end;
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
 procedure TglcArrayBuffer.UnmapBuffer;
 begin
+{$IFNDEF OPENGL_ES}
   glUnmapBuffer(GLenum(fTarget));
+{$ELSE}
+  if not (GL_OES_mapbuffer or GL_VERSION_3_0) then
+    raise EglcArrayBuffer.Create('unmap buffer is not supported by video card');
+  glUnmapBuffer(GLenum(fTarget));
+{$ENDIF}
 end;
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
@@ -158,13 +185,19 @@ end;
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
 constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
 begin
-  if not GL_ARB_Vertex_Buffer_Object then
+{$IFNDEF OPENGL_ES}
+  if not (GL_ARB_Vertex_Buffer_Object or GL_VERSION_2_0) then
+    raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
+{$ELSE}
+  if not GL_VERSION_2_0 then
     raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
+{$ENDIF}
   inherited Create;
   glGenBuffers(1, @fID);
   fDataCount   := 0;
   fDataSize    := 0;
   fTarget      := aTarget;
+  glcCheckAndRaiseError;
 end;
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]