void* GLES2HardwareIndexBuffer::lockImpl(size_t offset, size_t length, LockOptions options) { if(mIsLocked) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Invalid attempt to lock an index buffer that has already been locked", "GLES2HardwareIndexBuffer::lock"); } GLenum access = 0; static_cast<GLES2HardwareBufferManagerBase*>(mMgr)->getStateCacheManager()->bindGLBuffer(GL_ELEMENT_ARRAY_BUFFER, mBufferId); void* pBuffer; #if OGRE_NO_GLES3_SUPPORT == 0 || defined(GL_EXT_map_buffer_range) if (mUsage & HBU_WRITE_ONLY) { access = GL_MAP_WRITE_BIT_EXT; access |= GL_MAP_FLUSH_EXPLICIT_BIT_EXT; if(options == HBL_DISCARD || options == HBL_NO_OVERWRITE) { // Discard the buffer access |= GL_MAP_INVALIDATE_RANGE_BIT_EXT; } } else if (options == HBL_READ_ONLY) access = GL_MAP_READ_BIT_EXT; else access = GL_MAP_READ_BIT_EXT | GL_MAP_WRITE_BIT_EXT; OGRE_CHECK_GL_ERROR(pBuffer = glMapBufferRangeEXT(GL_ELEMENT_ARRAY_BUFFER, offset, length, access)); #else // Use glMapBuffer if(options == HBL_DISCARD || options == HBL_NO_OVERWRITE) { // Discard the buffer OGRE_CHECK_GL_ERROR(glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)mSizeInBytes, NULL, GLES2HardwareBufferManager::getGLUsage(mUsage))); } if (mUsage & HBU_WRITE_ONLY) access = GL_WRITE_ONLY_OES; OGRE_CHECK_GL_ERROR(pBuffer = glMapBufferOES(GL_ELEMENT_ARRAY_BUFFER, access)); #endif if(pBuffer == 0) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Index Buffer: Out of memory", "GLES2HardwareIndexBuffer::lock"); } // return offsetted void *retPtr = static_cast<void*>( static_cast<unsigned char*>(pBuffer) + offset); mIsLocked = true; return retPtr; }
void* BufferObj::mapBufferRange( GLintptr offset, GLsizeiptr length, GLbitfield access ) const { ScopedBuffer bufferBind( mTarget, mId ); #if defined( CINDER_GL_ES_2 ) return reinterpret_cast<void*>( glMapBufferRangeEXT( mTarget, offset, length, access ) ); #else return reinterpret_cast<void*>( glMapBufferRange( mTarget, offset, length, access ) ); #endif }
void GLES2HardwareIndexBuffer::readData(size_t offset, size_t length, void* pDest) { if(mUseShadowBuffer) { // Get data from the shadow buffer void* srcData = mShadowBuffer->lock(offset, length, HBL_READ_ONLY); memcpy(pDest, srcData, length); mShadowBuffer->unlock(); } else { if(getGLES2SupportRef()->checkExtension("GL_EXT_map_buffer_range") || gleswIsSupported(3, 0)) { // Map the buffer range then copy out of it into our destination buffer void* srcData; OGRE_CHECK_GL_ERROR(srcData = glMapBufferRangeEXT(GL_ELEMENT_ARRAY_BUFFER, offset, length, GL_MAP_READ_BIT_EXT)); memcpy(pDest, srcData, length); // Unmap the buffer since we are done. GLboolean mapped; OGRE_CHECK_GL_ERROR(mapped = glUnmapBufferOES(GL_ELEMENT_ARRAY_BUFFER)); if(!mapped) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Buffer data corrupted, please reload", "GLES2HardwareIndexBuffer::readData"); } } else { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Reading hardware buffer is not supported", "GLES2HardwareIndexBuffer::readData"); } } }