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

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

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

টেক্সচার ভিউ ব্যবহার

জিপিইউ টেক্সচার ভিউগুলো বর্তমানে তাদের উৎস জিপিইউ টেক্সচার থেকে সমস্ত ইউসেজ ফ্ল্যাগ উত্তরাধিকার সূত্রে পায়। এটি একটি সমস্যা হতে পারে, কারণ কিছু ভিউ ফরম্যাট নির্দিষ্ট কিছু ইউসেজের সাথে সামঞ্জস্যপূর্ণ নয়। এই সমস্যাটির সমাধান করতে, ঐচ্ছিক usage মেম্বারসহ createView() কল করার মাধ্যমে আপনি উৎস টেক্সচারের ইউসেজ ফ্ল্যাগগুলোর এমন একটি উপসেট স্পষ্টভাবে নির্দিষ্ট করে দিতে পারেন, যা নির্বাচিত ভিউ ফরম্যাটের সাথে সামঞ্জস্যপূর্ণ।

এই পরিবর্তনটি আগাম যাচাইকরণ এবং ভিউটি কীভাবে ব্যবহৃত হবে তার উপর আরও সূক্ষ্ম নিয়ন্ত্রণের সুযোগ করে দেয়। এটি অন্যান্য গ্রাফিক্স এপিআই-এর সাথেও সামঞ্জস্যপূর্ণ, যেখানে ভিউ তৈরির ক্ষেত্রে ইউসেজ ফ্ল্যাগগুলো সাধারণ প্যারামিটার হিসেবে ব্যবহৃত হয়, যা অপটিমাইজেশনের সুযোগ তৈরি করে।

নিম্নলিখিত স্নিপেট, chromestatus এন্ট্রি এবং ইস্যু 363903526 দেখুন।

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

৩২-বিট ফ্লোট টেক্সচার ব্লেন্ডিং

রঙের বিস্তৃত পরিসর বজায় রাখতে এবং কালার ব্যান্ডিং আর্টিফ্যাক্ট প্রতিরোধ করতে HDR রেন্ডারিংয়ের জন্য ৩২-বিট ফ্লোটিং-পয়েন্ট টেক্সচার অপরিহার্য। উদাহরণস্বরূপ, বৈজ্ঞানিক ভিজ্যুয়ালাইজেশনে।

নতুন "float32-blendable" GPU ফিচারটি "r32float" , "rg32float" , এবং "rgba32float" ফরম্যাটের GPU টেক্সচারগুলোকে ব্লেন্ডেবল করে তোলে। এই ফিচারসহ একটি GPU ডিভাইস অনুরোধ করার সময়, এখন যেকোনো float32-ফরম্যাটের অ্যাটাচমেন্ট ব্যবহার করে ব্লেন্ডিংয়ের মাধ্যমে একটি রেন্ডার পাইপলাইন তৈরি করা সম্ভব।

নিম্নলিখিত স্নিপেট, chromestatus এন্ট্রি এবং ইস্যু 369649348 দেখুন।

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice adapterInfo অ্যাট্রিবিউট

যেসব লাইব্রেরি ব্যবহারকারীর দেওয়া GPUDevice অবজেক্ট গ্রহণ করে, তাদের জন্য ফিজিক্যাল GPU সম্পর্কিত তথ্য অ্যাক্সেস করা গুরুত্বপূর্ণ, কারণ GPU আর্কিটেকচারের উপর ভিত্তি করে তাদের অপটিমাইজ বা ওয়ার্কঅ্যারাউন্ড প্রয়োগ করার প্রয়োজন হতে পারে। যদিও GPUAdapter অবজেক্টের মাধ্যমে এই তথ্য অ্যাক্সেস করা সম্ভব, শুধুমাত্র একটি GPUDevice থেকে সরাসরি এটি পাওয়ার কোনো উপায় নেই। এটি অসুবিধাজনক হতে পারে, কারণ এর জন্য ব্যবহারকারীদের GPUDevice পাশাপাশি অতিরিক্ত তথ্যও প্রদান করতে হতে পারে।

