มีอะไรใหม่ใน WebGPU (Chrome 132)

François Beaufort
François Beaufort

เผยแพร่เมื่อวันที่ 8 มกราคม 2025

การใช้มุมมองพื้นผิว

ปัจจุบันมุมมองพื้นผิว GPU จะรับค่าแฟล็กการใช้งานทั้งหมดมาจากพื้นผิว GPU ต้นทาง ซึ่งอาจทำให้เกิดปัญหาได้เนื่องจากรูปแบบมุมมองบางรูปแบบใช้ร่วมกับการใช้งานบางอย่างไม่ได้ วิธีแก้ปัญหานี้คือ การเรียกใช้ createView() ด้วยสมาชิก usage (ไม่บังคับ) ช่วยให้คุณระบุชุดย่อยของ Flag การใช้งานของพื้นผิวต้นทางที่เข้ากันได้กับรูปแบบมุมมองที่เลือกได้อย่างชัดเจน

การเปลี่ยนแปลงนี้ช่วยให้สามารถตรวจสอบล่วงหน้าและควบคุมวิธีใช้มุมมองได้อย่างละเอียดยิ่งขึ้น นอกจากนี้ ยังสอดคล้องกับ API กราฟิกอื่นๆ ที่ Flag การใช้งานเป็นพารามิเตอร์ทั่วไปในการสร้างมุมมอง ซึ่งเปิดโอกาสให้เพิ่มประสิทธิภาพ

ดูข้อมูลโค้ดต่อไปนี้ รายการ 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 บิต

พื้นผิวแบบจุดลอยตัว 32 บิตเป็นสิ่งจำเป็นสำหรับการเรนเดอร์ HDR เพื่อรักษาค่าสีที่หลากหลายและป้องกันข้อบกพร่องของแถบสี เช่น ในการแสดงภาพทางวิทยาศาสตร์

ฟีเจอร์ "float32-blendable" GPU ใหม่ช่วยให้สามารถผสมผสานพื้นผิว 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 ซึ่งคล้ายกับแอตทริบิวต์ 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.
  }
}

การกําหนดค่าบริบท Canvas ด้วยรูปแบบที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาด JavaScript

ก่อนหน้านี้ การใช้รูปแบบพื้นผิวที่ไม่ถูกต้องกับเมธอด configure() ของบริบทแคนวาส GPU จะทำให้เกิดข้อผิดพลาดในการตรวจสอบ GPU การดำเนินการนี้เปลี่ยนเป็นการโยน JavaScript TypeError วิธีนี้จะช่วยป้องกันไม่ให้มีกรณีที่ getCurrentTexture() แสดงผลพื้นผิว GPU ที่ถูกต้องแม้ว่าบริบทของผืนผ้าใบ GPU จะได้รับการกําหนดค่าไม่ถูกต้องก็ตาม ดูข้อมูลเพิ่มเติมได้ในปัญหา 372837859

การกรองข้อจำกัดของตัวสุ่มตัวอย่างในพื้นผิว

ก่อนหน้านี้อนุญาตให้ใช้พื้นผิวรูปแบบ "sint", "uint" และ "depth"" ที่มีตัวอย่างการกรอง ตอนนี้ไม่อนุญาตให้ใช้พื้นผิวรูปแบบ "sint" หรือ "uint" กับเครื่องสุ่มตัวอย่างการกรองอย่างถูกต้องแล้ว โปรดทราบว่าขณะนี้ระบบจะแสดงคำเตือนหากคุณใช้พื้นผิว "depth"" ที่มีเครื่องมือสุ่มตัวอย่างการกรอง เนื่องจากระบบจะไม่อนุญาตให้ใช้ในอนาคต ดูปัญหา 376497143

ข้อจำกัดเหล่านี้หมายความว่าการใช้พื้นผิวความลึกกับเครื่องสุ่มตัวอย่างที่ไม่กรองจะต้องสร้างเลย์เอาต์กลุ่มการเชื่อมโยงด้วยตนเอง เนื่องจากเลย์เอาต์กลุ่มการเชื่อมโยงที่สร้างขึ้นโดย "อัตโนมัติ" ยังไม่รองรับการผสมผสานนี้ ปัญหาเกี่ยวกับข้อกำหนด 4952 มีข้อเสนอที่อยู่ระหว่างการพิจารณาเพื่อจัดการข้อจำกัดนี้ในอนาคต

