mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 18:51:41 +02:00
Also use the buffer manager for vertex arrays
This commit is contained in:
@@ -47,48 +47,45 @@ def load_shaders(name):
|
|||||||
class BufferManager: # {{{
|
class BufferManager: # {{{
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.buffers = {}
|
|
||||||
self.sizes = {}
|
self.sizes = {}
|
||||||
self.types = {}
|
self.types = {}
|
||||||
self.name_count = 0
|
self.name_count = 0
|
||||||
|
|
||||||
def create(self, name=None, for_use=GL_TEXTURE_BUFFER):
|
def create(self, for_use=GL_TEXTURE_BUFFER):
|
||||||
if name is None:
|
buf_id = glGenBuffers(1)
|
||||||
name = self.name_count
|
self.types[buf_id] = for_use
|
||||||
self.name_count += 1
|
|
||||||
self.buffers[name] = buf_id = glGenBuffers(1)
|
|
||||||
self.types[name] = for_use
|
|
||||||
self.sizes.pop(buf_id, None)
|
self.sizes.pop(buf_id, None)
|
||||||
return name
|
return buf_id
|
||||||
|
|
||||||
def delete(self, name):
|
def delete(self, buf_id):
|
||||||
buf_id = self.buffers.get(name)
|
if buf_id in self.types:
|
||||||
if name is not None:
|
|
||||||
glDeleteBuffer(buf_id)
|
glDeleteBuffer(buf_id)
|
||||||
self.sizes.pop(buf_id, None)
|
self.sizes.pop(buf_id, None)
|
||||||
|
self.types.pop(buf_id)
|
||||||
|
|
||||||
def set_data(self, name, data, usage=GL_STREAM_DRAW, verify=False):
|
def set_data(self, buf_id, data, usage=GL_STREAM_DRAW, verify=False):
|
||||||
prev_sz = self.sizes.get(name, 0)
|
prev_sz = self.sizes.get(buf_id, 0)
|
||||||
new_sz = sizeof(data)
|
new_sz = sizeof(data)
|
||||||
replace_or_create_buffer(self.buffers[name], new_sz, prev_sz, addressof(data), usage, self.types[name])
|
replace_or_create_buffer(buf_id, new_sz, prev_sz, addressof(data), usage, self.types[buf_id])
|
||||||
self.sizes[name] = new_sz
|
self.sizes[buf_id] = new_sz
|
||||||
if verify:
|
if verify:
|
||||||
verify_data = type(data)()
|
verify_data = type(data)()
|
||||||
glGetBufferSubData(self.buffers[name], new_sz, 0, addressof(verify_data))
|
glGetBufferSubData(buf_id, new_sz, 0, addressof(verify_data))
|
||||||
if list(data) != list(verify_data):
|
if list(data) != list(verify_data):
|
||||||
raise RuntimeError('OpenGL failed to upload to buffer')
|
raise RuntimeError('OpenGL failed to upload to buffer')
|
||||||
|
|
||||||
def bind(self, name):
|
def bind(self, buf_id):
|
||||||
buf_id = self.buffers[name]
|
glBindBuffer(self.types[buf_id], buf_id)
|
||||||
glBindBuffer(GL_TEXTURE_BUFFER, buf_id)
|
|
||||||
return buf_id
|
def unbind(self, buf_id):
|
||||||
|
glBindBuffer(self.types[buf_id], 0)
|
||||||
|
|
||||||
|
|
||||||
buffer_manager = BufferManager()
|
buffer_manager = BufferManager()
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
class Sprites:
|
class Sprites: # {{{
|
||||||
''' Maintain sprite sheets of all rendered characters on the GPU as a texture
|
''' Maintain sprite sheets of all rendered characters on the GPU as a texture
|
||||||
array with each texture being a sprite sheet. '''
|
array with each texture being a sprite sheet. '''
|
||||||
|
|
||||||
@@ -221,7 +218,7 @@ class Sprites:
|
|||||||
buffer_manager.set_data(buf_id, data, usage)
|
buffer_manager.set_data(buf_id, data, usage)
|
||||||
|
|
||||||
def bind_sprite_map(self, buf_id):
|
def bind_sprite_map(self, buf_id):
|
||||||
buf_id = buffer_manager.bind(buf_id)
|
buffer_manager.bind(buf_id)
|
||||||
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, buf_id)
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, buf_id)
|
||||||
|
|
||||||
def destroy_sprite_map(self, buf_id):
|
def destroy_sprite_map(self, buf_id):
|
||||||
@@ -238,9 +235,10 @@ class Sprites:
|
|||||||
def __exit__(self, *a):
|
def __exit__(self, *a):
|
||||||
glBindTexture(GL_TEXTURE_2D_ARRAY, 0)
|
glBindTexture(GL_TEXTURE_2D_ARRAY, 0)
|
||||||
glBindTexture(GL_TEXTURE_BUFFER, 0)
|
glBindTexture(GL_TEXTURE_BUFFER, 0)
|
||||||
glBindBuffer(GL_TEXTURE_BUFFER, 0)
|
|
||||||
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, 0)
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, 0)
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
class ShaderProgram:
|
class ShaderProgram:
|
||||||
""" Helper class for using GLSL shader programs """
|
""" Helper class for using GLSL shader programs """
|
||||||
@@ -271,13 +269,12 @@ class ShaderProgram:
|
|||||||
|
|
||||||
def add_vertex_array(self, name, size=3, dtype=GL_FLOAT, normalized=False, stride=0, offset=0):
|
def add_vertex_array(self, name, size=3, dtype=GL_FLOAT, normalized=False, stride=0, offset=0):
|
||||||
glBindVertexArray(self.vao_id)
|
glBindVertexArray(self.vao_id)
|
||||||
if name not in self.buffers:
|
self.buffers[name] = buf_id = buffer_manager.create(for_use=GL_ARRAY_BUFFER)
|
||||||
self.buffers[name] = glGenBuffers(1)
|
buffer_manager.bind(buf_id)
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, self.buffers[name])
|
|
||||||
aid = self.attribute_location(name)
|
aid = self.attribute_location(name)
|
||||||
glEnableVertexAttribArray(aid)
|
glEnableVertexAttribArray(aid)
|
||||||
glVertexAttribPointer(aid, size, dtype, normalized, stride, offset)
|
glVertexAttribPointer(aid, size, dtype, normalized, stride, offset)
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
buffer_manager.unbind(buf_id)
|
||||||
glBindVertexArray(0)
|
glBindVertexArray(0)
|
||||||
|
|
||||||
def send_vertex_data(self, name, data, usage=GL_STATIC_DRAW):
|
def send_vertex_data(self, name, data, usage=GL_STATIC_DRAW):
|
||||||
|
|||||||
Reference in New Issue
Block a user