Android पर WebGPU के साथ काम करना
Chrome टीम को यह बताते हुए खुशी हो रही है कि Qualcomm और ARM जीपीयू के साथ काम करने वाले, Android 12 और उसके बाद के वर्शन वाले डिवाइसों पर, अब Chrome 121 में WebGPU डिफ़ॉल्ट रूप से चालू हो गया है.
आने वाले समय में Android 11 पर काम करने वाले कई तरह के Android डिवाइसों के लिए, सहायता धीरे-धीरे बढ़ाई जाएगी. यह बदलाव, हार्डवेयर कॉन्फ़िगरेशन की बड़ी रेंज पर बिना किसी रुकावट के अनुभव पाने के लिए, टेस्टिंग और ऑप्टिमाइज़ेशन पर निर्भर करेगा. Chromium:1497815 से जुड़ी समस्या देखें.
Windows पर शेडर को कंपाइल करने के लिए, FXC के बजाय DXC का इस्तेमाल करें
Chrome अब SM6+ ग्राफ़िक्स हार्डवेयर से लैस Windows D3D12 मशीनों पर शेडर को कंपाइल करने के लिए DXC (DirectX कंपाइलर) की शक्ति का इस्तेमाल करता है. इससे पहले WebGPU, Windows पर शेडर को कंपाइल करने के लिए FXC (FX Compiler) का इस्तेमाल करता था. हालांकि, 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 ब्राउज़र में, "WebGPU डेवलपर सुविधाओं" को चालू करके, टाइमस्टैंप की संख्या दिखाने की सुविधा को बंद किया जा सकता है अपने ऐप्लिकेशन के डेवलपमेंट के दौरान chrome://flags/#enable-webgpu-developer-features
पर flag को फ़्लैग करें. इस बारे में ज़्यादा जानने के लिए, टाइमस्टैंप क्वेरी की संख्या देखें.
जीपीयू कभी-कभी टाइमस्टैंप काउंटर को रीसेट कर सकते हैं. इसकी वजह से, टाइमस्टैंप के बीच में नेगेटिव डेल्टा जैसी अनचाही वैल्यू दिख सकती हैं. इसलिए, हमारा सुझाव है कि आप git डिफ़रेंस में बदलाव करें. यह Compute Boids के यहां दिए गए सैंपल में, टाइमस्टैंप क्वेरी को सपोर्ट करने वाले टूल को जोड़ता है.
शेडर मॉड्यूल के लिए डिफ़ॉल्ट एंट्री पॉइंट
डेवलपर के अनुभव को बेहतर बनाने के लिए, अब कंप्यूट या रेंडरर पाइपलाइन बनाते समय अपने शेडर मॉड्यूल के entryPoint
को हटाया जा सकता है. अगर शेडर कोड में शेडर स्टेज के लिए कोई यूनीक एंट्री पॉइंट नहीं मिलता है, तो GPUValidationError ट्रिगर होगी. नीचे दिया गया उदाहरण और समस्या dawn: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 }] },
});
जीपीयू ExternalTexture कलर स्पेस के तौर पर 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
से जुड़ी जानकारी दिखाता है. जैसे, अडैप्टर पर उपलब्ध मेमोरी हीप का साइज़ और टाइप. एक्सपेरिमेंट के तौर पर उपलब्ध इस सुविधा को सिर्फ़ तब ऐक्सेस किया जा सकता है, जब "WebGPU डेवलपर के लिए सुविधाएं" chrome://flags/#enable-webgpu-developer-features
पर flag चालू है. नीचे दिया गया उदाहरण और समस्या सुबह: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) { /* ... */ }
}
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
डॉन से जुड़े अपडेट
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 मल्टीथ्रेड सुरक्षित, इंप्लिसिट डिवाइस सिंक्रोनाइज़ेशन, Norm16 टेक्सचर फ़ॉर्मैट, टाइमस्टैंप क्वेरी इनसाइड पास, Pixel लोकल स्टोरेज, शेडर फ़ॉर्मैट, और कई प्लानर फ़ॉर्मैट.
Chrome टीम ने Dwn के लिए आधिकारिक GitHub डेटा स्टोर करने की जगह बनाया है.
इसमें सिर्फ़ कुछ अहम हाइलाइट के बारे में बताया गया है. वादों की पूरी सूची देखें.
WebGPU में नया क्या है
WebGPU में नया क्या है सीरीज़ में शामिल सभी चीज़ों की सूची.
Chrome 128
- सबग्रुप के साथ एक्सपेरिमेंट करना
- लाइनों और पॉइंट के लिए, डेप्थ बायस की सेटिंग को बंद करना
- PauseDefault के तहत, कैप्चर नहीं की गई गड़बड़ी की चेतावनी छिपाएं
- WGSL, पहले सैंपलिंग को इंटरपोलेट करता है और दोनों में से किसी एक
- डॉन से जुड़े अपडेट
Chrome 127
- Android पर OpenGL ES के लिए प्रयोग के तौर पर उपलब्ध सहायता
- GPUAdapter की जानकारी वाला एट्रिब्यूट
- WebAssembly इंटरऑप में सुधार
- निर्देश एन्कोडर से जुड़ी बेहतर गड़बड़ियां
- डॉन से जुड़े अपडेट
Chrome 126
- maxTextureArraylayers की सीमा बढ़ाना
- Vulkan बैकएंड के लिए, बफ़र अपलोड को ऑप्टिमाइज़ करना
- समय को बेहतर बनाने के लिए शेडर इस्तेमाल करने की सुविधा
- सबमिट किए गए निर्देश के बफ़र, यूनीक होने चाहिए
- डॉन से जुड़े अपडेट
Chrome 125
Chrome 124
- रीड-ओनली और रीड-राइट स्टोरेज टेक्सचर
- सर्विस वर्कर और शेयर किए गए कर्मचारियों के लिए सहायता
- अडैप्टर की जानकारी देने वाले नए एट्रिब्यूट
- गड़बड़ियां ठीक की गईं
- डॉन से जुड़े अपडेट
Chrome 123
- WGSL में DP4a बिल्ट-इन फ़ंक्शन काम करते हैं
- WGSL में बिना पाबंदी वाले पॉइंटर पैरामीटर
- डब्ल्यूजीएसएल में कंपोज़िट को डीरेफ़रेंस करने के लिए सिंटैक्स शुगर
- स्टेंसल और डेप्थ के पहलुओं के लिए, रीड-ओनली स्टेटस अलग करना
- डॉन से जुड़े अपडेट
Chrome 122
- कंपैटबिलिटी मोड की मदद से, ज़्यादा से ज़्यादा लोगों तक पहुंचें (डेवलपमेंट में उपलब्ध सुविधा)
- maxVertexAttributes की सीमा बढ़ाना
- डॉन से जुड़े अपडेट
Chrome 121
- Android पर WebGPU के साथ काम करना
- Windows पर शेडर को कंपाइल करने के लिए, FXC के बजाय DXC का इस्तेमाल करना
- कंप्यूट और रेंडर में टाइमस्टैंप क्वेरी
- शेडर मॉड्यूल के लिए डिफ़ॉल्ट एंट्री पॉइंट
- GPExternalTexture कलर स्पेस के तौर पर Display-p3 का इस्तेमाल करना
- मेमोरी हीप की जानकारी
- डॉन से जुड़े अपडेट
Chrome 120
- WGSL में 16-बिट फ़्लोटिंग-पॉइंट वैल्यू के साथ काम करता है
- सीमाएं पार करें
- डेप्थ-स्टेंसिल की स्थिति में बदलाव
- अडैप्टर की जानकारी के अपडेट
- टाइमस्टैंप क्वेरी की गिनती करना
- वसंत साफ़ करने की सुविधाएं
Chrome 119
- फ़िल्टर किए जा सकने वाले 32-बिट फ़्लोट टेक्सचर
- unorm10-10-10-2 वर्टेक्स फ़ॉर्मैट
- आरजीबी10a2uint टेक्स्चर फ़ॉर्मैट
- डॉन से जुड़े अपडेट
Chrome 118
copyExternalImageToTexture()
में HTMLImageElement और ImageData सहायता- रीड-ओनली और रीड-ओनली स्टोरेज टेक्स्चर के लिए एक्सपेरिमेंट के तौर पर उपलब्ध सहायता
- डॉन से जुड़े अपडेट
Chrome 117
- वर्टेक्स बफ़र को अनसेट करें
- बाइंड किए गए ग्रुप को अनसेट करें
- डिवाइस खो जाने पर, एक साथ काम न करने वाली पाइपलाइन बनाने की वजह से होने वाली गड़बड़ियों की आवाज़ बंद करना
- SPIR-V शेडर मॉड्यूल बनाने से जुड़े अपडेट
- डेवलपर के अनुभव को बेहतर बनाना
- अपने-आप जनरेट होने वाले लेआउट की मदद से पाइपलाइन को कैश मेमोरी में सेव करना
- डॉन से जुड़े अपडेट
Chrome 116
- WebCodecs इंटिग्रेशन
- GPAdapter
requestDevice()
से खोया हुआ डिवाइस लौटाया गया - अगर
importExternalTexture()
चालू है, तो वीडियो बिना किसी रुकावट के चलाएं - खास जानकारी का पालन
- डेवलपर के अनुभव को बेहतर बनाना
- डॉन से जुड़े अपडेट
Chrome 115
- WGSL के साथ काम करने वाले भाषा एक्सटेंशन
- Direct3D 11 के लिए एक्सपेरिमेंट के तौर पर उपलब्ध सहायता
- एसी पावर पर, डिफ़ॉल्ट रूप से अलग-अलग जीपीयू पाएं
- डेवलपर के अनुभव को बेहतर बनाना
- डॉन से जुड़े अपडेट
Chrome 114
- JavaScript ऑप्टिमाइज़ करना
- कॉन्फ़िगर नहीं किए गए कैनवस पर getCurrentTexture() से अमान्य स्थिति गड़बड़ी मिलती है
- WGSL से जुड़े अपडेट
- डॉन से जुड़े अपडेट