summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2014-03-24 01:16:57 -0700
committerKenneth Graunke <[email protected]>2014-03-24 14:38:51 -0700
commit92234b1b2aaf6ba68e786498806cefd4bd99dabc (patch)
treea9d5beedbb0f1bde9c00b5614ff9d3bfaa65e3e9
parent0d99aef6c8a940e52afcbffa7091ff9c854ba120 (diff)
mesa: Introduce a _mesa_format_has_color_component() helper.
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 <[email protected]> Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Ian Romanick <[email protected]> Tested-by: Dylan Baker <[email protected]>
-rw-r--r--src/mesa/main/formats.c29
-rw-r--r--src/mesa/main/formats.h4
2 files changed, 33 insertions, 0 deletions
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index e74625f2369..fb2501c69a2 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -2207,6 +2207,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.
*/
diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
index 3079f0356cf..89bd0219eab 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -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,