এই সমস্যার সমাধান করতে, GPUAdapterInfo এখন GPUDevice adapterInfo অ্যাট্রিবিউটের মাধ্যমে প্রকাশ করা হয়েছে। এগুলো বিদ্যমান GPUAdapter info অ্যাট্রিবিউটের অনুরূপ।

নিম্নলিখিত স্নিপেট, chromestatus এন্ট্রি এবং ইস্যু 376600838 দেখুন।

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

ভুল ফরম্যাটে ক্যানভাস কনটেক্সট কনফিগার করলে জাভাস্ক্রিপ্ট ত্রুটি দেখা দেয়।

পূর্বে, GPU ক্যানভাস কনটেক্সট-এর configure() মেথডে একটি অবৈধ টেক্সচার ফরম্যাট ব্যবহার করলে একটি GPU ভ্যালিডেশন এরর দেখা দিত। এটিকে পরিবর্তন করে এখন একটি JavaScript TypeError থ্রো করা হয়। এর ফলে এমন পরিস্থিতি আর হয় না যেখানে GPU ক্যানভাস কনটেক্সট ভুলভাবে কনফিগার করা থাকা সত্ত্বেও getCurrentTexture() একটি বৈধ GPU টেক্সচার রিটার্ন করে। এ বিষয়ে আরও তথ্য ইস্যু 372837859- এ পাওয়া যাবে।

টেক্সচারের উপর ফিল্টারিং স্যাম্পলারের সীমাবদ্ধতা

পূর্বে ফিল্টারিং স্যাম্পলারের সাথে "sint" , "uint" , এবং " depth" ফরম্যাটের টেক্সচার ব্যবহার করার অনুমতি ছিল। এখন ফিল্টারিং স্যাম্পলারের সাথে "sint" বা "uint" ফরম্যাটের টেক্সচার ব্যবহার করা সঠিকভাবে নিষিদ্ধ করা হয়েছে। উল্লেখ্য যে, বর্তমানে ফিল্টারিং স্যাম্পলারের সাথে " depth" টেক্সচার ব্যবহার করলে এটি একটি সতর্কবার্তা দেয়, কারণ ভবিষ্যতে এটি নিষিদ্ধ করা হবে। ইস্যু 376497143 দেখুন।

এই সীমাবদ্ধতাগুলোর কারণে, একটি নন-ফিল্টারিং স্যাম্পলারের সাথে ডেপথ টেক্সচার ব্যবহার করতে হলে বাইন্ড গ্রুপ লেআউট ম্যানুয়ালি তৈরি করতে হয়। এর কারণ হলো, "স্বয়ংক্রিয়ভাবে" তৈরি হওয়া বাইন্ড গ্রুপ লেআউটগুলো এখনও এই সংমিশ্রণটি সমর্থন করে না। ভবিষ্যতে এই সীমাবদ্ধতাটি সমাধানের জন্য স্পেক ইস্যু ৪৯৫২-তে একটি প্রস্তাবনা বিবেচনাধীন রয়েছে।

বর্ধিত উপগোষ্ঠী পরীক্ষা

সাবগ্রুপ পরীক্ষা-নিরীক্ষা , যা প্রাথমিকভাবে ক্রোম ১৩১-এ শেষ হওয়ার কথা ছিল, তা ক্রোম ১৩৩ পর্যন্ত বাড়ানো হয়েছে এবং ২০২৫ সালের ১৬ই এপ্রিল এটি শেষ হবে। যদিও প্রথম অরিজিন ট্রায়ালটি পারফরম্যান্সের উপর দৃষ্টি নিবদ্ধ করেছিল, এতে গুরুত্বপূর্ণ পোর্টেবিলিটি সুরক্ষাব্যবস্থার অভাব ছিল। এই সুরক্ষাব্যবস্থাগুলো এখন যোগ করা হবে, যা বিদ্যমান কোডে সম্ভাব্য ত্রুটি সৃষ্টি করতে পারে।

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

উইন্ডোজে requestAdapter() এর সাথে powerPreference অপশনটি ব্যবহার করলে এখন DevTools-এ একটি সতর্কবার্তা দেখা যায়। যখন Chrome দুটি ভিন্ন GPU ব্যবহার করতে এবং সেগুলোর মধ্যে ফলাফল একত্রিত করতে শিখবে, তখন এই সতর্কবার্তাটি দূর হয়ে যাবে। ইস্যু 369219127 দেখুন।

