Code: Select all
void* GL3PlusHardwareUniformBuffer::lockImpl(size_t offset,
size_t length,
LockOptions options)
{
if (mIsLocked)
{
OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR,
"Invalid attempt to lock a uniform buffer that has already been locked",
"GL3PlusHardwareUniformBuffer::lock");
}
GLenum access = 0;
void* retPtr = 0;
// Use glMapBuffer
OGRE_CHECK_GL_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, mBufferId));
if (mUsage & HBU_WRITE_ONLY)
{
access |= GL_MAP_WRITE_BIT;
access |= GL_MAP_FLUSH_EXPLICIT_BIT;
if(options == HBL_DISCARD)
{
// Discard the buffer
access |= GL_MAP_INVALIDATE_RANGE_BIT;
}
}
else if (options == HBL_READ_ONLY)
access |= GL_MAP_READ_BIT;
else
access |= GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
access |= GL_MAP_UNSYNCHRONIZED_BIT;
void* pBuffer;
OGRE_CHECK_GL_ERROR(pBuffer = glMapBufferRange(GL_UNIFORM_BUFFER, offset, length, access));
if(pBuffer == 0)
{
OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR,
"Uniform Buffer: Out of memory",
"GL3PlusHardwareUniformBuffer::lock");
}
// return offsetted
retPtr = static_cast<void*>(static_cast<unsigned char*>(pBuffer) + offset);
mIsLocked = true;
return retPtr;
}
It happens in all subclass of HardwareBuffer in gl3plus.