ΠΠΎΠ½ΡΠΎΡΡΠΈΡΠΌ W3C ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ» ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅ΡΠ½ΠΎΠ²ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ WebGPU ΠΈ WebGPU Shading Language (WGSL), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ API Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π° GPU, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ·ΡΠΊ ΡΠ΅ΠΉΠ΄ΡΠΎΠ² Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ GPU. ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ ΡΡ ΠΎΠΆΠΈΠΉ Ρ API Vulkan, Metal ΠΈ Direct3D 12. Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Ρ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠΎΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ Π²ΠΎΡΠ»ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ ΠΈΠ· Mozilla, Google, Apple ΠΈ Microsoft.
ΠΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ WebGPU ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ WebGL ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ API Vulkan ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ OpenGL, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ API, Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ΅ ΠΆΠ΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ, ΡΡΠΎ ΠΈΠΌΠ΅ΡΡΡΡ Π² Vulkan, Metal ΠΈ Direct3D. WebGPU ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π½Π° JavaScript ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π»Ρ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΊ GPU, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΏΠ°ΠΌΡΡΡΡ, Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ, ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ΅ΠΊΡΡΡΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΠΉΠ΄Π΅ΡΠ°ΠΌΠΈ. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π·Π° ΡΡΡΡ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Ρ GPU.
WebGPU Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ Web ΡΠ»ΠΎΠΆΠ½ΡΠ΅ 3D-ΠΏΡΠΎΠ΅ΠΊΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Π½Π΅ Ρ ΡΠΆΠ΅, ΡΠ΅ΠΌ ΠΎΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π°ΠΏΡΡΠΌΡΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΠΈΠ΅ΡΡ Ρ Vulkan, Metal ΠΈΠ»ΠΈ Direct3D, Π½ΠΎ Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌ. WebGPU ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΠΈΠ²Π½ΡΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π² ΡΠΎΡΠΌΡ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° Π±Π°Π·Π΅ web-ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π² WebAssembly. ΠΡΠΎΠΌΠ΅ 3D-Π³ΡΠ°ΡΠΈΠΊΠΈ WebGPU ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π²ΡΠ½ΠΎΡΠΎΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ GPU ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅ΡΠΎΠ².
Mga pangunahing tampok ng WebGPU:
- Paghiwalayin ang pamamahala ng mga mapagkukunan, paghahanda sa trabaho at paghahatid ng mga utos sa GPU (sa WebGL isang bagay ang responsable para sa lahat nang sabay-sabay). Tatlong magkakahiwalay na konteksto ang ibinigay: GPUDevice para sa paglikha ng mga mapagkukunan tulad ng mga texture at buffer; GPUCommandEncoder para sa pag-encode ng mga indibidwal na command, kabilang ang mga yugto ng pag-render at pag-compute; GPUCommandBuffer na i-queued para sa execution sa GPU. Ang resulta ay maaaring i-render sa isang lugar na nauugnay sa isa o higit pang mga elemento ng canvas, o iproseso nang walang output (halimbawa, kapag nagpapatakbo ng mga gawain sa pag-compute). Ang paghihiwalay sa mga yugto ay nagpapadali sa paghiwalay ng mga operasyon sa paggawa at paghahanda ng mapagkukunan sa iba't ibang mga tagapangasiwa na maaaring tumakbo sa iba't ibang mga thread.
- Ibang diskarte sa pagpoproseso ng mga estado. Nag-aalok ang WebGPU ng dalawang bagay - GPURenderPipeline at GPUComputePipeline, na nagbibigay-daan sa iyong pagsamahin ang iba't ibang estado na paunang tinukoy ng developer, na nagpapahintulot sa browser na hindi mag-aksaya ng mga mapagkukunan sa karagdagang trabaho, tulad ng muling pag-compile ng mga shader. Kasama sa mga sinusuportahang estado ang: mga shader, vertex buffer at mga layout ng attribute, mga sticky group na layout, blending, depth at pattern, at post-render na mga format ng output.
- Isang binding model na katulad ng mga feature ng resource grouping ng Vulkan. Upang pagsama-samahin ang mga mapagkukunan, nagbibigay ang WebGPU ng object na GPUBindGroup, na maaaring iugnay sa iba pang katulad na mga bagay para magamit sa mga shader habang nagsusulat ng mga command. Ang paglikha ng mga naturang grupo ay nagbibigay-daan sa driver na maisagawa ang mga kinakailangang aksyon sa paghahanda nang maaga, at pinapayagan ang browser na baguhin ang mga pag-uugnay sa mapagkukunan sa pagitan ng mga tawag sa draw nang mas mabilis. Ang layout ng mga resource binding ay maaaring paunang tukuyin gamit ang GPUBindGroupLayout object.
Pinagmulan: opennet.ru