From 36432c8616e5e8e3b15be5c03eca2c5deea33a70 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 22 Aug 2017 12:51:30 +0530 Subject: [PATCH] API to conveniently download data from a vertex buffer --- kitty/shaders.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/kitty/shaders.py b/kitty/shaders.py index e681b23e5..1b2950a65 100644 --- a/kitty/shaders.py +++ b/kitty/shaders.py @@ -52,12 +52,14 @@ class BufferManager: # {{{ def __init__(self): self.sizes = {} self.types = {} + self.ctypes_types = {} self.name_count = 0 def create(self, for_use=GL_TEXTURE_BUFFER): buf_id = glGenBuffers(1) self.types[buf_id] = for_use self.sizes.pop(buf_id, None) + self.ctypes_types.pop(buf_id, None) return buf_id def delete(self, buf_id): @@ -65,18 +67,24 @@ class BufferManager: # {{{ glDeleteBuffer(buf_id) self.sizes.pop(buf_id, None) self.types.pop(buf_id) + self.ctypes_types.pop(buf_id, None) def set_data(self, buf_id, data, usage=GL_STREAM_DRAW, verify=False): prev_sz = self.sizes.get(buf_id, 0) new_sz = sizeof(data) replace_or_create_buffer(buf_id, new_sz, prev_sz, addressof(data), usage, self.types[buf_id]) self.sizes[buf_id] = new_sz + self.ctypes_types[buf_id] = type(data) if verify: - verify_data = type(data)() - glGetBufferSubData(buf_id, new_sz, 0, addressof(verify_data)) + verify_data = self.get_data(buf_id) if list(data) != list(verify_data): raise RuntimeError('OpenGL failed to upload to buffer') + def get_data(self, buf_id): + verify_data = self.ctypes_types[buf_id]() + glGetBufferSubData(buf_id, self.sizes[buf_id], 0, addressof(verify_data)) + return verify_data + def bind(self, buf_id): glBindBuffer(self.types[buf_id], buf_id) @@ -284,6 +292,10 @@ class ShaderProgram: # {{{ bufid = self.vertex_arrays[vao_id] buffer_manager.set_data(bufid, data, usage=usage) + def get_vertex_data(self, vao_id): + bufid = self.vertex_arrays[vao_id] + return buffer_manager.get_data(bufid) + def __hash__(self) -> int: return self.program_id