X-Git-Url: https://git.delphigl.com/?p=LazOpenGLCore.git;a=blobdiff_plain;f=uglcArrayBuffer.pas;fp=uglcArrayBuffer.pas;h=87814e6b94a5de7a6f614a9d69f036cf0050c91a;hp=8a65b6269aa754549756a10876d4b45037a5e11a;hb=38723f45320eea73e5fef416fc989bcfb9adf21d;hpb=eb7858e40852c3a1a61cead35c20f432d062184c diff --git a/uglcArrayBuffer.pas b/uglcArrayBuffer.pas index 8a65b62..87814e6 100644 --- a/uglcArrayBuffer.pas +++ b/uglcArrayBuffer.pas @@ -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]