On Tue, Mar 3, 2026 at 2:11 PM Akihiko Odaki
<[email protected]> wrote:
>
> console_gl_check_format() was supposed to check if the pixman format is
> supported by surface_gl_create_texture(), but it missed
> PIXMAN_BE_x8r8g8b8 and PIXMAN_BE_a8r8g8b8, which are properly mapped to
> OpenGL formats by surface_gl_create_texture().
>
> Fix the discrepancy of the two functions by sharing the code to map
> pixman formats to OpenGL ones.
>
> Signed-off-by: Akihiko Odaki <[email protected]>

It should be fine for dbus display as well.

Reviewed-by: Marc-André Lureau <[email protected]>

> ---
>  ui/console-gl.c | 43 ++++++++++++++++++++++---------------------
>  1 file changed, 22 insertions(+), 21 deletions(-)
>
> diff --git a/ui/console-gl.c b/ui/console-gl.c
> index 403fc36fbdf2..22e9787c4156 100644
> --- a/ui/console-gl.c
> +++ b/ui/console-gl.c
> @@ -31,19 +31,38 @@
>
>  /* ---------------------------------------------------------------------- */
>
> -bool console_gl_check_format(DisplayChangeListener *dcl,
> -                             pixman_format_code_t format)
> +static bool map_format(pixman_format_code_t format,
> +                       GLenum *glformat, GLenum *gltype)
>  {
>      switch (format) {
>      case PIXMAN_BE_b8g8r8x8:
>      case PIXMAN_BE_b8g8r8a8:
> +        *glformat = GL_BGRA_EXT;
> +        *gltype = GL_UNSIGNED_BYTE;
> +        return true;
> +    case PIXMAN_BE_x8r8g8b8:
> +    case PIXMAN_BE_a8r8g8b8:
> +        *glformat = GL_RGBA;
> +        *gltype = GL_UNSIGNED_BYTE;
> +        return true;
>      case PIXMAN_r5g6b5:
> +        *glformat = GL_RGB;
> +        *gltype = GL_UNSIGNED_SHORT_5_6_5;
>          return true;
>      default:
>          return false;
>      }
>  }
>
> +bool console_gl_check_format(DisplayChangeListener *dcl,
> +                             pixman_format_code_t format)
> +{
> +    GLenum glformat;
> +    GLenum gltype;
> +
> +    return map_format(format, &glformat, &gltype);
> +}
> +
>  void surface_gl_create_texture(QemuGLShader *gls,
>                                 DisplaySurface *surface)
>  {
> @@ -54,25 +73,7 @@ void surface_gl_create_texture(QemuGLShader *gls,
>          return;
>      }
>
> -    switch (surface_format(surface)) {
> -    case PIXMAN_BE_b8g8r8x8:
> -    case PIXMAN_BE_b8g8r8a8:
> -        surface->glformat = GL_BGRA_EXT;
> -        surface->gltype = GL_UNSIGNED_BYTE;
> -        break;
> -    case PIXMAN_BE_x8r8g8b8:
> -    case PIXMAN_BE_a8r8g8b8:
> -        surface->glformat = GL_RGBA;
> -        surface->gltype = GL_UNSIGNED_BYTE;
> -        break;
> -    case PIXMAN_r5g6b5:
> -        surface->glformat = GL_RGB;
> -        surface->gltype = GL_UNSIGNED_SHORT_5_6_5;
> -        break;
> -    default:
> -        g_assert_not_reached();
> -    }
> -
> +    assert(map_format(surface_format(surface), &surface->glformat, 
> &surface->gltype));
>      glGenTextures(1, &surface->texture);
>      glEnable(GL_TEXTURE_2D);
>      glBindTexture(GL_TEXTURE_2D, surface->texture);
>
> --
> 2.53.0
>
>


-- 
Marc-André Lureau

Reply via email to