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.viz...@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:
-- 
2.17.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to