summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-01-27 12:32:05 -0800
committerJason Ekstrand <[email protected]>2017-01-31 18:49:44 -0800
commita0348b5a0b679a78b3f49d41f980dec6066cc541 (patch)
treec2beb92137cacd9ff61c81c6d61a9e61593a4c9c /src
parent226a2c6d6eaa94919aa865edfe207c615bc741e7 (diff)
intel/blorp: Handle clearing of A4B4G4R4 on all platforms
Tested-by: Mark Janes <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Cc: "13.0 17.0" <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/blorp/blorp_clear.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c
index afc505d86cf..8ea22ac0ad3 100644
--- a/src/intel/blorp/blorp_clear.c
+++ b/src/intel/blorp/blorp_clear.c
@@ -349,6 +349,29 @@ blorp_clear(struct blorp_batch *batch,
if (format == ISL_FORMAT_R9G9B9E5_SHAREDEXP) {
clear_color.u32[0] = float3_to_rgb9e5(clear_color.f32);
format = ISL_FORMAT_R32_UINT;
+ } else if (format == ISL_FORMAT_A4B4G4R4_UNORM) {
+ /* Broadwell and earlier cannot render to this format so we need to work
+ * around it by swapping the colors around and using B4G4R4A4 instead.
+ */
+
+ /* First, we apply the swizzle. */
+ union isl_color_value old;
+ assert((unsigned)(swizzle.r - ISL_CHANNEL_SELECT_RED) < 4);
+ assert((unsigned)(swizzle.g - ISL_CHANNEL_SELECT_RED) < 4);
+ assert((unsigned)(swizzle.b - ISL_CHANNEL_SELECT_RED) < 4);
+ assert((unsigned)(swizzle.a - ISL_CHANNEL_SELECT_RED) < 4);
+ old.u32[swizzle.r - ISL_CHANNEL_SELECT_RED] = clear_color.u32[0];
+ old.u32[swizzle.g - ISL_CHANNEL_SELECT_RED] = clear_color.u32[1];
+ old.u32[swizzle.b - ISL_CHANNEL_SELECT_RED] = clear_color.u32[2];
+ old.u32[swizzle.a - ISL_CHANNEL_SELECT_RED] = clear_color.u32[3];
+ swizzle = ISL_SWIZZLE_IDENTITY;
+
+ /* Now we re-order for the new format */
+ clear_color.u32[0] = old.u32[1];
+ clear_color.u32[1] = old.u32[2];
+ clear_color.u32[2] = old.u32[3];
+ clear_color.u32[3] = old.u32[0];
+ format = ISL_FORMAT_B4G4R4A4_UNORM;
}
memcpy(&params.wm_inputs.clear_color, clear_color.f32, sizeof(float) * 4);