[Mesa-dev] [PATCH] mesa: handle a bunch of formats in IMPLEMENTATION_COLOR_READ_*

Gert Wollny gert.wollny at collabora.com
Wed May 16 11:38:42 UTC 2018


Tested-By: Gert Wollny <gert.wollny at collabora.com>

Am Montag, den 14.05.2018, 15:14 +0200 schrieb Tomeu Vizoso:
> Virgl could save a lot of work converting buffers in the host side
> between formats if Mesa supported a bunch of other formats when
> reading
> pixels.
> 
> This commit adds cases to handle specific formats so that the values
> reported by the two calls match more closely the underlying native
> formats.
> 
> In GLES is important that IMPLEMENTATION_COLOR_READ_* return the
> native
> format and data type because the spec only allows reading with those,
> besides GL_RGBA or GL_RGBA_INTEGER.
> 
> Additionally, because virgl currently doesn't implement such
> conversions,
> this commit fixes several tests in
> dEQP-GLES3.functional.fbo.color.clear.*, when using virgl in the
> guest
> side.
> 
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
> ---
>  src/mesa/main/framebuffer.c | 73 ++++++++++++++++++++++++++++++++---
> --
>  1 file changed, 64 insertions(+), 9 deletions(-)
> 
> diff --git a/src/mesa/main/framebuffer.c
> b/src/mesa/main/framebuffer.c
> index 8e751b453b75..a22c66b349f2 100644
> --- a/src/mesa/main/framebuffer.c
> +++ b/src/mesa/main/framebuffer.c
> @@ -836,15 +836,43 @@ _mesa_get_color_read_format(struct gl_context
> *ctx,
>        const mesa_format format = fb->_ColorReadBuffer->Format;
>        const GLenum data_type = _mesa_get_format_datatype(format);
>  
> -      if (format == MESA_FORMAT_B8G8R8A8_UNORM)
> +      switch(format) {
> +      case MESA_FORMAT_B8G8R8A8_UNORM:
>           return GL_BGRA;
> -      else if (format == MESA_FORMAT_B5G6R5_UNORM)
> +      case MESA_FORMAT_R10G10B10A2_UINT:
> +         return GL_BGRA_INTEGER;
> +      case MESA_FORMAT_B5G6R5_UNORM:
> +      case MESA_FORMAT_R11G11B10_FLOAT:
>           return GL_RGB;
> -      else if (format == MESA_FORMAT_R_UNORM8)
> +      case MESA_FORMAT_RG_FLOAT32:
> +      case MESA_FORMAT_RG_FLOAT16:
> +      case MESA_FORMAT_R8G8_UNORM:
> +         return GL_RG;
> +      case MESA_FORMAT_RG_SINT32:
> +      case MESA_FORMAT_RG_UINT32:
> +      case MESA_FORMAT_RG_SINT16:
> +      case MESA_FORMAT_RG_UINT16:
> +      case MESA_FORMAT_RG_SINT8:
> +      case MESA_FORMAT_RG_UINT8:
> +         return GL_RG_INTEGER;
> +      case MESA_FORMAT_R_FLOAT32:
> +      case MESA_FORMAT_R_FLOAT16:
> +      case MESA_FORMAT_R_UNORM8:
>           return GL_RED;
> +      case MESA_FORMAT_R_SINT32:
> +      case MESA_FORMAT_R_UINT32:
> +      case MESA_FORMAT_R_SINT16:
> +      case MESA_FORMAT_R_UINT16:
> +      case MESA_FORMAT_R_SINT8:
> +      case MESA_FORMAT_R_UINT8:
> +         return GL_RED_INTEGER;
> +      default:
> +         break;
> +      }
>  
>        switch (data_type) {
>        case GL_UNSIGNED_INT:
> +      case GL_UNSIGNED_BYTE:
>        case GL_INT:
>           return GL_RGBA_INTEGER;
>        default:
> @@ -885,14 +913,41 @@ _mesa_get_color_read_type(struct gl_context
> *ctx,
>        const GLenum format = fb->_ColorReadBuffer->Format;
>        const GLenum data_type = _mesa_get_format_datatype(format);
>  
> -      if (format == MESA_FORMAT_B5G6R5_UNORM)
> +      switch(format) {
> +      case MESA_FORMAT_B5G6R5_UNORM:
>           return GL_UNSIGNED_SHORT_5_6_5;
> -
> -      if (format == MESA_FORMAT_B10G10R10A2_UNORM ||
> -          format == MESA_FORMAT_B10G10R10X2_UNORM ||
> -          format == MESA_FORMAT_R10G10B10A2_UNORM ||
> -          format == MESA_FORMAT_R10G10B10X2_UNORM)
> +      case MESA_FORMAT_B10G10R10A2_UNORM:
> +      case MESA_FORMAT_B10G10R10X2_UNORM:
> +      case MESA_FORMAT_R10G10B10A2_UNORM:
> +      case MESA_FORMAT_R10G10B10X2_UNORM:
> +      case MESA_FORMAT_B10G10R10A2_UINT:
> +      case MESA_FORMAT_R10G10B10A2_UINT:
>           return GL_UNSIGNED_INT_2_10_10_10_REV;
> +      case MESA_FORMAT_R11G11B10_FLOAT:
> +         return GL_UNSIGNED_INT_10F_11F_11F_REV;
> +      case MESA_FORMAT_RGBA_FLOAT16:
> +      case MESA_FORMAT_RG_FLOAT16:
> +      case MESA_FORMAT_R_FLOAT16:
> +         return GL_HALF_FLOAT;
> +      case MESA_FORMAT_RGBA_SINT16:
> +      case MESA_FORMAT_RG_SINT16:
> +      case MESA_FORMAT_R_SINT16:
> +         return GL_SHORT;
> +      case MESA_FORMAT_RGBA_UINT16:
> +      case MESA_FORMAT_RG_UINT16:
> +      case MESA_FORMAT_R_UINT16:
> +         return GL_UNSIGNED_SHORT;
> +      case MESA_FORMAT_RGBA_SINT8:
> +      case MESA_FORMAT_RG_SINT8:
> +      case MESA_FORMAT_R_SINT8:
> +         return GL_BYTE;
> +      case MESA_FORMAT_RG_UINT8:
> +      case MESA_FORMAT_RGBA_UINT8:
> +      case MESA_FORMAT_R_UINT8:
> +         return GL_UNSIGNED_BYTE;
> +      default:
> +         break;
> +      }
>  
>        switch (data_type) {
>        case GL_SIGNED_NORMALIZED:


More information about the mesa-dev mailing list