/* * Copyright 2021 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include #include "include/core/SkM44.h" #include "include/effects/SkRuntimeEffect.h" #include "modules/jetski/src/Utils.h" namespace { static jlong ShaderBuilder_Create(JNIEnv* env, jobject, jstring jsksl) { auto [eff,err] = SkRuntimeEffect::MakeForShader( SkString(jetski::utils::CString(env, jsksl))); if (!eff) { // TODO: throw exception? __android_log_print(ANDROID_LOG_ERROR, "JetSki", "Failed to compile shader: %s\n", err.c_str()); return 0; } return reinterpret_cast(new SkRuntimeShaderBuilder(std::move(eff))); } static void ShaderBuilder_Release(JNIEnv* env, jobject, jlong native_instance) { if (auto* builder = reinterpret_cast(native_instance)) { delete builder; } } static void ShaderBuilder_SetUniformFloat(JNIEnv* env, jobject, jlong native_instance, jstring jname, float val) { if (auto* builder = reinterpret_cast(native_instance)) { builder->uniform(jetski::utils::CString(env, jname).str()) = val; } } static void ShaderBuilder_SetUniformFloat3(JNIEnv* env, jobject, jlong native_instance, jstring jname, float valX, float valY, float valZ) { if (auto* builder = reinterpret_cast(native_instance)) { builder->uniform(jetski::utils::CString(env, jname).str()) = SkV3{valX, valY, valZ}; } } static void ShaderBuilder_SetUniformMatrix(JNIEnv* env, jobject, jlong native_instance, jstring jname, jlong native_matrix) { if (auto* builder = reinterpret_cast(native_instance)) { if (auto* matrix = reinterpret_cast(native_matrix)) { builder->uniform(jetski::utils::CString(env, jname).str()) = *matrix; } } } static jlong ShaderBuilder_MakeShader(JNIEnv* env, jobject, jlong native_instance) { if (auto* builder = reinterpret_cast(native_instance)) { auto shader = builder->makeShader(); return reinterpret_cast(shader.release()); } return 0; } } // namespace int register_jetski_RuntimeShaderBuilder(JNIEnv* env) { static const JNINativeMethod methods[] = { {"nCreate" , "(Ljava/lang/String;)J" , reinterpret_cast(ShaderBuilder_Create)}, {"nRelease" , "(J)V" , reinterpret_cast(ShaderBuilder_Release)}, {"nSetUniformFloat" , "(JLjava/lang/String;F)V" , reinterpret_cast(ShaderBuilder_SetUniformFloat)}, {"nSetUniformFloat3", "(JLjava/lang/String;FFF)V" , reinterpret_cast(ShaderBuilder_SetUniformFloat3)}, {"nSetUniformMatrix", "(JLjava/lang/String;J)V" , reinterpret_cast(ShaderBuilder_SetUniformMatrix)}, {"nMakeShader" , "(J)J" , reinterpret_cast(ShaderBuilder_MakeShader)}, }; const auto clazz = env->FindClass("org/skia/jetski/RuntimeShaderBuilder"); return clazz ? env->RegisterNatives(clazz, methods, std::size(methods)) : JNI_ERR; }