การทดสอบกลุ่มย่อยแบบขยายเวลา

การทดสอบกลุ่มย่อยซึ่งเดิมกำหนดให้สิ้นสุดใน Chrome 131 ได้ขยายเวลาไปจนถึง Chrome 133 ซึ่งจะสิ้นสุดในวันที่ 16 เมษายน 2025 แม้ว่าการทดลองใช้แหล่งที่มาครั้งแรกจะมุ่งเน้นที่ประสิทธิภาพ แต่ไม่มีมาตรการป้องกันความสามารถในการย้ายข้อมูลที่สำคัญ ระบบจะเพิ่มมาตรการป้องกันเหล่านี้ ซึ่งอาจทำให้เกิดข้อผิดพลาดในโค้ดที่มีอยู่

ปรับปรุงประสบการณ์การใช้งานสำหรับนักพัฒนาแอป

ตอนนี้คำเตือนจะปรากฏใน DevTools เมื่อใช้ตัวเลือก powerPreference กับ requestAdapter() ใน Windows ระบบจะนำคำเตือนนี้ออกเมื่อ Chrome ทราบวิธีใช้ GPU 2 ตัวที่แตกต่างกันและคอมโพสผลลัพธ์ระหว่าง GPU 2 ตัว ดูปัญหา 369219127

ตอนนี้ขนาดของบัฟเฟอร์ GPU จะแสดงอยู่ในข้อความแสดงข้อผิดพลาดเมื่อสร้างบัฟเฟอร์ GPU ที่มีขนาดใหญ่เกินไป ดูปัญหา 374167798

การรองรับรูปแบบพื้นผิวแบบ 16 บิตที่ปรับให้เป็นมาตรฐาน (เวอร์ชันทดลอง)

ขณะนี้รูปแบบพื้นผิวแบบ 16 บิตที่ปรับให้เป็นค่าปกติแบบมีเครื่องหมายและแบบไม่มีเครื่องหมายพร้อมให้ใช้งานแบบทดลองแล้วในฟีเจอร์ GPU ของ "chromium-experimental-snorm16-texture-formats" และ "chromium-experimental-unorm16-texture-formats" ตามลำดับ ขณะที่เรากำลังหารือเกี่ยวกับการทำให้เป็นมาตรฐาน

ฟีเจอร์เหล่านี้เพิ่มการรองรับรูปแบบพื้นผิวแบบ 16 บิตที่ปรับให้เป็นมาตรฐานด้วยการใช้งาน COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT, การหลายตัวอย่าง และความสามารถในการแก้ไข รูปแบบเพิ่มเติมคือ "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" และ "rgba16snorm"

ในระหว่างนี้ โปรดเปิดใช้ Flag "การสนับสนุน 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...

การอัปเดต Dawn

เลิกใช้เมธอด EnumerateFeatures(FeatureName * features) จาก wgpu::Adapter และ wgpu::Device แล้วเพื่อเปลี่ยนไปใช้ GetFeatures(SupportedFeatures * features) ดูปัญหา 368672123

webgpu.h C API ได้เปลี่ยน char const * ทั้งหมดเป็นโครงสร้าง WGPUStringView ที่กำหนดมุมมองเป็นสตริงที่เข้ารหัส UTF-8 โดยทำหน้าที่เป็นพอยน์เตอร์ไปยังข้อมูลสตริงควบคู่ไปกับความยาว ซึ่งจะช่วยให้คุณทำงานกับสตริงบางส่วนได้โดยไม่ต้องคัดลอก ดูปัญหา 42241188

ข้อมูลนี้เป็นเพียงไฮไลต์สำคัญบางส่วนเท่านั้น ดูรายการคอมมิตทั้งหมด

มีอะไรใหม่ใน WebGPU

รายการทุกอย่างที่ครอบคลุมในชุดมีอะไรใหม่ใน WebGPU

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