Ensure we dont exceed GL_MAX_TEXTURE_BUFFER_SIZE

This commit is contained in:
Kovid Goyal 2017-08-21 20:53:02 +05:30
parent 313253cd95
commit be06669e8f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 20 additions and 16 deletions

View File

@ -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);

View File

@ -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: