interface
uses
- dglOpenGL, sysutils, uglcTypes;
+ {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils, uglcTypes;
type
EglcArrayBuffer = class(Exception);
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;
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]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[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]