প্রয়োজনের চেয়ে বড় জিপিইউ বাফার তৈরি করার ক্ষেত্রে, এখন থেকে এরর মেসেজে জিপিইউ বাফারের সাইজ উল্লেখ করা থাকবে। ইস্যু ৩৭৪১৬৭৭৯৮ দেখুন।

১৬-বিট নর্মালাইজড টেক্সচার ফরম্যাটের জন্য পরীক্ষামূলক সমর্থন

প্রমিতকরণের জন্য আলোচনা চলাকালীন, ১৬-বিট সাইনড নর্মালাইজড এবং আনসাইনড নর্মালাইজড টেক্সচার ফরম্যাটগুলো এখন যথাক্রমে "chromium-experimental-snorm16-texture-formats" এবং "chromium-experimental-unorm16-texture-formats" জিপিইউ ফিচারগুলোর অধীনে পরীক্ষামূলকভাবে উপলব্ধ রয়েছে।

এই ফিচারগুলো COPY_SRC , COPY_DST , TEXTURE_BINDING , RENDER_ATTACHMENT ব্যবহারের পাশাপাশি মাল্টিস্যাম্পলিং এবং রিজলভিং সক্ষমতাসহ ১৬-বিট নর্মালাইজড টেক্সচার ফরম্যাটের জন্য সাপোর্ট যোগ করে। অতিরিক্ত ফরম্যাটগুলো হলো "r16unorm" , "rg16unorm" , "rgba16unorm" , "r16snorm" , "rg16snorm" এবং "rgba16snorm"

এই পরীক্ষামূলক বৈশিষ্ট্যগুলি প্রমিত না হওয়া পর্যন্ত, Chrome-এ এগুলি উপলব্ধ করতে chrome://flags/#enable-unsafe-webgpu "Unsafe WebGPU Support" ফ্ল্যাগটি সক্রিয় করুন।

নিম্নলিখিত স্নিপেট এবং ইস্যু 374790898 দেখুন।

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

ভোরের আপডেট

wgpu::Adapter এবং wgpu::Device এর EnumerateFeatures(FeatureName * features) মেথডগুলো এখন আর ব্যবহার করা হয় না এবং এর পরিবর্তে GetFeatures(SupportedFeatures * features) ব্যবহার করা হয়। ইস্যু 368672123 দেখুন।

webgpu.h C API-টি সমস্ত char const * কে একটি WGPUStringView স্ট্রাকচারে পরিবর্তন করেছে, যা একটি UTF-8 এনকোডেড স্ট্রিং-এ একটি ভিউ সংজ্ঞায়িত করে। এটি স্ট্রিং-এর ডেটার একটি পয়েন্টারের মতো কাজ করে, যার সাথে একটি দৈর্ঘ্যও যুক্ত থাকে। এর ফলে, কোনো স্ট্রিং কপি না করেই তার অংশবিশেষ নিয়ে কাজ করা যায়। ইস্যু 42241188 দেখুন।

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

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

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

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

ক্রোম ১৪৬

ক্রোম ১৪৫

ক্রোম ১৪৪

ক্রোম ১৪৩

ক্রোম ১৪২

ক্রোম ১৪১

ক্রোম ১৪০

ক্রোম ১৩৯

ক্রোম ১৩৮

ক্রোম ১৩৭

ক্রোম ১৩৬

ক্রোম ১৩৫

ক্রোম ১৩৪

ক্রোম ১৩৩

ক্রোম ১৩২

ক্রোম ১৩১

ক্রোম ১৩০

ক্রোম ১২৯

ক্রোম ১২৮

ক্রোম ১২৭

ক্রোম ১২৬

ক্রোম ১২৫

ক্রোম ১২৪

ক্রোম ১২৩

ক্রোম ১২২

ক্রোম ১২১

ক্রোম ১২০

ক্রোম ১১৯

ক্রোম ১১৮

ক্রোম ১১৭

ক্রোম ১১৬

ক্রোম ১১৫

ক্রোম ১১৪

ক্রোম ১১৩