mesa: handle a bunch of formats in IMPLEMENTATION_COLOR_READ_*
[mesa.git] / src / mesa / main / framebuffer.c
index 3ec8b91eaa2c0b62e26ea9a21635254e0ec59346..78a80649a04447ddea412a9cac40e97267159a32 100644 (file)
@@ -844,22 +844,49 @@ _mesa_get_color_read_format(struct gl_context *ctx,
    }
    else {
       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_RGBA_UINT8:
+         return GL_RGBA_INTEGER;
+      case MESA_FORMAT_B8G8R8A8_UNORM:
          return GL_BGRA;
-      else if (format == MESA_FORMAT_B5G6R5_UNORM)
+      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:
+      case MESA_FORMAT_R8G8_SNORM:
+         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_UNORM16:
+      case MESA_FORMAT_R_UNORM8:
+      case MESA_FORMAT_R_SNORM16:
+      case MESA_FORMAT_R_SNORM8:
          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_INT:
+      if (_mesa_is_format_integer(format))
          return GL_RGBA_INTEGER;
-      default:
+      else
          return GL_RGBA;
-      }
    }
 }
 
@@ -892,29 +919,13 @@ _mesa_get_color_read_type(struct gl_context *ctx,
       return GL_NONE;
    }
    else {
-      const GLenum format = fb->_ColorReadBuffer->Format;
-      const GLenum data_type = _mesa_get_format_datatype(format);
-
-      if (format == 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)
-         return GL_UNSIGNED_INT_2_10_10_10_REV;
-
-      switch (data_type) {
-      case GL_SIGNED_NORMALIZED:
-         return GL_BYTE;
-      case GL_UNSIGNED_INT:
-      case GL_INT:
-      case GL_FLOAT:
-         return data_type;
-      case GL_UNSIGNED_NORMALIZED:
-      default:
-         return GL_UNSIGNED_BYTE;
-      }
+      const mesa_format format = fb->_ColorReadBuffer->Format;
+      GLenum data_type;
+      GLuint comps;
+
+      _mesa_uncompressed_format_to_type_and_comps(format, &data_type, &comps);
+
+      return data_type;
    }
 }