Kotlin versions of objects are AutoCloseable and Dawn *Release methods are called on close.
Bug: 330293719
Change-Id: I55cf0f43dfc0d586ba61848116aa85278551e8cf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/190624
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jim Blackler <jimblackler@google.com>
diff --git a/generator/templates/art/api_kotlin_object.kt b/generator/templates/art/api_kotlin_object.kt
index e3cab51..021ab3b 100644
--- a/generator/templates/art/api_kotlin_object.kt
+++ b/generator/templates/art/api_kotlin_object.kt
@@ -27,7 +27,7 @@
package {{ kotlin_package }}
{% from 'art/api_kotlin_types.kt' import kotlin_type_declaration, kotlin_definition with context %}
-class {{ obj.name.CamelCase() }}(val handle: Long) {
+class {{ obj.name.CamelCase() }}(val handle: Long): AutoCloseable {
{% for method in obj.methods if include_method(method) %}
@JvmName("{{ method.name.camelCase() }}") external fun {{ method.name.camelCase() }}(
//* userdata parameter omitted because Kotlin clients can achieve the same with closures.
@@ -46,4 +46,5 @@
val {{ name }} get() = {{ method.name.camelCase() }}()
{% endif %}
{% endfor %}
+ external override fun close();
}
diff --git a/generator/templates/art/methods.cpp b/generator/templates/art/methods.cpp
index 09dd9ed..79ca066 100644
--- a/generator/templates/art/methods.cpp
+++ b/generator/templates/art/methods.cpp
@@ -281,6 +281,17 @@
{% for method in obj.methods if include_method(method) %}
{{ render_method(method, obj) }}
{% endfor %}
+
+ //* Every object gets a Release method, to supply a Kotlin AutoCloseable.
+ extern "C"
+ JNIEXPORT void JNICALL
+ Java_{{ kotlin_package.replace('.', '_') }}_{{ obj.name.CamelCase() }}_close(
+ JNIEnv *env, jobject obj) {
+ jclass clz = env->FindClass("{{ jni_name(obj) }}");
+ const {{ as_cType(obj.name) }} handle = reinterpret_cast<{{ as_cType(obj.name) }}>(
+ env->CallLongMethod(obj, env->GetMethodID(clz, "getHandle", "()J")));
+ wgpu{{ obj.name.CamelCase() }}Release(handle);
+ }
{% endfor %}
//* Global functions don't have an associated class.