Démarrer¶
Prérequis¶
Utilisez le JDK 25 et le Gradle wrapper du dépôt. Un consommateur utilise Maven Central ; les versions snapshot demandent également le dépôt des snapshots Maven Central.
Ajouter un module¶
Les coordonnées publiées utilisent le groupe org.graphiks.webgpu. Choisissez le module nécessaire :
dependencies {
implementation("org.graphiks.webgpu:api:<version>")
// Implémentations des descripteurs (nécessaires à l’implémentation navigateur).
// implementation("org.graphiks.webgpu:descriptors:<version>")
// Implémentation navigateur.
// implementation("org.graphiks.webgpu:browser:<version>")
// Interop JavaScript directe.
// implementation("org.graphiks.webgpu:web-bindings:<version>")
}
Remplacez <version> par une version release ou snapshot disponible. La valeur de développement
du dépôt est 0.1.0-SNAPSHOT ; elle ne signifie pas qu’une publication existe déjà.
Utiliser l’implémentation navigateur¶
Ajoutez webgpu-browser et webgpu-descriptors au source set JS/Wasm partagé. L’implémentation
navigateur expose le package org.graphiks.webgpu.browser ; les descripteurs utilisés ci-dessous
appartiennent à org.graphiks.webgpu.descriptors. L’accès WebGPU exige un navigateur compatible et
un contexte sûr.
import org.graphiks.webgpu.GPUBufferUsage
import org.graphiks.webgpu.browser.requestAdapter
import org.graphiks.webgpu.descriptors.BufferDescriptor
suspend fun createExampleBuffer() {
val adapter = requestAdapter().getOrThrow()
val device = adapter.requestDevice().getOrThrow()
try {
val buffer = device.createBuffer(
BufferDescriptor(
size = 16uL,
usage = GPUBufferUsage.CopyDst or GPUBufferUsage.Storage,
),
)
buffer.close()
} finally {
device.close()
adapter.close()
}
}
Les helpers canvas (getCanvasSurface, SurfaceConfiguration) se trouvent également dans
org.graphiks.webgpu.browser. getCanvasSurface() est une extension du type léger
org.graphiks.webgpu.browser.HTMLCanvasElement ; convertissez votre canvas DOM vers ce type (par
exemple (canvas as HTMLCanvasElement).getCanvasSurface()). webgpu-browser ne fournit pas de
bibliothèque DOM de façon transitive : ajoutez-en une (par exemple kotlin-browser) si votre code
utilise des types DOM.
Interop avec le backend navigateur¶
Les wrappers navigateur exposent leur handle brut via handler pour l’interop. Appeler des
opérations directement sur le handle peut invalider le contrat du wrapper (ownership et sémantique
de fermeture unique) : préférez l’API du wrapper.
L’ownership des textures est explicite. Texture.wrapOwned(handler) prend en charge la destruction
du handle ; Texture.wrapBorrowed(handler) enveloppe une texture appartenant à quelqu’un d’autre
(par exemple le canvas d’une CanvasSurface) et ne la détruit jamais. Les textures de
device.createTexture sont possédées ; celles de CanvasSurface.getCurrentTexture sont
empruntées. CanvasSurface est AutoCloseable : close() déconfigure le contexte canvas et ne
ferme pas le device passé à configure.
import org.graphiks.webgpu.browser.Texture
// Possédée : fermer le wrapper détruit la texture.
val owned = Texture.wrapOwned(device.createTexture(descriptor).let { it as org.graphiks.webgpu.browser.Texture }.handler)
// Empruntée : fermer le wrapper laisse la texture du canvas intacte.
val borrowed = Texture.wrapBorrowed(surface.getCurrentTexture().texture.let { it as org.graphiks.webgpu.browser.Texture }.handler)
Mapper un buffer avec une plage bornée¶
GPUBuffer.withMappedRange mappe une plage, exécute un bloc non suspendu avec la vue empruntée,
puis dépappe (unmap) dans un finally : le buffer revient à Unmapped même si le bloc lève une
exception.
import org.graphiks.webgpu.GPUBufferUsage
import org.graphiks.webgpu.GPUDevice
import org.graphiks.webgpu.GPUMapMode
import org.graphiks.webgpu.descriptors.BufferDescriptor
import org.graphiks.webgpu.withMappedRange
suspend fun writeExample(device: GPUDevice) {
val buffer = device.createBuffer(
BufferDescriptor(size = 16uL, usage = GPUBufferUsage.MapWrite or GPUBufferUsage.CopySrc),
)
buffer.use {
it.withMappedRange(GPUMapMode.Write) { view ->
view.setUInts(0uL, uintArrayOf(1u, 2u, 3u, 4u))
}
}
}
La vue passée au bloc est empruntée : elle est invalidée par le unmap() effectué par le helper
et ne doit ni être conservée ni retournée. Les ressources créées par un device appartiennent à
l’appelant : close() les détruit (un backend natif libère aussi sa référence possédée), et fermer
une ressource déjà fermée ne libère pas la même référence une seconde fois. Une texture obtenue
d’un contexte canvas est empruntée : fermer son wrapper ne détruit pas la texture du canvas.
Utiliser un type portable¶
import org.graphiks.webgpu.GPUTextureSwizzle
val identity = GPUTextureSwizzle().toWebGpuString() // "rgba"
Ce comportement est vérifié par GPUTextureSwizzleTest dans webgpu-api.
Consultez l’architecture pour les limites des modules et le mapping des types pour les correspondances WebGPU/Kotlin.