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

François Beaufort
François Beaufort

เผยแพร่: 8 มกราคม 2025

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

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

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

ดูข้อมูลโค้ดต่อไปนี้ รายการใน Chrome Status และปัญหา 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 เพื่อรักษาค่าสีที่หลากหลายและป้องกันอาร์ติแฟกต์แถบสีเพี้ยน เช่น ในการแสดงภาพทางวิทยาศาสตร์

ฟีเจอร์ GPU "float32-blendable" ใหม่ช่วยให้สามารถผสานพื้นผิว GPU ที่มีรูปแบบ "r32float", "rg32float" และ "rgba32float" ได้ ตอนนี้คุณสามารถสร้างไปป์ไลน์การแสดงผลที่ใช้การผสมกับไฟล์แนบรูปแบบ float32 ได้เมื่อขออุปกรณ์ GPU ที่มีฟีเจอร์นี้

ดูข้อมูลโค้ดต่อไปนี้ รายการใน Chrome Status และปัญหา 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 ที่มีอยู่

ดูข้อมูลโค้ดต่อไปนี้ รายการใน Chrome Status และปัญหา 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() ของบริบท Canvas ของ GPU จะทำให้เกิดข้อผิดพลาดในการตรวจสอบ GPU โดยได้เปลี่ยนให้แสดง JavaScript TypeError แทน ซึ่งจะป้องกันสถานการณ์ที่ getCurrentTexture() แสดงผลเท็กซ์เจอร์ GPU ที่ถูกต้องแม้ว่าบริบท Canvas ของ GPU จะได้รับการกำหนดค่าอย่างไม่ถูกต้องก็ตาม ดูข้อมูลเพิ่มเติมได้ในปัญหา 372837859

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

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

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

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

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

ปรับปรุงประสบการณ์ของนักพัฒนาแอป

ตอนนี้คำเตือนจะปรากฏในเครื่องมือสำหรับนักพัฒนาเว็บเมื่อใช้ตัวเลือก 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

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

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

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

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

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