summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorRafael Antognolli <[email protected]>2019-04-23 15:18:01 -0700
committerRafael Antognolli <[email protected]>2019-04-30 08:31:44 -0700
commit91bcbfc35100b64eb230e9bdafc7abe7cb134c06 (patch)
tree586c78a4e909fc219ee0ab450537d842042e9e84 /src/gallium
parent56927a8cf5c7ef6330954b3d1b1583c854974520 (diff)
iris: Use the linear version of the surface format during fast clears.
Newer gens (> 9) will start doing the linear -> sRGB conversion of the clear color for us, if we use a sRGB surface format. So let's make sure that doesn't happen and keep the same semantics as before. Even though the hardware could convert the clear color for us during fast clear, that converted color is only used for sampling. For resolve, the original color would be used (without the conversion). So we convert it ourselves and the same converted color gets used for both sampling and resolving, simplifying the whole logic. Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/iris/iris_clear.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c
index 9fc242526a4..6b0e665c3b3 100644
--- a/src/gallium/drivers/iris/iris_clear.c
+++ b/src/gallium/drivers/iris/iris_clear.c
@@ -269,7 +269,13 @@ fast_clear_color(struct iris_context *ice,
iris_blorp_surf_for_resource(&ice->vtbl, &surf, p_res, res->aux.usage,
level, true);
- blorp_fast_clear(&blorp_batch, &surf, format,
+ /* In newer gens (> 9), the hardware will do a linear -> sRGB conversion of
+ * the clear color during the fast clear, if the surface format is of sRGB
+ * type. We use the linear version of the surface format here to prevent
+ * that from happening, since we already do our own linear -> sRGB
+ * conversion in convert_fast_clear_color().
+ */
+ blorp_fast_clear(&blorp_batch, &surf, isl_format_srgb_to_linear(format),
level, box->z, box->depth,
box->x, box->y, box->x + box->width,
box->y + box->height);