2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#include "GpuDevice.h"
24
#include "GLDeviceObjects.h"
25
#include "IOpenGLVertexBuffer.h"
30
NUX_IMPLEMENT_OBJECT_TYPE (IOpenGLVertexBuffer);
32
IOpenGLVertexBuffer::IOpenGLVertexBuffer (t_u32 Length, VBO_USAGE Usage, NUX_FILE_LINE_DECL)
33
: IOpenGLResource (RTVERTEXBUFFER, NUX_FILE_LINE_PARAM)
40
CHECKGL ( glGenBuffersARB (1, &_OpenGLID) );
41
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, _OpenGLID) );
42
CHECKGL ( glBufferDataARB (GL_ARRAY_BUFFER_ARB, _Length, NULL, Usage) );
43
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) );
44
GRunTimeStats.Register (this);
47
IOpenGLVertexBuffer::~IOpenGLVertexBuffer()
49
CHECKGL ( glDeleteBuffersARB (1, &_OpenGLID) );
51
GRunTimeStats.UnRegister (this);
54
int IOpenGLVertexBuffer::Lock (
59
nuxAssert (SizeToLock <= _Length);
60
nuxAssert (OffsetToLock + SizeToLock <= _Length);
64
if (OffsetToLock == 0)
66
// lock the entire buffer
71
nuxDebugMsg (TEXT ("[IOpenGLVertexBuffer::Lock] Invalid parameters.") );
72
return OGL_INVALID_CALL;
76
// If _MemMap, _OffsetToLock and _SizeToLock are not equal to zero, then we have already mapped the buffer
77
// Unlock it before locking again.
78
nuxAssert (_MemMap == 0);
79
nuxAssert (_OffsetToLock == 0);
80
nuxAssert (_SizeToLock == 0);
82
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, _OpenGLID) );
83
// Map the Entire buffer into system memory
84
_MemMap = (BYTE *) glMapBufferARB (GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
85
CHECKGL_MSG (glMapBufferARB);
86
*ppbData = (void *) (_MemMap + OffsetToLock);
88
_OffsetToLock = OffsetToLock;
89
_SizeToLock = SizeToLock;
91
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) );
96
int IOpenGLVertexBuffer::Unlock()
98
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, _OpenGLID) );
99
//CHECKGL( glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, _OffsetToLock, _SizeToLock, _MemMap) );
101
CHECKGL ( glUnmapBufferARB (GL_ARRAY_BUFFER_ARB) );
102
CHECKGL ( glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) );
110
void IOpenGLVertexBuffer::BindVertexBuffer()
112
CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, _OpenGLID) );
115
t_u32 IOpenGLVertexBuffer::GetSize()