def read(self, size=-1, offset=0) -> bytes: """Read data from the buffer. :param int size: The bytes to read. -1 means the entire buffer (default) :param int offset: Byte read offset :rtype: bytes """ if size == -1: size = self._size # Catch this before confusing INVALID_OPERATION is raised if size < 1: raise ValueError("Attempting to read 0 or less bytes from buffer") # Manually detect this so it doesn't raise a confusing INVALID_VALUE error if size + offset > self._size: raise ValueError( ( "Attempting to read outside the buffer. " f"Buffer size: {self._size} " f"Reading from {offset} to {size + offset}" ) ) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._glo) ptr = gl.glMapBufferRange(gl.GL_ARRAY_BUFFER, offset, size, gl.GL_MAP_READ_BIT) data = string_at(ptr, size=size) gl.glUnmapBuffer(gl.GL_ARRAY_BUFFER) return data
def _read(self, size): """ Debug method to read data from the buffer. """ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.buffer_id) ptr = gl.glMapBufferRange(gl.GL_ARRAY_BUFFER, gl.GLintptr(0), size, gl.GL_MAP_READ_BIT) print(f"Reading back from buffer:\n{string_at(ptr, size=size)}") gl.glUnmapBuffer(gl.GL_ARRAY_BUFFER)
def unmap(self): """ Unmap the buffer. Will raise a BufferError if the buffer is not mapped. """ if self.mapped != GL_TRUE: raise BufferError("Buffer is not mapped") glUnmapBuffer(self.mapinfo.target) self.mapinfo = None