{"record":{"id":"8157e135177bd5bc","repo":"kovidgoyal/kitty","slug":"warning-your-system-s-opengl-implementation-does","errorCode":null,"errorMessage":"WARNING: Your system's OpenGL implementation does not have glCopyImageSubData, falling back to a slower implementation","messagePattern":"WARNING: Your system's OpenGL implementation does not have glCopyImageSubData, falling back to a slower implementation","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kitty/shaders.c","lineNumber":162,"sourceCode":"\nstatic void\ncopy_32bit_texture(GLuint old_texture, GLuint new_texture, GLenum texture_type) {\n    // requires new texture to be at least as big as old texture. Assumes textures are 32bits per pixel\n    GLint width, height, layers;\n    glBindTexture(texture_type, old_texture);\n    glGetTexLevelParameteriv(texture_type, 0, GL_TEXTURE_WIDTH, &width);\n    glGetTexLevelParameteriv(texture_type, 0, GL_TEXTURE_HEIGHT, &height);\n    glGetTexLevelParameteriv(texture_type, 0, GL_TEXTURE_DEPTH, &layers);\n    if (GLAD_GL_ARB_copy_image) {\n        glCopyImageSubData(old_texture, texture_type, 0, 0, 0, 0, new_texture, texture_type, 0, 0, 0, 0, width, height, layers);\n        return;\n    }\n\n    static bool copy_image_warned = false;\n    // ARB_copy_image not available, do a slow roundtrip copy\n    if (!copy_image_warned) {\n        copy_image_warned = true;\n        log_error(\"WARNING: Your system's OpenGL implementation does not have glCopyImageSubData, falling back to a slower implementation\");\n    }\n\n    GLint internal_format;\n    glGetTexLevelParameteriv(texture_type, 0, GL_TEXTURE_INTERNAL_FORMAT, &internal_format);\n    GLenum format, type;\n    switch (internal_format) {\n        case GL_R8UI:\n        case GL_R8I:\n        case GL_R16UI:\n        case GL_R16I:\n        case GL_R32UI:\n        case GL_R32I:\n        case GL_RG8UI:\n        case GL_RG8I:\n        case GL_RG16UI:\n        case GL_RG16I:\n        case GL_RG32UI:\n        case GL_RG32I:","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/shaders.c#L144-L180","documentation":"The OpenGL implementation lacks ARB_copy_image (glCopyImageSubData), so kitty falls back to a slow CPU roundtrip copy when growing sprite (glyph) textures. Warned once per process; rendering is correct, only performance suffers.","triggerScenarios":"copy_32bit_texture during sprite texture reallocation on GL stacks without GL_ARB_copy_image - old Mesa drivers, software rasterizers (llvmpipe), some VM GPUs.","commonSituations":"Running kitty in a VM, over remote GLX, with llvmpipe/swrast, or on older embedded drivers.","solutions":["Safe to ignore - performance warning only","Update GPU drivers / Mesa to a version with ARB_copy_image","Verify with: glxinfo | grep ARB_copy_image; prefer real hardware GL","Enable 3D acceleration in VMs"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"glxinfo | grep GL_ARB_copy_image  # verify driver capability","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use hardware GL with up-to-date drivers","Enable 3D acceleration in VMs"],"tags":["kitty","opengl","gpu","performance"],"backgroundTag":"missing-opengl-extension","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}