موارد جدید در WebGPU (Chrome 132)

فرانسوا بوفور
François Beaufort

تاریخ انتشار: 8 ژانویه 2025

استفاده از نمای بافت

نماهای بافت GPU در حال حاضر همه پرچم های استفاده را از بافت GPU منبع خود به ارث می برند. این می تواند مشکل ساز باشد زیرا برخی از قالب های نمایش با کاربردهای خاص ناسازگار هستند. برای رفع این مشکل، فراخوانی createView() با عضو اختیاری usage به شما امکان می‌دهد به صراحت زیرمجموعه‌ای از پرچم‌های استفاده بافت منبع را مشخص کنید که با فرمت view انتخابی سازگار است.

این تغییر به اعتبارسنجی اولیه و کنترل دقیق تری بر نحوه استفاده از نما اجازه می دهد. همچنین با دیگر APIهای گرافیکی که در آن پرچم‌های استفاده پارامترهای رایج در ایجاد نما هستند، همسو می‌شوند و فرصت‌های بهینه‌سازی را ارائه می‌دهند.

قطعه زیر، ورودی 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.
});

ترکیب بافت های شناور 32 بیتی

بافت‌های ممیز شناور ۳۲ بیتی برای رندر HDR ضروری هستند تا طیف وسیعی از مقادیر رنگ را حفظ کنند و از ایجاد باندهای رنگی جلوگیری کنند. برای مثال در تجسم علمی.

ویژگی جدید GPU "float32-blendable" بافت‌های GPU را با فرمت‌های "r32float" ، "rg32float" و "rgba32float" قابل ترکیب می‌کند. ایجاد یک خط لوله رندر که از ترکیب با هر پیوست با فرمت float32 استفاده می کند، اکنون هنگام درخواست یک دستگاه GPU با این ویژگی امکان پذیر است.

قطعه زیر، ورودی 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 در معرض دید قرار می گیرد. آنها مشابه ویژگی info GPUAdapter موجود هستند.

قطعه زیر، ورودی 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.
  }
}

پیکربندی بافت بوم با فرمت نامعتبر خطای جاوا اسکریپت را ایجاد می کند

قبلاً، استفاده از یک قالب بافت نامعتبر با متد configure() در زمینه بوم GPU منجر به یک خطای اعتبارسنجی GPU می شد. این برای ایجاد یک TypeError جاوا اسکریپت تغییر کرده است. این امر از سناریوهایی که در آن getCurrentTexture() یک بافت GPU معتبر برمی‌گرداند، با وجود پیکربندی نادرست بافت بوم GPU، جلوگیری می‌کند. اطلاعات بیشتر در شماره 372837859 موجود است.

فیلتر کردن محدودیت های نمونه بر روی بافت ها

استفاده از بافت‌های قالب "sint" ، "uint" و « depth" با فیلتر کردن نمونه‌ها قبلا مجاز بود. اکنون به درستی استفاده از بافت فرمت "sint" یا "uint" با یک نمونه‌گر فیلتر را غیرممکن می‌کند. توجه داشته باشید که در حال حاضر در صورت استفاده از بافت " depth" با یک نمونه‌گر فیلتر، هشداری صادر می‌کند، زیرا در آینده غیرمجاز خواهد بود. به شماره 376497143 مراجعه کنید.

این محدودیت‌ها به این معنی است که استفاده از بافت عمقی با یک نمونه‌گر غیرفیلترکننده نیازمند ایجاد دستی طرح‌بندی‌های گروه پیوند است. این به این دلیل است که طرح‌بندی‌های گروه bind ایجاد شده به صورت خودکار از این ترکیب پشتیبانی نمی‌کنند. شماره Spec 4952 شامل یک پیشنهاد در دست بررسی برای رفع این محدودیت در آینده است.

آزمایش زیرگروه های گسترده

آزمایش زیرگروه‌ها ، که ابتدا قرار بود در Chrome 131 به پایان برسد، به Chrome 133 تمدید شد و در 16 آوریل 2025 به پایان رسید. در حالی که اولین آزمایش اولیه روی عملکرد متمرکز بود، فاقد پادمان‌های مهم قابل حمل بودن بود. این پادمان‌ها اکنون اضافه می‌شوند و احتمالاً باعث ایجاد خطا در کد موجود می‌شوند.

بهبود تجربه توسعه دهندگان

هنگامی که گزینه powerPreference با requestAdapter() در ویندوز استفاده می شود، اکنون یک هشدار در DevTools قابل مشاهده است. زمانی که Chrome بداند چگونه از دو GPU مختلف استفاده کند و نتایج را بین آنها ترکیب کند، این هشدار حذف خواهد شد. شماره 369219127 را ببینید.

اندازه بافر GPU اکنون در پیام خطا هنگام ایجاد بافر GPU بسیار بزرگ وجود دارد. شماره 374167798 را ببینید.

پشتیبانی آزمایشی از فرمت‌های بافت عادی ۱۶ بیتی

فرمت‌های بافت نرمال‌شده با امضای 16 بیتی و عادی‌سازی‌شده بدون علامت اکنون به‌ترتیب در پشت ویژگی‌های GPU "chromium-experimental-snorm16-texture-formats" و "chromium-experimental-unorm16-texture-formats" به صورت آزمایشی در دسترس هستند، در حالی که آنها برای استانداردسازی مورد بحث قرار می‌گیرند. .

این ویژگی‌ها پشتیبانی از قالب‌های بافت عادی ۱۶ بیتی با قابلیت‌های COPY_SRC ، COPY_DST ، TEXTURE_BINDING ، RENDER_ATTACHMENT ، نمونه‌برداری چندگانه و قابلیت‌های حل را اضافه می‌کنند. قالب‌های اضافی عبارتند از: "r16unorm" ، "rg16unorm" "rgba16unorm" ، "r16snorm" ، "rg16snorm" ، "rg16snorm" و "rgba16snorm" .

تا زمانی که این ویژگی‌های آزمایشی استاندارد شوند، پرچم «پشتیبانی ناامن WebGPU» را در chrome://flags/#enable-unsafe-webgpu فعال کنید تا در Chrome در دسترس قرار گیرند.

قطعه و شماره 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...

به روز رسانی سحر

متدهای EnumerateFeatures(FeatureName * features) از wgpu::Adapter و wgpu::Device به نفع استفاده از GetFeatures(SupportedFeatures * features) منسوخ شده اند. به شماره 368672123 مراجعه کنید.

webgpu.h C API تمام char const * به یک ساختار WGPUStringView تغییر داده است که یک view را به یک رشته رمزگذاری شده UTF-8 تعریف می کند. مانند یک اشاره گر به داده های رشته، همراه با طول عمل می کند. این به شما امکان می دهد بدون نیاز به کپی کردن با بخش هایی از یک رشته کار کنید. به شماره 42241188 مراجعه کنید.

این تنها برخی از نکات کلیدی را پوشش می دهد. فهرست جامع تعهدات را بررسی کنید.

چه چیزی در WebGPU جدید است

فهرستی از همه چیزهایی که در سری What's New in WebGPU پوشش داده شده است.

کروم 132

کروم 131

کروم 130

کروم 129

کروم 128

کروم 127

کروم 126

کروم 125

کروم 124

کروم 123

کروم 122

کروم 121

کروم 120

کروم 119

کروم 118

کروم 117

کروم 116

کروم 115

کروم 114

کروم 113