Skip to content

Commit dc80eb4

Browse files
authored
RuntimeShaderBuilder uniform float array api (JetBrains#978)
1 parent f34519d commit dc80eb4

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

skiko/src/commonMain/kotlin/org/jetbrains/skia/RuntimeShaderBuilder.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ class RuntimeShaderBuilder internal constructor(ptr: NativePointer) : Managed(pt
8080
}
8181
}
8282

83+
fun uniform(name: String, value: FloatArray) {
84+
Stats.onNativeCall()
85+
interopScope {
86+
_nUniformFloatArray(_ptr, toInterop(name), toInterop(value), value.size)
87+
}
88+
}
89+
90+
8391
fun uniform(name: String, value: Matrix22) {
8492
Stats.onNativeCall()
8593
interopScope {
@@ -177,6 +185,10 @@ private external fun _nUniformFloat3(builderPtr: NativePointer, uniformName: Int
177185
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloat4")
178186
private external fun _nUniformFloat4(builderPtr: NativePointer, uniformName: InteropPointer, uniformValue1: Float, uniformValue2: Float, uniformValue3: Float, uniformValue4: Float)
179187

188+
@ExternalSymbolName("org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatArray")
189+
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatArray")
190+
private external fun _nUniformFloatArray(builderPtr: NativePointer, uniformName: InteropPointer, uniformFloatArray: InteropPointer, length: Int)
191+
180192
@ExternalSymbolName("org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatMatrix22")
181193
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatMatrix22")
182194
private external fun _nUniformFloatMatrix22(builderPtr: NativePointer, uniformName: InteropPointer, uniformMatrix22: InteropPointer)

skiko/src/commonTest/kotlin/org/jetbrains/skia/RuntimeShaderBuilderTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,22 @@ class RuntimeShaderBuilderTest {
5151
runtimeShaderBuilder.makeShader()
5252
}
5353

54+
@Test
55+
fun customShaderWithFloatArray() = shaderTest {
56+
val shaderSksl = """
57+
uniform float array[4];
58+
59+
half4 main(vec2 coord) {
60+
return half4(array[0], array[1], array[2], array[3]);
61+
}
62+
""".trimIndent()
63+
64+
val runtimeEffect = RuntimeEffect.makeForShader(shaderSksl)
65+
val runtimeShaderBuilder = RuntimeShaderBuilder(runtimeEffect)
66+
runtimeShaderBuilder.uniform("array", floatArrayOf(0.1f, 0.2f, 0.3f, 0.4f))
67+
runtimeShaderBuilder.makeShader()
68+
}
69+
5470
@Test
5571
fun customShaderWithMatrix() = shaderTest {
5672
val shaderSksl = """

skiko/src/jvmMain/cpp/common/RuntimeShaderBuilder.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@ Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nUniformFloat4
8282
runtimeShaderBuilder->uniform(skString(env, uniformName).c_str()) = float4 {uniformValue1, uniformValue2, uniformValue3, uniformValue4};
8383
}
8484

85+
extern "C" JNIEXPORT void JNICALL
86+
Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nUniformFloatArray
87+
(JNIEnv* env, jclass jclass, jlong builderPtr, jstring uniformName, jfloatArray uniformFloatArray, jint length) {
88+
SkRuntimeShaderBuilder* runtimeShaderBuilder = jlongToPtr<SkRuntimeShaderBuilder*>(builderPtr);
89+
jfloat* floatArray = static_cast<jfloat*>(env->GetPrimitiveArrayCritical(uniformFloatArray, 0));
90+
runtimeShaderBuilder->uniform(skString(env, uniformName).c_str()).set(floatArray, length);
91+
env->ReleasePrimitiveArrayCritical(uniformFloatArray, floatArray, 0);
92+
}
93+
8594
extern "C" JNIEXPORT void JNICALL
8695
Java_org_jetbrains_skia_RuntimeShaderBuilderKt__1nUniformFloatMatrix22
8796
(JNIEnv* env, jclass jclass, jlong builderPtr, jstring uniformName, jfloatArray uniformMatrix22) {

skiko/src/nativeJsMain/cpp/RuntimeShaderBuilder.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ SKIKO_EXPORT void org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloat4
7272
runtimeShaderBuilder->uniform(skString(uniformName).c_str()) = float4 {uniformValue1, uniformValue2, uniformValue3, uniformValue4};
7373
}
7474

75+
SKIKO_EXPORT void org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatArray
76+
(KNativePointer builderPtr, KInteropPointer uniformName, KFloat* uniformFloatArray, int32_t length) {
77+
SkRuntimeShaderBuilder* runtimeShaderBuilder = reinterpret_cast<SkRuntimeShaderBuilder*>(builderPtr);
78+
runtimeShaderBuilder->uniform(skString(uniformName).c_str()).set(uniformFloatArray, length);
79+
}
80+
7581
SKIKO_EXPORT void org_jetbrains_skia_RuntimeShaderBuilder__1nUniformFloatMatrix22
7682
(KNativePointer builderPtr, KInteropPointer uniformName, KFloat* uniformMatrix22) {
7783
SkRuntimeShaderBuilder* runtimeShaderBuilder = reinterpret_cast<SkRuntimeShaderBuilder*>(builderPtr);

0 commit comments

Comments
 (0)