WebGPU-তে (Chrome 133) নতুন কী কী আছে

François Beaufort
François Beaufort

প্রকাশিত: ২৯ জানুয়ারি, ২০২৫

অতিরিক্ত unorm8x4-bgra এবং ১-কম্পোনেন্ট ভার্টেক্স ফর্ম্যাট

"unorm8x4-bgra" ভার্টেক্স ফর্ম্যাট এবং নিম্নলিখিত ১-কম্পোনেন্ট ভার্টেক্স ফর্ম্যাট যোগ করা হয়েছে: "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" এবং "float16". "unorm8x4-bgra" ভার্টেক্স ফর্ম্যাট একই শেডার রেখে BGRA এনকোড করা ভার্টেক্স কালার লোড করার ক্ষেত্রে এটিকে সামান্য বেশি সুবিধাজনক করে তোলে। এছাড়াও, ১-কম্পোনেন্ট ভার্টেক্স ফর্ম্যাট আপনাকে শুধুমাত্র সেই ডেটা অনুরোধ করতে দেয় যা আগে ৮ ও ১৬-বিট ডেটা টাইপের জন্য অন্তত দ্বিগুণ প্রয়োজন ছিল। chromestatus এন্ট্রি এবং issue 376924407 দেখুন।

অজানা সীমা, অনির্দিষ্ট ভ্যালু সহ অনুরোধ করার অনুমতি দিন

WebGPU API-কে আরও কম ভঙ্গুর করে তুলতে, GPU ডিভাইসের অনুরোধ করার সময় আপনি এখন undefined ভ্যালু সহ অজানা সীমা অনুরোধ করতে পারবেন। নিম্নলিখিত অ্যাপ্লিকেশন কোডের ক্ষেত্রে এটি উপযোগী, যেমন, someLimit আর না থাকলে adapter.limits.someLimit-এর জায়গায় undefined বসানো যেতে পারে। spec PR 4781 দেখুন।

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

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

WGSL অ্যালাইনমেন্ট সংক্রান্ত নিয়মে পরিবর্তন

কোনও স্ট্রাক্ট মেম্বারের জন্য খুব ছোট অ্যালাইনমেন্ট ভ্যালু আর দেওয়া যাবে না, কারণ এখন সব স্ট্রাক্টের জন্য @align(n)-কে RequiredAlignOf-কে ভাগ করতে হবে। এই ব্রেকিং পরিবর্তন WGSL ভাষার ব্যবহারকে আরও সহজ করে এবং এটি Firefox ও Safari-এর সাথে আরও মানানসই করে তোলে। আপনি স্পেক PR-এ Tint, Naga এবং WebKit কম্পাইলারের মধ্যে পার্থক্য দেখানো স্যাম্পেল কোড খুঁজে পেতে পারেন।

ডিসকার্ডের মাধ্যমে WGSL পারফর্ম্যান্সের উন্নতি

কমপ্লেক্স স্ক্রিন-স্পেস রিফ্লেকশন (SSR) এফেক্ট রেন্ডার করার সময় পারফর্ম্যান্স উল্লেখযোগ্যভাবে কমে যাওয়ার কারণে, ডিসকার্ড স্টেটমেন্ট প্রয়োগ করার সময় উপলভ্য হলে হেল্পার ইনভোকেশনকে ডিমোট করার জন্য প্ল্যাটফর্মের প্রদান করা সিম্যান্টিক্স ব্যবহার করা হয়। এটি ডিসকার্ড ব্যবহার করে এমন শেডারদের পারফর্ম্যান্স উন্নত করে। issue 372714384 দেখুন।

এক্সটার্নাল টেক্সচারের জন্য VideoFrame displaySize ব্যবহার করা

WebGPU স্পেসিফিকেশন অনুযায়ী VideoFrame ইমপোর্ট করার সময় displayWidth ও displayHeight ডাইমেনশনকে GPUExternalTexture-এর আপাত সাইজ হিসেবে ব্যবহার করা উচিত। তবে, textureLoad()-কে GPUExternalTexture-এ ব্যবহার করার চেষ্টা করার সময় ভুলভাবে দৃশ্যমান সাইজ ব্যবহার করার ফলে সমস্যা হয়েছে। এটি এখন ঠিক করা হয়েছে। issue 377574981 দেখুন।

copyExternalImageToTexture ব্যবহার করে ডিফল্ট নয় এমন ওরিয়েন্টেশন সহ ছবি ম্যানেজ করা

copyExternalImageToTexture() GPUQueue পদ্ধতিটি কোনও ছবি বা ক্যানভাসের কন্টেন্টকে টেক্সচারে কপি করতে ব্যবহৃত হয়। এটি এখন ডিফল্ট নয় এমন ওরিয়েন্টেশন সহ ছবি সঠিকভাবে ম্যানেজ করে। আগে এমনটি হত না, যখন সোর্স ছিল imageOrientation "from-image" সহ ImageBitmap অথবা ডিফল্ট নয় এমন ওরিয়েন্টেশন সহ ছবি। সমস্যা 384858956 দেখুন।

ডেভেলপার অভিজ্ঞতা উন্নত করা

adapter.limits-এ বেশি ভ্যালু দেখালে অবাক লাগতে পারে, কিন্তু GPU ডিভাইসের অনুরোধ করার সময় যে আপনাকে আরও বেশি সীমা স্পষ্টভাবে অনুরোধ করতে হবে, তা আপনি বুঝতে পারেন না। এটি না করলে, পরে অপ্রত্যাশিতভাবে সীমা অতিক্রম করে যেতে পারেন।

