mesa: Introduce a _mesa_format_has_color_component() helper.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 24 Mar 2014 08:16:57 +0000 (01:16 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 24 Mar 2014 21:38:51 +0000 (14:38 -0700)
When considering color write masks, we often want to know whether an
RGBA component actually contains any meaningful data.  This function
provides an easy way to answer that question, and handles luminance,
intensity, and alpha formats correctly.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Tested-by: Dylan Baker <baker.dylan.c@gmail.com>
src/mesa/main/formats.c
src/mesa/main/formats.h

index e74625f236947a1e09097303e983e9addece34e4..fb2501c69a2ac9fe6e361803974f4b10d4b81118 100644 (file)
@@ -2206,6 +2206,35 @@ _mesa_format_num_components(mesa_format format)
 }
 
 
+/**
+ * Returns true if a color format has data stored in the R/G/B/A channels,
+ * given an index from 0 to 3.
+ */
+bool
+_mesa_format_has_color_component(mesa_format format, int component)
+{
+   const struct gl_format_info *info = _mesa_get_format_info(format);
+
+   assert(info->BaseFormat != GL_DEPTH_COMPONENT &&
+          info->BaseFormat != GL_DEPTH_STENCIL &&
+          info->BaseFormat != GL_STENCIL_INDEX);
+
+   switch (component) {
+   case 0:
+      return (info->RedBits + info->IntensityBits + info->LuminanceBits) > 0;
+   case 1:
+      return (info->GreenBits + info->IntensityBits + info->LuminanceBits) > 0;
+   case 2:
+      return (info->BlueBits + info->IntensityBits + info->LuminanceBits) > 0;
+   case 3:
+      return (info->AlphaBits + info->IntensityBits) > 0;
+   default:
+      assert(!"Invalid color component: must be 0..3");
+      return false;
+   }
+}
+
+
 /**
  * Return number of bytes needed to store an image of the given size
  * in the given format.
index 3079f0356cfa338a42d47e58fe5bf158c080d77d..89bd0219eab3fd710b30f961086476986feaffb8 100644 (file)
@@ -34,6 +34,7 @@
 
 
 #include <GL/gl.h>
+#include <stdbool.h>
 
 
 #ifdef __cplusplus
@@ -474,6 +475,9 @@ _mesa_get_uncompressed_format(mesa_format format);
 extern GLuint
 _mesa_format_num_components(mesa_format format);
 
+extern bool
+_mesa_format_has_color_component(mesa_format format, int component);
+
 GLboolean
 _mesa_format_matches_format_and_type(mesa_format mesa_format,
                                     GLenum format, GLenum type,