From 5197c26adb45039459a2cdec902936c2140222b0 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 21 Oct 2024 20:42:58 +0100 Subject: [PATCH] Add runtime shader for progressive blur (#368) This drastically improves performance of progressive on platforms which support a runtime shader (Android SDK 33+ and all Skiko platforms). On Android, the difference between the old 'multiple GraphicsLayer' implementation, and a single runtime shader is around 2x faster. --- haze/api/api.txt | 25 +-- .../HazeScreenshotTest.creditCard[32].png | Bin 0 -> 1580263 bytes ...azeScreenshotTest.creditCard_alpha[32].png | Bin 0 -> 1496181 bytes ...tTest.creditCard_childTint[32]_magenta.png | Bin 0 -> 1435499 bytes ...nshotTest.creditCard_childTint[32]_red.png | Bin 0 -> 1435303 bytes ...otTest.creditCard_childTint[32]_yellow.png | Bin 0 -> 1435601 bytes ...t.creditCard_compositionLocalStyle[32].png | Bin 0 -> 1435303 bytes ...t.creditCard_conditional[32]_0_initial.png | Bin 0 -> 1580263 bytes ....creditCard_conditional[32]_1_disabled.png | Bin 0 -> 903751 bytes ...creditCard_conditional[32]_2_reenabled.png | Bin 0 -> 1580263 bytes ...HazeScreenshotTest.creditCard_mask[32].png | Bin 0 -> 1457511 bytes ...tTest.creditCard_progressive_horiz[32].png | Bin 0 -> 1656161 bytes ...st.creditCard_progressive_vertical[32].png | Bin 0 -> 1591336 bytes ...creditCard_roundedCorner_bottomEnd[32].png | Bin 0 -> 1579532 bytes ...editCard_roundedCorner_bottomStart[32].png | Bin 0 -> 1579452 bytes ...st.creditCard_roundedCorner_topEnd[32].png | Bin 0 -> 1579794 bytes ....creditCard_roundedCorner_topStart[32].png | Bin 0 -> 1579889 bytes ...azeScreenshotTest.creditCard_style[32].png | Bin 0 -> 1435303 bytes ...hotTest.creditCard_transparentTint[32].png | Bin 0 -> 1609544 bytes .../chrisbanes/haze/HazeChildNode.android.kt | 128 ++++++++++++ ...ode.android.kt => RenderEffect.android.kt} | 154 ++++++++++----- .../kotlin/dev/chrisbanes/haze/Gradient.kt | 18 ++ .../dev/chrisbanes/haze/HazeChildNode.kt | 151 ++------------ .../kotlin/dev/chrisbanes/haze/HazeShaders.kt | 65 +++++++ .../kotlin/dev/chrisbanes/haze/Utils.kt | 27 +++ .../dev/chrisbanes/haze/HazeScreenshotTest.kt | 3 + .../chrisbanes/haze/HazeChildNode.skiko.kt | 31 +++ .../dev/chrisbanes/haze/HazeNode.skiko.kt | 131 ------------- .../{HazeShaders.kt => HazeShaders.skiko.kt} | 14 +- .../dev/chrisbanes/haze/RenderEffect.skiko.kt | 184 ++++++++++++++++++ .../chrisbanes/haze/test/ScreenshotTest.kt | 2 +- 31 files changed, 598 insertions(+), 335 deletions(-) create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_alpha[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_childTint[32]_magenta.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_childTint[32]_red.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_childTint[32]_yellow.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_compositionLocalStyle[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_conditional[32]_0_initial.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_conditional[32]_1_disabled.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_conditional[32]_2_reenabled.png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_mask[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_progressive_horiz[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_progressive_vertical[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_roundedCorner_bottomEnd[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_roundedCorner_bottomStart[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_roundedCorner_topEnd[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_roundedCorner_topStart[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_style[32].png create mode 100644 haze/screenshots/android/HazeScreenshotTest.creditCard_transparentTint[32].png create mode 100644 haze/src/androidMain/kotlin/dev/chrisbanes/haze/HazeChildNode.android.kt rename haze/src/androidMain/kotlin/dev/chrisbanes/haze/{HazeNode.android.kt => RenderEffect.android.kt} (51%) create mode 100644 haze/src/commonMain/kotlin/dev/chrisbanes/haze/Gradient.kt create mode 100644 haze/src/commonMain/kotlin/dev/chrisbanes/haze/HazeShaders.kt create mode 100644 haze/src/commonMain/kotlin/dev/chrisbanes/haze/Utils.kt create mode 100644 haze/src/skikoMain/kotlin/dev/chrisbanes/haze/HazeChildNode.skiko.kt delete mode 100644 haze/src/skikoMain/kotlin/dev/chrisbanes/haze/HazeNode.skiko.kt rename haze/src/skikoMain/kotlin/dev/chrisbanes/haze/{HazeShaders.kt => HazeShaders.skiko.kt} (76%) create mode 100644 haze/src/skikoMain/kotlin/dev/chrisbanes/haze/RenderEffect.skiko.kt diff --git a/haze/api/api.txt b/haze/api/api.txt index 7264435e..ad68b5fc 100644 --- a/haze/api/api.txt +++ b/haze/api/api.txt @@ -108,39 +108,32 @@ package dev.chrisbanes.haze { } public sealed interface HazeProgressive { - method public int getSteps(); - property public abstract int steps; field public static final dev.chrisbanes.haze.HazeProgressive.Companion Companion; - field public static final int STEPS_AUTO_BALANCED = -1; // 0xffffffff } public static final class HazeProgressive.Companion { - method public dev.chrisbanes.haze.HazeProgressive.LinearGradient horizontalGradient(optional int steps, optional androidx.compose.animation.core.Easing easing, optional float startX, optional float startIntensity, optional float endX, optional float endIntensity); - method public dev.chrisbanes.haze.HazeProgressive.LinearGradient verticalGradient(optional int steps, optional androidx.compose.animation.core.Easing easing, optional float startY, optional float startIntensity, optional float endY, optional float endIntensity); - field public static final int STEPS_AUTO_BALANCED = -1; // 0xffffffff + method public dev.chrisbanes.haze.HazeProgressive.LinearGradient horizontalGradient(optional androidx.compose.animation.core.Easing easing, optional float startX, optional float startIntensity, optional float endX, optional float endIntensity); + method public dev.chrisbanes.haze.HazeProgressive.LinearGradient verticalGradient(optional androidx.compose.animation.core.Easing easing, optional float startY, optional float startIntensity, optional float endY, optional float endIntensity); } public static final class HazeProgressive.LinearGradient implements dev.chrisbanes.haze.HazeProgressive { - ctor public HazeProgressive.LinearGradient(optional int steps, optional androidx.compose.animation.core.Easing easing, optional long start, optional float startIntensity, optional long end, optional float endIntensity); - method public int component1(); - method public androidx.compose.animation.core.Easing component2(); - method public long component3-F1C5BW0(); - method public float component4(); - method public long component5-F1C5BW0(); - method public float component6(); - method public dev.chrisbanes.haze.HazeProgressive.LinearGradient copy-owaVgss(int steps, androidx.compose.animation.core.Easing easing, long start, float startIntensity, long end, float endIntensity); + ctor public HazeProgressive.LinearGradient(optional androidx.compose.animation.core.Easing easing, optional long start, optional float startIntensity, optional long end, optional float endIntensity); + method public androidx.compose.animation.core.Easing component1(); + method public long component2-F1C5BW0(); + method public float component3(); + method public long component4-F1C5BW0(); + method public float component5(); + method public dev.chrisbanes.haze.HazeProgressive.LinearGradient copy-umk_asQ(androidx.compose.animation.core.Easing easing, long start, float startIntensity, long end, float endIntensity); method public androidx.compose.animation.core.Easing getEasing(); method public long getEnd(); method public float getEndIntensity(); method public long getStart(); method public float getStartIntensity(); - method public int getSteps(); property public final androidx.compose.animation.core.Easing easing; property public final long end; property public final float endIntensity; property public final long start; property public final float startIntensity; - property public int steps; } @androidx.compose.runtime.Stable public final class HazeState { diff --git a/haze/screenshots/android/HazeScreenshotTest.creditCard[32].png b/haze/screenshots/android/HazeScreenshotTest.creditCard[32].png new file mode 100644 index 0000000000000000000000000000000000000000..44048f74685ef2445be77b3aac827b136cfa6e0a GIT binary patch literal 1580263 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