WebGPU (Chrome 133) में नया क्या है

François Beaufort
François Beaufort

पब्लिश किया गया: 29 जनवरी, 2025

अन्य unorm8x4-bgra और एक-कॉम्पोनेंट वाले वर्टिक्स फ़ॉर्मैट

"unorm8x4-bgra" वर्टिक्स फ़ॉर्मैट और एक कॉम्पोनेंट वाले ये वर्टिक्स फ़ॉर्मैट जोड़े गए हैं: "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16", और "float16". "unorm8x4-bgra" वर्टिक्स फ़ॉर्मैट की मदद से, एक ही शेडर को बनाए रखते हुए, BGRA कोड में बदले गए वर्टिक्स के रंगों को लोड करना थोड़ा आसान हो जाता है. इसके अलावा, एक-कॉम्पोनेंट वाले वर्टिक्स फ़ॉर्मैट की मदद से, सिर्फ़ ज़रूरी डेटा का अनुरोध किया जा सकता है. पहले, 8 और 16-बिट डेटा टाइप के लिए, कम से कम दोगुना डेटा का अनुरोध करना पड़ता था. chromestatus पर मौजूद एंट्री और समस्या 376924407 देखें.

तय नहीं की गई वैल्यू के साथ, अज्ञात सीमाओं का अनुरोध करने की अनुमति दें

WebGPU API के बेहतर होने के साथ-साथ, उसे और भी बेहतर बनाने के लिए, अब जीपीयू डिवाइस का अनुरोध करते समय undefined वैल्यू के साथ, अनजान सीमाओं का अनुरोध किया जा सकता है. यह नीचे दिए गए ऐप्लिकेशन कोड में काम आता है. उदाहरण के लिए, अगर someLimit अब मौजूद नहीं है, तो adapter.limits.someLimit को undefined किया जा सकता है. स्पेसिफ़िकेशन PR 4781 देखें.

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

डब्ल्यूजीएसएल अलाइनमेंट के नियमों में बदलाव

अब किसी स्ट्रक्चर के सदस्य के लिए, अलाइनमेंट की बहुत छोटी वैल्यू नहीं दी जा सकती. ऐसा इसलिए है, क्योंकि अब यह ज़रूरी है कि सभी स्ट्रक्चर के लिए @align(n), RequiredAlignOf से बड़ा हो. इस बदलाव से, WGSL भाषा का इस्तेमाल आसान हो गया है. साथ ही, यह Firefox और Safari के साथ ज़्यादा काम की हो गई है. स्पेसिफ़िकेशन के लिए सबमिट किए गए प्रॉडक्ट रिलीज़ में, Tint, Naga, और WebKit कंपाइलर के बीच के अंतर को दिखाने वाला सैंपल कोड देखा जा सकता है.

'खारिज करें' सुविधा की मदद से, WGSL की परफ़ॉर्मेंस में हुई बढ़ोतरी

स्क्रीन-स्पेस रिफ़्लेक्शन (एसएसआर) के जटिल इफ़ेक्ट को रेंडर करते समय, परफ़ॉर्मेंस में काफ़ी गिरावट देखी गई. इसलिए, डिस्कार्ड स्टेटमेंट को लागू करने के लिए, प्लैटफ़ॉर्म से मिले सेमेंटेक्स का इस्तेमाल किया जाता है. इससे, हेल्पर को कॉल करने की सुविधा को डिमोट किया जा सकता है. हालांकि, यह सुविधा सिर्फ़ तब उपलब्ध होती है, जब हेल्पर को कॉल करने की सुविधा उपलब्ध हो. इससे, डिस्कार्ड का इस्तेमाल करने वाले शेडर की परफ़ॉर्मेंस बेहतर होती है. समस्या 372714384 देखें.

बाहरी टेक्सचर के लिए, VideoFrame displaySize का इस्तेमाल करना

WebGPU स्पेसिफ़िकेशन के मुताबिक, VideoFrame इंपोर्ट करते समय displayWidth और displayHeight डाइमेंशन का इस्तेमाल, GPUExternalTexture के दिखने वाले साइज़ के तौर पर किया जाना चाहिए. हालांकि, दिखने वाले साइज़ का गलत इस्तेमाल किया गया था. इस वजह से, GPUExternalTexture पर textureLoad() का इस्तेमाल करने में समस्याएं आ रही थीं. अब यह समस्या ठीक कर दी गई है. समस्या 377574981 देखें.

copyExternalImageToTexture का इस्तेमाल करके, डिफ़ॉल्ट ओरिएंटेशन के अलावा किसी अन्य ओरिएंटेशन वाली इमेज को हैंडल करना

copyExternalImageToTexture() GPUQueue तरीके का इस्तेमाल, किसी इमेज या कैनवस के कॉन्टेंट को टेक्सचर में कॉपी करने के लिए किया जाता है. यह अब डिफ़ॉल्ट ओरिएंटेशन के अलावा, अन्य ओरिएंटेशन वाली इमेज को भी सही तरीके से हैंडल करता है. पहले ऐसा नहीं था, जब सोर्स imageOrientation "from-image" वाली ImageBitmap या डिफ़ॉल्ट से अलग ओरिएंटेशन वाली इमेज थी. समस्या 384858956 देखें.

डेवलपर के अनुभव को बेहतर बनाना

जब adapter.limits ज़्यादा वैल्यू दिखाता है, तो यह हैरानी की बात हो सकती है. हालांकि, आपको यह नहीं पता होता कि जीपीयू डिवाइस का अनुरोध करते समय, आपको साफ़ तौर पर ज़्यादा सीमा का अनुरोध करना होगा. ऐसा न करने पर, बाद में अनचाहे तरीके से सीमाएं लागू हो सकती हैं.

