Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
23e1fbd
feat(cloudy): introduce a tracing eDSL for mirage kernels and port du…
l2hyunwoo Jul 11, 2026
f1df0ec
feat(cloudy): port foil, specular, and chromatic off hand-written AGS…
l2hyunwoo Jul 11, 2026
eb2ddd0
refactor(cloudy): rework the mirage eDSL authoring surface to direct …
l2hyunwoo Jul 12, 2026
a1f514c
feat(cloudy): add structured diagnostics, host-type literals, and a r…
l2hyunwoo Jul 12, 2026
ae4504f
docs(cloudy): stop citing the out-of-repo design doc from mirage eDSL…
l2hyunwoo Jul 12, 2026
99cbdd8
perf(cloudy): hoist the fixed temp-declaration regex out of tempWhose…
l2hyunwoo Jul 12, 2026
1c458e6
refactor(cloudy): rename the hoisted-temp regex out of a SCREAMING_SN…
l2hyunwoo Jul 12, 2026
e83fa01
fix(cloudy): match GLSL identifiers whole-token in MirageCompiler's l…
l2hyunwoo Jul 12, 2026
eb9ea57
refactor(cloudy): drop the unreleased MirageLintException shim and po…
l2hyunwoo Jul 12, 2026
548a363
style(cloudy): conform the mirage eDSL to the repo spotless config an…
l2hyunwoo Jul 12, 2026
e3f269a
ci: retrigger checks after the history rewrite
l2hyunwoo Jul 12, 2026
3e71560
fix(cloudy): stop shadowing Throwable.message so a MirageDiagnosticEx…
l2hyunwoo Jul 12, 2026
1f8e6ce
refactor(cloudy): drain TraceContext.ifBlock's statement list with su…
l2hyunwoo Jul 12, 2026
33332b2
fix(cloudy): close Skia Surface/Paint/Bitmap in rasterize() and fix t…
l2hyunwoo Jul 12, 2026
9b60dfd
feat(cloudy): extend the mirage eDSL with statement-body helpers and …
l2hyunwoo Jul 14, 2026
c6d376a
feat(cloudy): implement mirage eDSL write-swizzle, shaderFunction hel…
l2hyunwoo Jul 14, 2026
64155a5
feat(cloudy): extend shaderFunction to 4- and 5-param arities so exte…
l2hyunwoo Jul 14, 2026
2dbab62
style(cloudy): apply ktlint formatting to the F4-F7 eDSL commit
l2hyunwoo Jul 14, 2026
c7476e2
refactor(cloudy): rename mirage eDSL package internal.edsl to edsl to…
l2hyunwoo Jul 14, 2026
985cdf2
chore(cloudy): regenerate klib ABI dump after eDSL package rename
l2hyunwoo Jul 14, 2026
0aae9ff
fix(cloudy): cast the half1 clamp helper's argument to float and docu…
l2hyunwoo Jul 14, 2026
ee08aa5
style(cloudy): fix import ordering left over from the eDSL package re…
l2hyunwoo Jul 14, 2026
d241023
docs(cloudy): document the hand-rolled RainyWindow parity kernel's pr…
l2hyunwoo Jul 14, 2026
89023e1
docs(cloudy): add KDoc to the 4- and 5-param shaderFunction arities
l2hyunwoo Jul 14, 2026
d65382f
docs(cloudy): drop the RainyWindow parity kernel's commit-hash proven…
l2hyunwoo Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions cloudy/api/cloudy.klib.api
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,17 @@ final object com.skydoves.cloudy/LiquidGlassShaderSource { // com.skydoves.cloud
final fun <get-SKSL>(): kotlin/String // com.skydoves.cloudy/LiquidGlassShaderSource.SKSL.<get-SKSL>|<get-SKSL>(){}[0]
}

