From be06669e8fb24bc0b31b9fc1ae59fc73ca009a97 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Aug 2017 20:53:02 +0530 Subject: [PATCH] Ensure we dont exceed GL_MAX_TEXTURE_BUFFER_SIZE --- kitty/gl.h | 2 +- kitty/shaders.py | 34 +++++++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/kitty/gl.h b/kitty/gl.h index c23d6709c..ddf6bc365 100644 --- a/kitty/gl.h +++ b/kitty/gl.h @@ -744,7 +744,7 @@ int add_module_gl_constants(PyObject *module) { GLC(GL_COMPILE_STATUS); GLC(GL_LINK_STATUS); GLC(GL_TEXTURE0); GLC(GL_TEXTURE1); GLC(GL_TEXTURE2); GLC(GL_TEXTURE3); GLC(GL_TEXTURE4); GLC(GL_TEXTURE5); GLC(GL_TEXTURE6); GLC(GL_TEXTURE7); GLC(GL_TEXTURE8); - GLC(GL_MAX_ARRAY_TEXTURE_LAYERS); + GLC(GL_MAX_ARRAY_TEXTURE_LAYERS); GLC(GL_TEXTURE_BINDING_BUFFER); GLC(GL_MAX_TEXTURE_BUFFER_SIZE); GLC(GL_MAX_TEXTURE_SIZE); GLC(GL_TEXTURE_2D_ARRAY); GLC(GL_LINEAR); GLC(GL_CLAMP_TO_EDGE); GLC(GL_NEAREST); diff --git a/kitty/shaders.py b/kitty/shaders.py index 81985739a..f994265fb 100644 --- a/kitty/shaders.py +++ b/kitty/shaders.py @@ -4,28 +4,28 @@ import os import sys -from ctypes import addressof, sizeof from collections import defaultdict +from ctypes import addressof, sizeof from functools import lru_cache from threading import Lock from .fast_data_types import ( BOLD, GL_ARRAY_BUFFER, GL_CLAMP_TO_EDGE, GL_COMPILE_STATUS, GL_FLOAT, GL_FRAGMENT_SHADER, GL_LINK_STATUS, GL_MAX_ARRAY_TEXTURE_LAYERS, - GL_MAX_TEXTURE_SIZE, GL_NEAREST, GL_R8, GL_R32UI, GL_RED, GL_STATIC_DRAW, - GL_STREAM_DRAW, GL_TEXTURE0, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BUFFER, - GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, - GL_TEXTURE_WRAP_T, GL_TRUE, GL_UNPACK_ALIGNMENT, GL_UNSIGNED_BYTE, - GL_VERTEX_SHADER, ITALIC, SpriteMap, copy_image_sub_data, glActiveTexture, - glAttachShader, glBindBuffer, glBindTexture, glBindVertexArray, - glCompileShader, glCopyImageSubData, glCreateProgram, glCreateShader, - glDeleteBuffer, glDeleteProgram, glDeleteShader, glDeleteTexture, - glEnableVertexAttribArray, glGenBuffers, glGenTextures, glGenVertexArrays, - glGetAttribLocation, glGetBufferSubData, glGetIntegerv, - glGetProgramInfoLog, glGetProgramiv, glGetShaderInfoLog, glGetShaderiv, - glGetUniformLocation, glLinkProgram, glNamedBufferData, glPixelStorei, - glShaderSource, glTexBuffer, glTexParameteri, glTexStorage3D, - glTexSubImage3D, glUseProgram, glVertexAttribPointer, + GL_MAX_TEXTURE_BUFFER_SIZE, GL_MAX_TEXTURE_SIZE, GL_NEAREST, GL_R8, + GL_R32UI, GL_RED, GL_STATIC_DRAW, GL_STREAM_DRAW, GL_TEXTURE0, + GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BUFFER, GL_TEXTURE_MAG_FILTER, + GL_TEXTURE_MIN_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, GL_TRUE, + GL_UNPACK_ALIGNMENT, GL_UNSIGNED_BYTE, GL_VERTEX_SHADER, ITALIC, SpriteMap, + copy_image_sub_data, glActiveTexture, glAttachShader, glBindBuffer, + glBindTexture, glBindVertexArray, glCompileShader, glCopyImageSubData, + glCreateProgram, glCreateShader, glDeleteBuffer, glDeleteProgram, + glDeleteShader, glDeleteTexture, glEnableVertexAttribArray, glGenBuffers, + glGenTextures, glGenVertexArrays, glGetAttribLocation, glGetBufferSubData, + glGetIntegerv, glGetProgramInfoLog, glGetProgramiv, glGetShaderInfoLog, + glGetShaderiv, glGetUniformLocation, glLinkProgram, glNamedBufferData, + glPixelStorei, glShaderSource, glTexBuffer, glTexParameteri, + glTexStorage3D, glTexSubImage3D, glUseProgram, glVertexAttribPointer, replace_or_create_buffer ) from .fonts.render import render_cell @@ -66,6 +66,7 @@ class Sprites: self.texture_unit = GL_TEXTURE0 + self.sampler_num self.buffer_texture_unit = GL_TEXTURE0 + self.buffer_sampler_num self.backend = SpriteMap(glGetIntegerv(GL_MAX_TEXTURE_SIZE), glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS)) + self.max_texture_buffer_size = glGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE) self.lock = Lock() def do_layout(self, cell_width=1, cell_height=1): @@ -173,6 +174,9 @@ class Sprites: def set_sprite_map(self, buf_id, data, usage=GL_STREAM_DRAW): prev_sz = self.prev_sprite_map_sizes[buf_id] new_sz = sizeof(data) + if new_sz // 4 > self.max_texture_buffer_size: + raise RuntimeError(('The OpenGL implementation on your system has a max_texture_buffer_size of {} which' + ' is insufficient for the sprite_map').format(self.max_texture_buffer_size)) replace_or_create_buffer(buf_id, new_sz, prev_sz, addressof(data), usage) self.prev_sprite_map_sizes[buf_id] = new_sz if False: