Nouveautés du GPU Web (Chrome 116)

François Beaufort
François Beaufort

Intégration de WebCodecs

WebGPU expose une API pour créer une "texture externe" opaque objets de HTMLVideoElement à importExternalTexture(). Vous pouvez utiliser ces objets pour échantillonner efficacement les images vidéo, éventuellement par copie 0, directement à partir des données du modèle de couleur YUV source.

Toutefois, la spécification WebGPU initiale ne permettait pas de créer des 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 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 appel GPUExternalTexture et un appel copyExternalImageToTexture(). 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.

Consultez l'exemple expérimental Mise en ligne de vidéos avec WebCodecs pour tester cette fonctionnalité.

Appareil perdu renvoyé par GPUAdapter requestDevice()

Si la méthode requestDevice() sur GPUAdapter échoue parce qu'elle a déjà été utilisée pour créer un GPUDevice, elle s'exécute désormais avec un GPUDevice immédiatement marqué comme perdu, au lieu de renvoyer une promesse qui rejette 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;

Préserver la fluidité de la lecture de la vidéo si importExternalTexture() est appelé

Lorsque importExternalTexture() est appelé avec un HTMLVideoElement, la lecture de la 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é avec les spécifications

L'argument message dans le constructeur GPUPipelineError() est facultatif. Voir modifier chromium:4613967.

Une erreur est déclenchée lors de l'appel de createShaderModule() si la source WGSL code contient \0. Voir issue dawn:1345.

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

Améliorer 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. Voir modifier chromium:4589369.

Les messages d'erreur de validation du tampon s'affichent instantanément dans la console JavaScript des outils de développement en cas d'échec de getMappedRange(), sans forcer les développeurs à envoyer des commandes à la file d'attente. Voir modifier chromium:4597950.

Capture d'écran de la console JavaScript des outils de développement avec le message d'erreur de validation du tampon.
Message d'erreur de validation du tampon dans la console JavaScript des outils de développement.

Actualités de l'aube

Le bouton d'activation/de désactivation du débogage disallow_unsafe_apis a été renommé allow_unsafe_apis et est désormais désactivé par défaut. Ce bouton permet de supprimer les erreurs de validation des points d'entrée de l'API ou des combinaisons de paramètres qui ne sont pas encore considérés comme sécurisés. Elle peut être utile pour le débogage. Voir issue dawn:1685.

L'attribut source obsolète de wgpu::ShaderModuleWGSLDescriptor a été supprimé en faveur de code. Voir Modifier dawn:130321.

La méthode wgpu::RenderBundle::SetLabel() manquante a été implémentée. Voir Modifier dawn:134502.

Les applications peuvent demander un backend particulier lors de l'obtention d'un adaptateur avec l'option wgpu::RequestAdapterOptionsBackendType. Consultez l'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 chaîne de permutation, afin que le wgpu::Texture renvoyé puisse être utilisé dans les copies. Consultez l'exemple ci-dessous et le problème dawn:1551.

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

Cette présentation ne porte que sur certains points clés. Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tous les sujets abordés dans la série Nouveautés de WebGPU

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