gl::Error StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) { unsigned int curBufferSize = getBufferSize(); unsigned int writePos = getWritePosition(); if (size > curBufferSize) { gl::Error error = setBufferSize(std::max(size, 2 * curBufferSize), indexType); if (error.isError()) { return error; } setWritePosition(0); } else if (writePos + size > curBufferSize || writePos + size < writePos) { gl::Error error = discard(); if (error.isError()) { return error; } setWritePosition(0); } return gl::Error(GL_NO_ERROR); }
bool UserFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(seekable()); // Seek within m_buffer if we can, otherwise kill it and call user stream_seek / stream_tell if (whence == SEEK_CUR && 0 <= getReadPosition() + offset && getReadPosition() + offset < getWritePosition()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } else if (whence == SEEK_SET && 0 <= offset - getPosition() + getReadPosition() && offset - getPosition() + getReadPosition() < getWritePosition()) { setReadPosition(offset - getPosition() + getReadPosition()); setPosition(offset); return true; } else { if (whence == SEEK_CUR) { offset += getReadPosition() - getWritePosition(); } setReadPosition(0); setWritePosition(0); } // bool stream_seek($offset, $whence) bool invoked = false; bool sought = invoke( m_StreamSeek, s_stream_seek, make_packed_array(offset, whence), invoked ).toBoolean(); if (!invoked) { always_assert("No seek method? But I found one earlier?"); } if (!sought) { return false; } // int stream_tell() Variant ret = invoke(m_StreamTell, s_stream_tell, Array::Create(), invoked); if (!invoked) { raise_warning("%s::stream_tell is not implemented!", m_cls->name()->data()); return false; } setPosition(ret.isInteger() ? ret.toInt64() : -1); return true; }
angle::Result StreamingIndexBufferInterface::reserveBufferSpace(const gl::Context *context, unsigned int size, gl::DrawElementsType indexType) { unsigned int curBufferSize = getBufferSize(); unsigned int writePos = getWritePosition(); if (size > curBufferSize) { ANGLE_TRY(setBufferSize(context, std::max(size, 2 * curBufferSize), indexType)); setWritePosition(0); } else if (writePos + size > curBufferSize || writePos + size < writePos) { ANGLE_TRY(discard(context)); setWritePosition(0); } return angle::Result::Continue; }
bool StreamingVertexBufferInterface::reserveSpace(unsigned int size) { bool result = true; unsigned int curBufferSize = getBufferSize(); if (size > curBufferSize) { result = setBufferSize(std::max(size, 3 * curBufferSize / 2)); setWritePosition(0); } else if (getWritePosition() + size > curBufferSize) { if (!discard()) { return false; } setWritePosition(0); } return result; }
bool StreamingIndexBufferInterface::reserveBufferSpace(unsigned int size, GLenum indexType) { bool result = true; unsigned int curBufferSize = getBufferSize(); unsigned int writePos = getWritePosition(); if (size > curBufferSize) { result = setBufferSize(std::max(size, 2 * curBufferSize), indexType); setWritePosition(0); } else if (writePos + size > curBufferSize || writePos + size < writePos) { if (!discard()) { return false; } setWritePosition(0); } return result; }
gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size) { unsigned int curBufferSize = getBufferSize(); if (size > curBufferSize) { gl::Error error = setBufferSize(std::max(size, 3 * curBufferSize / 2)); if (error.isError()) { return error; } setWritePosition(0); } else if (getWritePosition() + size > curBufferSize) { gl::Error error = discard(); if (error.isError()) { return error; } setWritePosition(0); } return gl::Error(GL_NO_ERROR); }
int StaticVertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances) { int attributeOffset = attrib.mOffset % attrib.stride(); VertexElement element = { attrib.mType, attrib.mSize, attrib.stride(), attrib.mNormalized, attributeOffset, getWritePosition() }; mCache.push_back(element); return VertexBufferInterface::storeVertexAttributes(attrib, start, count, instances); }