WebGPU (Chrome 133) এ নতুন কি আছে

ফ্রাঁসোয়া বোফোর্ট
François Beaufort

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

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

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

অনির্ধারিত মান দিয়ে অজানা সীমা অনুরোধ করার অনুমতি দিন।

WebGPU API-এর বিবর্তনের সাথে সাথে এটিকে আরও স্থিতিশীল করার জন্য, এখন আপনি একটি GPU ডিভাইস অনুরোধ করার সময় undefined মান দিয়ে অজানা লিমিট অনুরোধ করতে পারবেন। উদাহরণস্বরূপ, নিম্নলিখিত অ্যাপ্লিকেশন কোডে এটি কার্যকর, যেখানে adapter.limits.someLimit undefined হতে পারে যদি someLimit আর কোনো অস্তিত্ব না থাকে। স্পেক 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 ভাষার ব্যবহারকে সহজ করে এবং এটিকে ফায়ারফক্স ও সাফারির সাথে আরও বেশি সামঞ্জস্যপূর্ণ করে তোলে। Tint, Naga, এবং WebKit কম্পাইলারগুলোর মধ্যে পার্থক্য দেখানো নমুনা কোড আপনি স্পেক PR- এ খুঁজে পাবেন।

বর্জনের মাধ্যমে WGSL-এর কর্মক্ষমতা বৃদ্ধি

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

বাহ্যিক টেক্সচারের জন্য VideoFrame displaySize ব্যবহার করুন

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

`copyExternalImageToTexture` ব্যবহার করে ডিফল্ট ওরিয়েন্টেশন ছাড়া অন্য ওরিয়েন্টেশনের ছবি পরিচালনা করুন।

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

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

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

আপনাকে সাহায্য করার জন্য, ত্রুটির বার্তাগুলিতে এমন ইঙ্গিত যোগ করে বিস্তারিত করা হয়েছে যা আপনাকে বলে দেবে যে requestDevice() কল করার সময় requiredLimits এ কোনো সীমা নির্দিষ্ট করা না থাকলে, স্পষ্টভাবে একটি উচ্চতর সীমার জন্য অনুরোধ করতে হবে। ইস্যু 42240683 দেখুন।

নিম্নলিখিত উদাহরণটি একটি উন্নত ত্রুটি বার্তা দেখায় যা ডিফল্ট সর্বোচ্চ বাফার আকারের ডিভাইস সীমা অতিক্রম করে একটি 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" স্ট্রিং দুটিই অনুমোদিত ভ্যালু। নিম্নলিখিত উদাহরণ এবং স্পেক 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 লিঙ্কে থাকা "Unsafe WebGPU Support" ফ্ল্যাগটি সহ ক্রোম চালাতে হবে। এটি নিয়ে পরীক্ষা-নিরীক্ষা করতে 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 উপর মনোযোগ দিতে পারে।

ক্রোম ১৩৫-এ এটিকে সম্পূর্ণরূপে অপসারণ করাই লক্ষ্য । বাতিল করার অভিপ্রায় এবং ইস্যু ৩৬৪৩৩৮৮১০ দেখুন।

ভোরের আপডেট

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

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

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

এখানে কেবল কয়েকটি মূল বিষয় তুলে ধরা হয়েছে। কমিটগুলোর বিস্তারিত তালিকাটি দেখুন।

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

'What's New in WebGPU' সিরিজে যা যা আলোচনা করা হয়েছে, তার একটি তালিকা।

ক্রোম ১৪৭-১৪৮

ক্রোম ১৪৬

ক্রোম ১৪৫

ক্রোম ১৪৪

ক্রোম ১৪৩

ক্রোম ১৪২

ক্রোম ১৪১

ক্রোম ১৪০

ক্রোম ১৩৯

ক্রোম ১৩৮

ক্রোম ১৩৭

ক্রোম ১৩৬

ক্রোম ১৩৫

ক্রোম ১৩৪

ক্রোম ১৩৩

ক্রোম ১৩২

ক্রোম ১৩১

ক্রোম ১৩০

ক্রোম ১২৯

ক্রোম ১২৮

ক্রোম ১২৭

ক্রোম ১২৬

ক্রোম ১২৫

ক্রোম ১২৪

ক্রোম ১২৩

ক্রোম ১২২

ক্রোম ১২১

ক্রোম ১২০

ক্রোম ১১৯

ক্রোম ১১৮

ক্রোম ১১৭

ক্রোম ১১৬

ক্রোম ১১৫

ক্রোম ১১৪

ক্রোম ১১৩