আপনাকে সাহায্য করতে, requiredLimits-এ কোনও সীমা উল্লেখ না করে requestDevice() কল করার সময়, আরও বেশি সীমা স্পষ্টভাবে অনুরোধ করার জন্য ইঙ্গিত সহ ত্রুটি মেসেজ আরও বিস্তারিত করা হয়েছে। সমস্যা ৪২২৪০৬৮৩ দেখুন।

নিচের উদাহরণে, ডিফল্ট সর্বাধিক বাফার সাইজ ডিভাইস সীমা অতিক্রম করে এমন সাইজের GPU বাফার তৈরি করার সময় 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-এর সাথে কম্প্যাটিবিলিটি মোড চালু করুন

স্ট্যান্ডার্ডাইজড featureLevel বিকল্পকে "compatibility" হিসেবে সেট করার মাধ্যমে এখন পরীক্ষামূলক কম্প্যাটিবিলিটি মোডে GPU অ্যাডাপ্টারের জন্য অনুরোধ করা সম্ভব। শুধুমাত্র "core" (ডিফল্ট) এবং "compatibility" স্ট্রিং ভ্যালু ব্যবহার করা যাবে। নিচের উদাহরণ ও spec 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://flags/#enable-unsafe-webgpu-এ "নিরাপদ নয় এমন WebGPU সহায়তা" ফ্ল্যাগ সহ Chrome চালাতে হবে। এটি নিয়ে খেলতে webgpureport.org দেখুন।

পরীক্ষামূলক সাবগ্রুপ ফিচার ক্লিন-আপ

বন্ধ করে দেওয়া "chromium-experimental-subgroups" ও "chromium-experimental-subgroup-uniform-control-flow" এক্সপেরিমেন্টাল সাবগ্রুপ ফিচার সরিয়ে দেওয়া হয়েছে। issue 377868468 দেখুন।

সাবগ্রুপ নিয়ে এক্সপেরিমেন্ট করার সময় এখন আপনার যা প্রয়োজন তা হল "subgroups" পরীক্ষামূলক ফিচার। "subgroups-f16" পরীক্ষামূলক ফিচারটি বন্ধ করা হয়েছে এবং শীঘ্রই সরিয়ে দেওয়া হবে। আপনার অ্যাপ্লিকেশন "shader-f16" ও "subgroups", দুটি ফিচারই চাইলে, আপনি সাবগ্রুপের সাথে f16 ভ্যালু ব্যবহার করতে পারবেন। issue 380244620 দেখুন।

maxInterStageShaderComponents সীমা বাতিল করা

বিভিন্ন কারণের জন্য maxInterStageShaderComponents সীমা আর ব্যবহার করা হয় না:

  • maxInterStageShaderVariables-এর সাথে রিডান্ডেন্সি: এই সীমাটি ইতিমধ্যেই একই ধরনের উদ্দেশ্য পূরণ করে, যা শেডার স্টেজের মধ্যে পাস করা ডেটার পরিমাণ নিয়ন্ত্রণ করে।
  • সামান্য পার্থক্য: দুটি সীমা গণনা করার পদ্ধতিতে সামান্য পার্থক্য থাকলেও, এই পার্থক্যগুলি সামান্য এবং maxInterStageShaderVariables সীমার মধ্যে কার্যকরভাবে ম্যানেজ করা যেতে পারে।
  • সরলীকরণ: maxInterStageShaderComponents সরিয়ে দিলে শেডার ইন্টারফেস আরও সহজ হয়ে যায় এবং ডেভেলপারদের জন্য জটিলতা কমে যায়। দুটি আলাদা আলাদা সীমা ম্যানেজ করার পরিবর্তে, তারা আরও উপযুক্ত নামযুক্ত এবং বিস্তারিত maxInterStageShaderVariables-এর উপর ফোকাস করতে পারে।

Chrome 135-এ এটি সম্পূর্ণভাবে সরিয়ে দেওয়াই হল লক্ষ্য। বন্ধ করার উদ্দেশ্য এবং সমস্যা 364338810 দেখুন।

ভোরের আপডেট

wgpu::Device::GetAdapterInfo(adapterInfo) আপনাকে সরাসরি wgpu::Device থেকে অ্যাডাপ্টার সংক্রান্ত তথ্য পেতে দেয়। issue 376600838 দেখুন।

কম্পিউট স্টেটকে ভার্টেক্স ও ফ্র্যাগমেন্ট স্টেটের সাথে সামঞ্জস্যপূর্ণ করতে WGPUProgrammableStageDescriptor struct-এর নাম পরিবর্তন করে WGPUComputeState করা হয়েছে। issue 379059434 দেখুন।

wgpu::VertexStepMode::VertexBufferNotUsed এনুম ভ্যালু সরিয়ে দেওয়া হয়েছে। ব্যবহার করা হয় না এমন ভার্টেক্স বাফার লেআউট এখন {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} দিয়ে প্রকাশ করা যাবে। issue 383147017 দেখুন।

এতে শুধু কিছু গুরুত্বপূর্ণ হাইলাইট কভার করা হয়েছে। কমিটের বিস্তারিত তালিকা দেখুন।

WebGPU-তে নতুন কী কী আছে

WebGPU-তে নতুন কী কী আছে সিরিজে যা যা কভার করা হয়েছে তার একটি তালিকা।

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

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