Android पर WebGPU की मदद करना
Chrome टीम को यह बताते हुए खुशी हो रही है कि Android 12 और Qualcomm और ARM जीपीयू वाले डिवाइसों पर WebGPU, Chrome 121 में डिफ़ॉल्ट रूप से चालू हो गया है.
आने वाले समय में, Android 11 पर काम करने वाले कई तरह के Android डिवाइसों के लिए, सहायता सेवा धीरे-धीरे अन्य डिवाइसों के साथ उपलब्ध होगी. यह सुविधा आने वाले समय में की जाने वाली टेस्टिंग और ऑप्टिमाइज़ेशन पर निर्भर करेगी. इससे यह पक्का किया जा सकेगा कि हार्डवेयर कॉन्फ़िगरेशन की बड़ी रेंज पर उपयोगकर्ताओं को बेहतरीन अनुभव मिले. Chromium समस्या:1497815 देखें.
Windows पर शेडर कंपाइलेशन के लिए, FXC के बजाय DXC का इस्तेमाल करें
Chrome अब SM6+ ग्राफ़िक हार्डवेयर से लैस Windows D3D12 मशीनों पर शेडर कंपाइल करने के लिए, DXC (DirectX Compiler) की क्षमता का इस्तेमाल करता है. पहले WebGPU, Windows पर शेडर कंपाइलेशन के लिए, FXC (एफ़एक्स कंपाइलर) का इस्तेमाल करता था. फ़ंक्शनल होने के दौरान, FXC के पास DXC में मौजूद फ़ीचर सेट और परफ़ॉर्मेंस ऑप्टिमाइज़ेशन की सुविधा नहीं थी.
शुरुआती टेस्टिंग से पता चलता है कि FXC की तुलना में, DXC का इस्तेमाल करने पर, कंप्यूट शेडर की कंपाइलेशन स्पीड में औसतन 20% की बढ़ोतरी होती है.
कंप्यूट और रेंडर पास में टाइमस्टैंप क्वेरी
टाइमस्टैंप क्वेरी की मदद से WebGPU, सटीक तौर पर (नैनोसेकंड तक) यह माप सकता है कि उनके जीपीयू कमांड, कंप्यूट और रेंडर पास को एक्ज़ीक्यूट करने में कितना समय लेते हैं. जीपीयू वर्कलोड की परफ़ॉर्मेंस और उनके काम करने के तरीके की अहम जानकारी पाने के लिए, इनका बहुत ज़्यादा इस्तेमाल किया जाता है.
GPUAdapter
में "timestamp-query"
सुविधा उपलब्ध होने पर, अब ये काम किए जा सकते हैं:
"timestamp-query"
सुविधा वालेGPUDevice
का अनुरोध करें."timestamp"
टाइप काGPUQuerySet
बनाएं.GPUQuerySet
में टाइमस्टैंप की वैल्यू लिखने की जगह तय करने के लिए,GPUComputePassDescriptor.timestampWrites
औरGPURenderPassDescriptor.timestampWrites
का इस्तेमाल करें.resolveQuerySet()
की मदद से, टाइमस्टैंप की वैल्यू कोGPUBuffer
में रिज़ॉल्व करें.GPUBuffer
से सीपीयू में नतीजों को कॉपी करके, टाइमस्टैंप की वैल्यू फिर से पढ़ें.- टाइमस्टैंप की वैल्यू को
BigInt64Array
के तौर पर डिकोड करें.
नीचे दिया गया उदाहरण देखें और समस्या dawn:1800 देखें.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("timestamp-query")) {
throw new Error("Timestamp query feature is not available");
}
// Explicitly request timestamp query feature.
const device = await adapter.requestDevice({
requiredFeatures: ["timestamp-query"],
});
const commandEncoder = device.createCommandEncoder();
// Create a GPUQuerySet which holds 2 timestamp query results: one for the
// beginning and one for the end of compute pass execution.
const querySet = device.createQuerySet({ type: "timestamp", count: 2 });
const timestampWrites = {
querySet,
beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins.
endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends.
};
const passEncoder = commandEncoder.beginComputePass({ timestampWrites });
// TODO: Set pipeline, bind group, and dispatch work to be performed.
passEncoder.end();
// Resolve timestamps in nanoseconds as a 64-bit unsigned integer into a GPUBuffer.
const size = 2 * BigInt64Array.BYTES_PER_ELEMENT;
const resolveBuffer = device.createBuffer({
size,
usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
});
commandEncoder.resolveQuerySet(querySet, 0, 2, resolveBuffer, 0);
// Read GPUBuffer memory.
const resultBuffer = device.createBuffer({
size,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});
commandEncoder.copyBufferToBuffer(resolveBuffer, 0, resultBuffer, 0, size);
// Submit commands to the GPU.
device.queue.submit([commandEncoder.finish()]);
// Log compute pass duration in nanoseconds.
await resultBuffer.mapAsync(GPUMapMode.READ);
const times = new BigInt64Array(resultBuffer.getMappedRange());
console.log(`Compute pass duration: ${Number(times[1] - times[0])}ns`);
resultBuffer.unmap();
टाइम अटैक से जुड़ी समस्याओं की वजह से, टाइमस्टैंप क्वेरी को 100 माइक्रोसेकंड के रिज़ॉल्यूशन में मापा जाता है. इससे सटीक और सुरक्षित तरीके से काम करने में मदद मिलती है. Chrome ब्राउज़र में, ऐप्लिकेशन के डेवलपमेंट के दौरान chrome://flags/#enable-webgpu-developer-features
पर "WebGPU डेवलपर सुविधाएं" फ़्लैग को चालू करके, टाइमस्टैंप की संख्या तय करने की सुविधा बंद की जा सकती है. ज़्यादा जानने के लिए, टाइमस्टैंप क्वेरी को कैलकुलेट करने की सुविधा देखें.
जीपीयू, समय-समय पर टाइमस्टैंप काउंटर को रीसेट कर सकते हैं. इस वजह से, टाइमस्टैंप के बीच नेगेटिव डेल्टा जैसी अनचाही वैल्यू दिख सकती हैं. इसलिए, हमारा सुझाव है कि आप गिट डिफ़र में बदलाव देखें. इसकी मदद से, यहां दिए गए Compute Boids सैंपल के लिए, टाइमस्टैंप क्वेरी की सुविधा जोड़ी जाती है.
शेडर मॉड्यूल के लिए डिफ़ॉल्ट एंट्री पॉइंट
डेवलपर के अनुभव को बेहतर बनाने के लिए, अब कंप्यूट या रेंडर पाइपलाइन बनाते समय अपने शेडर मॉड्यूल के entryPoint
को हटाया जा सकता है. अगर शेडर कोड में शेडर स्टेज के लिए कोई यूनीक एंट्री पॉइंट नहीं मिलता, तो GPUValidationError को ट्रिगर किया जाएगा. नीचे दिया गया उदाहरण देखें और जारी करने का समय:2254.
const code = `
@vertex fn vertexMain(@builtin(vertex_index) i : u32) ->
@builtin(position) vec4f {
const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
return vec4f(pos[i], 0, 1);
}
@fragment fn fragmentMain() -> @location(0) vec4f {
return vec4f(1, 0, 0, 1);
}`;
const module = myDevice.createShaderModule({ code });
const format = navigator.gpu.getPreferredCanvasFormat();
const pipeline = await myDevice.createRenderPipelineAsync({
layout: "auto",
vertex: { module, entryPoint: "vertexMain" },
fragment: { module, entryPoint: "fragmentMain", targets: [{ format }] },
vertex: { module },
fragment: { module, targets: [{ format }] },
});
जीपीयूएक्सटर्नल टेक्सचर कलर स्पेस के तौर पर Display-p3 के साथ काम करता है
अब importExternalTexture()
की मदद से एचडीआर वीडियो से GPUExternalTexture इंपोर्ट करते समय, "display-p3"
डेस्टिनेशन कलर स्पेस सेट किया जा सकता है. जानें कि WebGPU, कलर स्पेस को कैसे मैनेज करता है. यह उदाहरण देखें और Chromium:1330250 से जुड़ी समस्या देखें.
// Create texture from HDR video.
const video = document.querySelector("video");
const texture = myDevice.importExternalTexture({
source: video,
colorSpace: "display-p3",
});
मेमोरी के हीप की जानकारी
ऐप्लिकेशन डेवलपमेंट के दौरान ज़्यादा स्टोरेज असाइन करते समय, मेमोरी की सीमाओं का अनुमान लगाने में आपकी मदद करने के लिए, requestAdapterInfo()
अब memoryHeaps
की जानकारी दिखाता है. जैसे, अडैप्टर में उपलब्ध मेमोरी के हीप का साइज़ और टाइप. एक्सपेरिमेंट के तौर पर उपलब्ध इस सुविधा को सिर्फ़ तब ऐक्सेस किया जा सकता है, जब chrome://flags/#enable-webgpu-developer-features
पर मौजूद "WebGPU डेवलपर सुविधाएं" फ़्लैग को चालू किया गया हो. नीचे दिया गया उदाहरण देखें और जारी करने का समय:2249.
const adapter = await navigator.gpu.requestAdapter();
const adapterInfo = await adapter.requestAdapterInfo();
for (const { size, properties } of adapterInfo.memoryHeaps) {
console.log(size); // memory heap size in bytes
if (properties & GPUHeapProperty.DEVICE_LOCAL) { /* ... */ }
if (properties & GPUHeapProperty.HOST_VISIBLE) { /* ... */ }
if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
if (properties & GPUHeapProperty.HOST_CACHED) { /* ... */ }
}
Dawn के अपडेट
WGSL भाषा की सुविधाओं को मैनेज करने के लिए, wgpu::Instance
पर HasWGSLLanguageFeature
और EnumerateWGSLLanguageFeatures
तरीके जोड़े गए हैं. समस्या dawn:2260 देखें.
नॉन-स्टैंडर्ड wgpu::Feature::BufferMapExtendedUsages
सुविधा से आपको wgpu::BufferUsage::MapRead
या wgpu::BufferUsage::MapWrite
और किसी दूसरे wgpu::BufferUsage
के साथ जीपीयू बफ़र बनाने की सुविधा मिलती है. नीचे दिया गया उदाहरण देखें और समस्या dawn:2204 देखें.
wgpu::BufferDescriptor descriptor = {
.size = 128,
.usage = wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::Uniform
};
wgpu::Buffer uniformBuffer = device.CreateBuffer(&descriptor);
uniformBuffer.MapAsync(wgpu::MapMode::Write, 0, 128,
[](WGPUBufferMapAsyncStatus status, void* userdata)
{
wgpu::Buffer* buffer = static_cast<wgpu::Buffer*>(userdata);
memcpy(buffer->GetMappedRange(), data, sizeof(data));
},
&uniformBuffer);
ये सुविधाएं दस्तावेज़ में मौजूद हैं: ANGLE टेक्सचर शेयरिंग, D3D11 मल्टीथ्रेड सुरक्षित, Implicit डिवाइस सिंक्रोनाइज़ेशन, Norm16 टेक्सचर फ़ॉर्मैट, टाइमस्टैंप क्वेरी इनसाइड पास, Pixel लोकल स्टोरेज, शेडर की सुविधाएं, और मल्टी प्लानर फ़ॉर्मैट.
Chrome टीम ने dawn के लिए आधिकारिक GitHub डेटा स्टोर करने की जगह बनाई है.
इसमें सिर्फ़ कुछ खास बातों के बारे में बताया गया है. कमियों की पूरी सूची देखें.
WebGPU में नया क्या है
WebGPU में नया क्या है सीरीज़ में शामिल सभी चीज़ों की सूची.
Chrome 125
Chrome 124
- रीड-ओनली और रीड-राइट स्टोरेज टेक्सचर
- सर्विस वर्कर और कर्मचारियों से जुड़ी सहायता
- अडैप्टर की जानकारी से जुड़े नए एट्रिब्यूट
- गड़बड़ियां ठीक करना
- Dawn के बारे में अपडेट
Chrome 123
- DP4a में पहले से मौजूद फ़ंक्शन, WGSL में काम करते हैं
- WGSL में बिना पाबंदी वाले पॉइंटर पैरामीटर
- WGSL में डिफ़रेंसिंग कंपोज़िट के लिए सिंटैक्स शुगर
- स्टेंसिल और गहराई के पहलुओं के लिए अलग-अलग रीड-ओनली मोड
- Dawn के बारे में अपडेट
Chrome 122
- कपैसिटी मोड की मदद से पहुंच बढ़ाना (यह सुविधा अभी डेवलप की जा रही है)
- maxVertexAttributes की सीमा बढ़ाएं
- Dawn के बारे में अपडेट
Chrome 121
- Android पर WebGPU की मदद करना
- Windows पर शेडर कंपाइलेशन के लिए, FXC के बजाय DXC का इस्तेमाल करना
- कंप्यूट और रेंडर पास में टाइमस्टैंप क्वेरी
- शेडर मॉड्यूल के लिए डिफ़ॉल्ट एंट्री पॉइंट
- Display-p3 को जीपीयूएक्सटर्नल टेक्सचर कलर स्पेस के तौर पर इस्तेमाल करें
- मेमोरी के हीप की जानकारी
- Dawn के बारे में अपडेट
Chrome 120
- WGSL में 16-बिट फ़्लोटिंग-पॉइंट वैल्यू के साथ काम करता है
- सीमाएं पूरी करें
- डेप्थ-स्टेंसिल के स्टेटस में बदलाव
- अडैप्टर की जानकारी से जुड़े अपडेट
- टाइमस्टैंप क्वेरी को कैलकुलेट करना
- वसंत की सफ़ाई से जुड़ी सुविधाएं
Chrome 119
- फ़िल्टर की जा सकने वाली 32-बिट फ़्लोट टेक्सचर
- unorm10-10-10-2 वर्टेक्स फ़ॉर्मैट
- debug10a2uint टेक्सचर फ़ॉर्मैट
- Dawn के बारे में अपडेट
Chrome 118
copyExternalImageToTexture()
में HTMLImageElement और ImageData से जुड़ी सहायता- रीड-राइट और रीड-ओनली स्टोरेज टेक्सचर के लिए एक्सपेरिमेंट के तौर पर काम करने की सुविधा
- Dawn के बारे में अपडेट
Chrome 117
- वर्टेक्स बफ़र को अनसेट करें
- बाइंड ग्रुप को अनसेट करें
- डिवाइस खो जाने पर, एक साथ काम नहीं करने वाली पाइपलाइन बनने से जुड़ी गड़बड़ियों की आवाज़ बंद करना
- SPIR-V शेडर मॉड्यूल बनाने के बारे में अपडेट
- डेवलपर के अनुभव को बेहतर बनाना
- अपने-आप जनरेट हुए लेआउट की मदद से पाइपलाइन को कैश मेमोरी में सेव करना
- Dawn के बारे में अपडेट
Chrome 116
- WebCodecs इंटिग्रेशन
- जीपीयू अडैप्टर
requestDevice()
से मिला खोया हुआ डिवाइस - अगर
importExternalTexture()
कॉल किया जा रहा है, तो वीडियो बिना किसी रुकावट के चलाएं - खास जानकारी का पालन
- डेवलपर के अनुभव को बेहतर बनाना
- Dawn के बारे में अपडेट
Chrome 115
- इसके साथ काम करने वाले WGSL भाषा एक्सटेंशन
- Direct3D 11 के लिए एक्सपेरिमेंटल सहायता
- एसी पावर पर डिफ़ॉल्ट रूप से डिस्क्रीट जीपीयू पाएं
- डेवलपर के अनुभव को बेहतर बनाना
- Dawn के बारे में अपडेट
Chrome 114
- JavaScript को ऑप्टिमाइज़ करना
- कॉन्फ़िगर नहीं किए गए कैनवस पर getCurrentTexture(), अमान्य राज्य गड़बड़ी देता है
- WGSL से जुड़े अपडेट
- Dawn के बारे में अपडेट