final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_BranchBuilder$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_BranchBuilder$stableprop|#static{}com_skydoves_cloudy_edsl_BranchBuilder$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat1$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat1$stableprop|#static{}com_skydoves_cloudy_edsl_LocalFloat1$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat2$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat2$stableprop|#static{}com_skydoves_cloudy_edsl_LocalFloat2$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalHalf4$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalHalf4$stableprop|#static{}com_skydoves_cloudy_edsl_LocalHalf4$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction1$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction1$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderFunction1$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction2$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction2$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderFunction2$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction3$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction3$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderFunction3$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction4$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction4$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderFunction4$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction5$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction5$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderFunction5$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderValueType$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderValueType$stableprop|#static{}com_skydoves_cloudy_edsl_ShaderValueType$stableprop[0]
final val com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_WhenScope$stableprop // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_WhenScope$stableprop|#static{}com_skydoves_cloudy_edsl_WhenScope$stableprop[0]
final val com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_Overlay$stableprop // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_Overlay$stableprop|#static{}com_skydoves_cloudy_internal_Stage_Overlay$stableprop[0]
final val com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop|#static{}com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop[0]
final val com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop|#static{}com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop[0]
Expand Down Expand Up @@ -274,6 +285,8 @@ final val com.skydoves.cloudy/com_skydoves_cloudy_MirageParams$stableprop // com
final val com.skydoves.cloudy/com_skydoves_cloudy_MirageShader$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_MirageShader$stableprop|#static{}com_skydoves_cloudy_MirageShader$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_MirageShaders$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_MirageShaders$stableprop|#static{}com_skydoves_cloudy_MirageShaders$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_PlatformBitmap$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_PlatformBitmap$stableprop|#static{}com_skydoves_cloudy_PlatformBitmap$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowOptic$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowOptic$stableprop|#static{}com_skydoves_cloudy_RainyWindowOptic$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowParams$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowParams$stableprop|#static{}com_skydoves_cloudy_RainyWindowParams$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_Sky$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_Sky$stableprop|#static{}com_skydoves_cloudy_Sky$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_SpecularParams$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_SpecularParams$stableprop|#static{}com_skydoves_cloudy_SpecularParams$stableprop[0]
final val com.skydoves.cloudy/com_skydoves_cloudy_UColor$stableprop // com.skydoves.cloudy/com_skydoves_cloudy_UColor$stableprop|#static{}com_skydoves_cloudy_UColor$stableprop[0]
Expand All @@ -293,6 +306,17 @@ final fun (androidx.compose.ui/Modifier).com.skydoves.cloudy/liquidGlass(android
final fun (androidx.compose.ui/Modifier).com.skydoves.cloudy/sky(com.skydoves.cloudy/Sky, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.ui/Modifier // com.skydoves.cloudy/sky|sky@androidx.compose.ui.Modifier(com.skydoves.cloudy.Sky;androidx.compose.runtime.Composer?;kotlin.Int){}[0]
final fun (com.skydoves.cloudy/PlatformBitmap).com.skydoves.cloudy/createCompatible(): com.skydoves.cloudy/PlatformBitmap // com.skydoves.cloudy/createCompatible|createCompatible@com.skydoves.cloudy.PlatformBitmap(){}[0]
final fun (com.skydoves.cloudy/PlatformBitmap).com.skydoves.cloudy/dispose() // com.skydoves.cloudy/dispose|dispose@com.skydoves.cloudy.PlatformBitmap(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_BranchBuilder$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_BranchBuilder$stableprop_getter|com_skydoves_cloudy_edsl_BranchBuilder$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat1$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat1$stableprop_getter|com_skydoves_cloudy_edsl_LocalFloat1$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat2$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalFloat2$stableprop_getter|com_skydoves_cloudy_edsl_LocalFloat2$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalHalf4$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_LocalHalf4$stableprop_getter|com_skydoves_cloudy_edsl_LocalHalf4$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction1$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction1$stableprop_getter|com_skydoves_cloudy_edsl_ShaderFunction1$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction2$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction2$stableprop_getter|com_skydoves_cloudy_edsl_ShaderFunction2$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction3$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction3$stableprop_getter|com_skydoves_cloudy_edsl_ShaderFunction3$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction4$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction4$stableprop_getter|com_skydoves_cloudy_edsl_ShaderFunction4$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction5$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderFunction5$stableprop_getter|com_skydoves_cloudy_edsl_ShaderFunction5$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderValueType$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_ShaderValueType$stableprop_getter|com_skydoves_cloudy_edsl_ShaderValueType$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_WhenScope$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.edsl/com_skydoves_cloudy_edsl_WhenScope$stableprop_getter|com_skydoves_cloudy_edsl_WhenScope$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_Overlay$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_Overlay$stableprop_getter|com_skydoves_cloudy_internal_Stage_Overlay$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop_getter|com_skydoves_cloudy_internal_Stage_PlatformFilter$stableprop_getter(){}[0]
final fun com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop_getter(): kotlin/Int // com.skydoves.cloudy.internal/com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop_getter|com_skydoves_cloudy_internal_Stage_ProgramFilter$stableprop_getter(){}[0]
Expand Down Expand Up @@ -329,6 +353,8 @@ final fun com.skydoves.cloudy/com_skydoves_cloudy_MirageParams$stableprop_getter
final fun com.skydoves.cloudy/com_skydoves_cloudy_MirageShader$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_MirageShader$stableprop_getter|com_skydoves_cloudy_MirageShader$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_MirageShaders$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_MirageShaders$stableprop_getter|com_skydoves_cloudy_MirageShaders$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_PlatformBitmap$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_PlatformBitmap$stableprop_getter|com_skydoves_cloudy_PlatformBitmap$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowOptic$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowOptic$stableprop_getter|com_skydoves_cloudy_RainyWindowOptic$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowParams$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_RainyWindowParams$stableprop_getter|com_skydoves_cloudy_RainyWindowParams$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_Sky$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_Sky$stableprop_getter|com_skydoves_cloudy_Sky$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_SpecularParams$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_SpecularParams$stableprop_getter|com_skydoves_cloudy_SpecularParams$stableprop_getter(){}[0]
final fun com.skydoves.cloudy/com_skydoves_cloudy_UColor$stableprop_getter(): kotlin/Int // com.skydoves.cloudy/com_skydoves_cloudy_UColor$stableprop_getter|com_skydoves_cloudy_UColor$stableprop_getter(){}[0]
Expand Down
50 changes: 38 additions & 12 deletions cloudy/src/commonMain/kotlin/com/skydoves/cloudy/MirageParams.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:OptIn(ExperimentalMirage::class)

package com.skydoves.cloudy

import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.TileMode
import com.skydoves.cloudy.edsl.Expression
import com.skydoves.cloudy.edsl.Float1
import com.skydoves.cloudy.edsl.Float2
import com.skydoves.cloudy.edsl.Float4
import com.skydoves.cloudy.edsl.Half4
import com.skydoves.cloudy.edsl.ShaderType
import com.skydoves.cloudy.edsl.UniformRef
import com.skydoves.cloudy.internal.UniformEntry
import kotlin.properties.PropertyDelegateProvider
import kotlin.properties.ReadOnlyProperty
Expand All @@ -38,8 +47,10 @@ import kotlin.reflect.KProperty
* Lifetime: the engine creates one instance per node and reuses it — every param write happens on
* the single draw-phase thread, so no synchronization and no per-frame allocation.
*
* A handle here is a plain typed slot, not a shader expression: it carries the per-draw value and
* its binding slot, nothing more.
* A handle plays two roles from one object: at draw time it carries the per-draw value and its binding
* slot; inside a traced kernel body it *is* the shader expression that reads that uniform — the typed
* handles ([UFloat] etc.) implement the matching value interface ([Float1] etc.) and hand back a
* [UniformRef] node, so a body writes `shadow.rgb` with no lift/convert step.
*/
@ExperimentalMirage
public abstract class MirageParams {
Expand Down Expand Up @@ -155,19 +166,25 @@ public sealed interface UniformHandle {
public val slot: Int
}

/** A scalar `float` uniform slot. */
/** A scalar `float` uniform slot; a [Float1] expression inside a traced body. */
@ExperimentalMirage
public class UFloat internal constructor(override val slot: Int, public var value: Float) :
UniformHandle {
UniformHandle,
Float1 {
override val e: Expression get() = UniformRef(slot, ShaderType.Float1)

public operator fun invoke(v: Float) {
value = v
}
}

/** A `float2` uniform slot carrying a coordinate or direction. */
/** A `float2` uniform slot carrying a coordinate or direction; a [Float2] expression in a body. */
@ExperimentalMirage
public class UOffset internal constructor(override val slot: Int, public var value: Offset) :
UniformHandle {
UniformHandle,
Float2 {
override val e: Expression get() = UniformRef(slot, ShaderType.Float2)

public operator fun invoke(v: Offset) {
value = v
}
Expand All @@ -177,10 +194,13 @@ public class UOffset internal constructor(override val slot: Int, public var val
}
}

/** A `float2` uniform slot carrying a size. */
/** A `float2` uniform slot carrying a size; a [Float2] expression in a body. */
@ExperimentalMirage
public class USize internal constructor(override val slot: Int, public var value: Size) :
UniformHandle {
UniformHandle,
Float2 {
override val e: Expression get() = UniformRef(slot, ShaderType.Float2)

public operator fun invoke(v: Size) {
value = v
}
Expand Down Expand Up @@ -209,10 +229,13 @@ public class UVec3 internal constructor(override val slot: Int, public var value
}
}

/** A `float4` uniform slot. The backing array is always length 4. */
/** A `float4` uniform slot; a [Float4] expression in a body. The backing array is always length 4. */
@ExperimentalMirage
public class UVec4 internal constructor(override val slot: Int, public var value: FloatArray) :
UniformHandle {
UniformHandle,
Float4 {
override val e: Expression get() = UniformRef(slot, ShaderType.Float4)

public operator fun invoke(v: FloatArray) {
require(v.size == 4) { "UVec4 value must have size 4, was ${v.size}" }
value = v.copyOf()
Expand All @@ -234,10 +257,13 @@ public class UFloatArray internal constructor(
}
}

/** A `layout(color) vec4` uniform slot. */
/** A `layout(color) vec4` uniform slot; a [Half4] color expression in a body. */
@ExperimentalMirage
public class UColor internal constructor(override val slot: Int, public var value: Color) :
UniformHandle {
UniformHandle,
Half4 {
override val e: Expression get() = UniformRef(slot, ShaderType.Half4)

public operator fun invoke(v: Color) {
value = v
}
Expand Down
Loading
Loading