Nouveautés du GPU Web (Chrome 116)

François Beaufort
François Beaufort

Intégration de WebCodecs

WebGPU expose une API permettant de créer des objets "texture externe" opaques à partir de HTMLVideoElement via importExternalTexture(). Vous pouvez utiliser ces objets pour échantillonner efficacement les images vidéo, potentiellement sans copie directement à partir des données du modèle de couleurs YUV source.

Toutefois, la spécification WebGPU initiale n'autorisait pas la création d'objets GPUExternalTexture à partir d'objets WebCodecs VideoFrame. Cette fonctionnalité est importante pour les applications de traitement vidéo avancées qui utilisent déjà WebCodecs et qui souhaitent intégrer WebGPU dans le pipeline de traitement vidéo. L'intégration de WebCodecs permet d'utiliser un VideoFrame comme source pour un GPUExternalTexture et un copyExternalImageToTexture() appel. Consultez l'exemple suivant et l'entrée chromestatus.

// Access the GPU device.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create VideoFrame from HTMLVideoElement.
const video = document.querySelector("video");
const videoFrame = new VideoFrame(video);

// Create texture from VideoFrame.
const texture = device.importExternalTexture({ source: videoFrame });
// TODO: Use texture in bind group creation.

Essayez l'exemple expérimental d'importation de vidéos avec WebCodecs.

Appareil perdu renvoyé par GPUAdapter requestDevice()

Si la requestDevice() méthode sur GPUAdapter échoue, car elle a déjà été utilisée pour créer un GPUDevice, elle est désormais remplie avec un GPUDevice immédiatement marqué comme perdu, au lieu de renvoyer une promesse qui est rejetée avec null. Consultez le problème chromium:1234617.

const adapter = await navigator.gpu.requestAdapter();
const device1 = await adapter.requestDevice();

// New! The promise is not rejected anymore with null.
const device2 = await adapter.requestDevice();
// And the device is immediately marked as lost.
const info = await device2.lost;

Lecture vidéo fluide si importExternalTexture() est appelé

Lorsque importExternalTexture() est appelé avec un HTMLVideoElement, la lecture vidéo associée n'est plus limitée lorsque la vidéo n'est pas visible dans la fenêtre d'affichage. Consultez le problème chromium:1425252.

Conformité aux spécifications

L'argument message du constructeur GPUPipelineError() est facultatif. Consultez la modification chromium:4613967.

Une erreur est déclenchée lors de l’appel de createShaderModule() si la source WGSL code contient \0. Consultez le problème dawn:1345.

Le niveau de détail maximal par défaut (lodMaxClamp) utilisé lors de l'échantillonnage d'une texture avec createSampler() est de 32. Consultez la modification chromium:4608063.

Amélioration de l'expérience des développeurs

Un message s'affiche dans la console JavaScript des outils de développement pour rappeler aux développeurs qu'ils utilisent WebGPU sur une plate-forme non compatible. Consultez la modification chromium:4589369.

Les messages d'erreur de validation de la mémoire tampon s'affichent instantanément dans la console JavaScript des outils de développement lorsque getMappedRange() échoue sans obliger les développeurs à envoyer des commandes à la file d'attente. Consultez la modification chromium:4597950.

Capture d'écran de la console JavaScript des outils pour les développeurs affichant un message d'erreur de validation du tampon.
Message d'erreur de validation de la mémoire tampon dans la console JavaScript des outils de développement.

Mises à jour de Dawn

Le bouton de débogage disallow_unsafe_apis a été renommé allow_unsafe_apis et sa valeur par défaut a été désactivée. Ce bouton supprime les erreurs de validation sur les points d'entrée de l'API ou les combinaisons de paramètres qui ne sont pas encore considérées comme sécurisées. Il peut être utile pour le débogage. Consultez le problème dawn:1685.

L'attribut source obsolète wgpu::ShaderModuleWGSLDescriptor est supprimé au profit de code. Consultez la modification dawn:130321.

La méthode manquante wgpu::RenderBundle::SetLabel() a été implémentée. Consultez la modification dawn:134502.

Les applications peuvent demander un backend spécifique lorsqu'elles obtiennent un adaptateur avec l'option wgpu::RequestAdapterOptionsBackendType. Consultez un exemple ci-dessous et le problème dawn:1875.

wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
backendTypeOptions.backendType = wgpu::BackendType::D3D12;

wgpu::RequestAdapterOptions options = {};
options.nextInChain = &backendTypeOptions;

// Request D3D12 adapter.
myInstance.RequestAdapter(&options, myCallback, myUserData);

Une nouvelle méthode SwapChain::GetCurrentTexture() a été ajoutée avec des utilisations supplémentaires pour les textures de la chaîne d'échange, de sorte que le wgpu::Texture renvoyé puisse être utilisé dans les copies. Consultez un exemple ci-dessous et le problème dawn:1551.

wgpu::SwapChain swapchain = myDevice.CreateSwapChain(mySurface, &myDesc);
swapchain.GetCurrentTexture();
swapchain.Present();

Cela ne couvre que quelques-uns des principaux points forts. Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tout ce qui a été abordé dans la série Nouveautés de WebGPU.

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113