summaryrefslogtreecommitdiff
path: root/src/intel/isl
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2017-02-07 09:14:46 -0800
committerJason Ekstrand <jason.ekstrand@intel.com>2018-05-09 11:16:33 -0700
commit242f6f7492a0e5b0cafa003c61f1d9e8ccce8889 (patch)
tree79a044f4d4b504d8a99c0f0877c91974d299dac9 /src/intel/isl
parentdad67cc24576622ef989a9bb66a5b13cc275cfae (diff)
intel/isl: Add a helper for composing swizzles
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/intel/isl')
-rw-r--r--src/intel/isl/isl.c35
-rw-r--r--src/intel/isl/isl.h3
2 files changed, 38 insertions, 0 deletions
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
index 1b270c1d715..5cd6ef954a1 100644
--- a/src/intel/isl/isl.c
+++ b/src/intel/isl/isl.c
@@ -2375,3 +2375,38 @@ isl_swizzle_supports_rendering(const struct gen_device_info *devinfo,
swizzle.a == ISL_CHANNEL_SELECT_ALPHA;
}
}
+
+static enum isl_channel_select
+swizzle_select(enum isl_channel_select chan, struct isl_swizzle swizzle)
+{
+ switch (chan) {
+ case ISL_CHANNEL_SELECT_ZERO:
+ case ISL_CHANNEL_SELECT_ONE:
+ return chan;
+ case ISL_CHANNEL_SELECT_RED:
+ return swizzle.r;
+ case ISL_CHANNEL_SELECT_GREEN:
+ return swizzle.g;
+ case ISL_CHANNEL_SELECT_BLUE:
+ return swizzle.b;
+ case ISL_CHANNEL_SELECT_ALPHA:
+ return swizzle.a;
+ default:
+ unreachable("Invalid swizzle component");
+ }
+}
+
+/**
+ * Returns the single swizzle that is equivalent to applying the two given
+ * swizzles in sequence.
+ */
+struct isl_swizzle
+isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second)
+{
+ return (struct isl_swizzle) {
+ .r = swizzle_select(first.r, second),
+ .g = swizzle_select(first.g, second),
+ .b = swizzle_select(first.b, second),
+ .a = swizzle_select(first.a, second),
+ };
+}
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index fc1ff5f3f88..3c175d2d051 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -1744,6 +1744,9 @@ bool
isl_swizzle_supports_rendering(const struct gen_device_info *devinfo,
struct isl_swizzle swizzle);
+struct isl_swizzle
+isl_swizzle_compose(struct isl_swizzle first, struct isl_swizzle second);
+
#define isl_surf_init(dev, surf, ...) \
isl_surf_init_s((dev), (surf), \
&(struct isl_surf_init_info) { __VA_ARGS__ });