आपकी मदद करने के लिए, गड़बड़ी के मैसेज में अहम जानकारी जोड़ी गई है. इससे, आपको यह पता चलेगा कि requestDevice() को कॉल करते समय requiredLimits में कोई सीमा तय नहीं की गई है, तो ज़्यादा सीमा का अनुरोध कैसे करें. समस्या 42240683 देखें.

नीचे दिए गए उदाहरण में, डिवाइस के लिए डिफ़ॉल्ट तौर पर तय किए गए बफ़र साइज़ की सीमा से ज़्यादा साइज़ का जीपीयू बफ़र बनाते समय, DevTools कंसोल में लॉग किया गया गड़बड़ी का बेहतर मैसेज दिखाया गया है.

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

featureLevel की मदद से, Compatibility Mode को चालू करना

एक्सपेरिमेंट के तौर पर उपलब्ध, काम करने के तरीके के मोड में जीपीयू अडैप्टर का अनुरोध करने के लिए, स्टैंडर्ड featureLevel विकल्प को "compatibility" पर सेट करें. सिर्फ़ "core" (डिफ़ॉल्ट) और "compatibility" स्ट्रिंग की वैल्यू इस्तेमाल की जा सकती हैं. यहां दिया गया उदाहरण और स्पेसिफ़िकेशन PR 4897 देखें.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel विकल्प, नॉन-स्टैंडर्ड compatibilityMode विकल्प की जगह लेता है. वहीं, नॉन-स्टैंडर्ड featureLevel एट्रिब्यूट, isCompatibilityMode एट्रिब्यूट की जगह लेता है.

यह सुविधा अभी एक्सपेरिमेंट के तौर पर उपलब्ध है. इसलिए, फ़िलहाल आपको Chrome को chrome://flags/#enable-unsafe-webgpu पर "असुरक्षित WebGPU सहायता" फ़्लैग के साथ चलाना होगा. इसे आज़माने के लिए, webgpureport.org पर जाएं.

एक्सपेरिमेंट के तौर पर उपलब्ध सब-ग्रुप की सुविधाओं को हटाना

"chromium-experimental-subgroups" और "chromium-experimental-subgroup-uniform-control-flow" के सब-ग्रुप की एक्सपेरिमेंटल सुविधाएं हटा दी गई हैं. समस्या 377868468 देखें.

सबग्रुप के साथ प्रयोग करते समय, अब आपको "subgroups" एक्सपेरिमेंट के तौर पर उपलब्ध सुविधा की ही ज़रूरत है. "subgroups-f16" की एक्सपेरिमेंटल सुविधा बंद कर दी गई है और इसे जल्द ही हटा दिया जाएगा. जब आपका ऐप्लिकेशन "shader-f16" और "subgroups", दोनों सुविधाओं का अनुरोध करता है, तो सबग्रुप के साथ f16 वैल्यू का इस्तेमाल किया जा सकता है. समस्या 380244620 देखें.

maxInterStageShaderComponents की सीमा को बंद करना

maxInterStageShaderComponents की सीमा को कई वजहों से बंद कर दिया गया है:

  • maxInterStageShaderVariables के साथ डुप्लीकेटिटी: यह सीमा पहले से ही एक जैसे काम करती है. यह शेडर के चरणों के बीच भेजे गए डेटा की संख्या को कंट्रोल करती है.
  • मामूली अंतर: दोनों सीमाओं का हिसाब लगाने के तरीके में थोड़ा अंतर है. हालांकि, यह अंतर मामूली है और maxInterStageShaderVariables की सीमा के अंदर इसे असरदार तरीके से मैनेज किया जा सकता है.
  • आसान बनाना: maxInterStageShaderComponents को हटाने से शेडर इंटरफ़ेस को आसान बनाया जा सकता है. साथ ही, डेवलपर के लिए मुश्किलें भी कम हो जाती हैं. ज़्यादा अंतर वाली दो अलग-अलग सीमाओं को मैनेज करने के बजाय, वे ज़्यादा सही नाम और बेहतर maxInterStageShaderVariables पर फ़ोकस कर सकते हैं.

हमारा लक्ष्य, इसे Chrome 135 में पूरी तरह हटाना है. इस्तेमाल बंद करने का मकसद और समस्या 364338810 देखें.

Dawn के बारे में अपडेट

wgpu::Device::GetAdapterInfo(adapterInfo) की मदद से, सीधे wgpu::Device से अडैप्टर की जानकारी मिल सकती है. समस्या 376600838 देखें.

WGPUProgrammableStageDescriptor स्ट्रक्चर का नाम बदलकर WGPUComputeState कर दिया गया है, ताकि कैलकुलेट स्टेटस को वर्टिक्स और फ़्रैगमेंट स्टेटस के साथ अलाइन किया जा सके. समस्या 379059434 देखें.

wgpu::VertexStepMode::VertexBufferNotUsed की वैल्यू हटा दी गई है. इस्तेमाल नहीं किए गए वर्टिक्स बफ़र लेआउट को अब {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} के साथ दिखाया जा सकता है. समस्या 383147017 देखें.

इसमें सिर्फ़ कुछ खास हाइलाइट शामिल हैं. कमिट की पूरी सूची देखें.

WebGPU में नया क्या है

WebGPU में नया क्या है सीरीज़ में शामिल सभी चीज़ों की सूची.

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