kovidgoyal/kitty · warning

WARNING: Your GPU driver does not support 16bit textures as

Error message

WARNING: Your GPU driver does not support 16bit textures as framebuffer targets, some colors may be slightly inaccurate.

What it means

The GPU rejected a 16-bit texture as a framebuffer target, so kitty retried with an 8-bit GL_RGBA texture; rendering works but colors may be slightly inaccurate (banding). Contrast with the fatal() path when even RGBA fails.

Source

Thrown at kitty/shaders.c:1076

        int fmt;
    } status = {false, GL_RGBA16};
    glTexImage2D(GL_TEXTURE_2D, 0, status.fmt, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    bind_framebuffer_for_output(*framebuffer_id);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture_id, 0);
    if (!status.ok) {
        if (check_framebuffer_status() == NULL) {
            status.ok = true;
        } else {
            if (status.fmt == GL_RGBA16) {
                // Driver does not support 16 bit FBO so let it choose the
                // format. It will probably end up choosing 8 bit but
                // inaccurate colors are better than completely broken rendering.
                // See https://github.com/kovidgoyal/kitty/issues/9068
                status.fmt = GL_RGBA;
                free_framebuffer(framebuffer_id);
                free_texture(texture_id);
                setup_texture_as_render_target(width, height, texture_id, framebuffer_id);
                log_error("WARNING: Your GPU driver does not support 16bit textures as framebuffer targets, some colors may be slightly inaccurate.");
            } else {
                fatal("Your GPU driver does not support indirect rendering to a GL_RGBA texture via a framebuffer");
            }
        }
    }
}

static void
set_cell_uniforms(bool force) {
    static bool constants_set = false;
    if (!constants_set || force) {
        float text_contrast = 1.0f + OPT(text_contrast) * 0.01f;
        float text_gamma_adjustment = OPT(text_gamma_adjustment) < 0.01f ? 1.0f : 1.0f / OPT(text_gamma_adjustment);
        for (int i = GRAPHICS_PROGRAM; i <= GRAPHICS_ALPHA_MASK_PROGRAM; i++) {
            bind_program(i);
            glUniform1i(program_uniform_location(i, "image"), GRAPHICS_UNIT);
        }
        for (int i = CELL_PROGRAM; i < CELL_PROGRAM_SENTINEL; i++) {

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Mostly cosmetic - slight color inaccuracy; safe to ignore
  2. Update GPU drivers
  3. Report the driver/OS combination to kitty upstream if banding is unacceptable
  4. Disable offscreen-heavy effects like background blur

Example fix

# kitty.conf - before
background_blur 20
# after
background_blur 0
Defensive patterns

Strategy: fallback

Validate before calling

glxinfo | grep -i 'framebuffer'  # sanity-check FBO support

Prevention

When it happens

Trigger: setup_texture_as_render_target gets an incomplete framebuffer for the 16-bit format during offscreen rendering (blur/effects, screenshots, startup rendering).

Common situations: Buggy GPU drivers (kitty issue #9068), notably some ANGLE/D3D or older mobile GL stacks.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/20425cb4bb83c42c. Report an issue: GitHub.