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.