มีอะไรใหม่ใน WebGPU (Chrome 155-156)

ส่วนขยาย fragment_depth ของ WGSL

ในการส่งผ่านการแสดงผลที่เน้นเรขาคณิต การเพิ่มประสิทธิภาพ Early-Z คือเพื่อนที่ดีที่สุดของนักพัฒนาซอฟต์แวร์ ซึ่งช่วยเพิ่มประสิทธิภาพได้อย่างมากโดยการอนุญาตให้ GPU ทิ้งพิกเซลที่ซ่อนอยู่ก่อนที่จะเรียกใช้ Fragment Shader ที่มีค่าใช้จ่ายสูง หากความลึกที่แรสเตอร์ไม่ผ่านการทดสอบความลึก GPU จะข้าม Fragment Shader ไปเลย หาก Shader ไม่มีผลข้างเคียงอื่นๆ

หากต้องการอ่านข้อมูลเกี่ยวกับวิธีที่ฮาร์ดแวร์จัดการเรื่องนี้ MJP มีบทความที่ยอดเยี่ยมเกี่ยวกับกรณีที่ต้องปิดใช้ Early-Z

แม้ว่าการปรับแต่งความลึกที่กำหนดเองจะมีประโยชน์ แต่การทำใน Fragment Shader ก็มีค่าใช้จ่ายแอบแฝง โดยทั่วไปแล้ว การเขียนไปยัง @builtin(frag_depth) ภายใน Fragment Shader จะบังคับให้ไดรเวอร์ปิดใช้การเพิ่มประสิทธิภาพ Early-Z เหล่านี้สำหรับคำสั่งประมวลผลทั้งหมด ซึ่งเกิดขึ้นเนื่องจากวิธีการเรียนรู้ของไดรเวอร์ไม่สามารถรับประกันได้ว่าความลึกของเอาต์พุตที่คำนวณของตัวปรับเฉดสีจะตรงกับความลึกที่ตัวแรสเตอร์กำหนด

เพื่อแก้ไขปัญหาด้านประสิทธิภาพนี้ ส่วนขยาย WGSL fragment_depth ช่วยให้คุณระบุชื่อโหมดความลึก less หรือ greater ใน @builtin(frag_depth) เพื่อระบุอย่างชัดเจนว่าความลึกที่เขียนเปรียบเทียบกับความลึกที่ประมาณค่าในช่วงอย่างไร ซึ่งช่วยให้ GPU ใช้การเพิ่มประสิทธิภาพ Early-Z ได้อย่างปลอดภัย

ส่วนขยายภาษานี้สามารถตรวจหาฟีเจอร์ใน JavaScript ได้โดยใช้ navigator.gpu.wgslLanguageFeatures ขอแนะนำให้ใช้คำสั่ง requires-directive เพื่อส่งสัญญาณถึงความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires fragment_depth; ที่ด้านบนของโค้ดตัวปรับเฉดสี WGSL ดูตัวอย่างต่อไปนี้และความตั้งใจที่จะจัดส่ง

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires fragment_depth;

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

การบีบอัดพื้นผิวไม่สอดคล้องกัน

ฟีเจอร์ GPU "texture-compression-unaligned" ช่วยให้สร้างพื้นผิวที่บีบอัดซึ่งมีขนาดที่ไม่ใช่จำนวนเต็มคูณกับขนาดบล็อกได้ (เช่น 4x4 สำหรับรูปแบบ BC, ETC2 และ ASTC) ก่อนหน้านี้ WebGPU กำหนดให้ขนาดพื้นผิวต้องสอดคล้องกับขอบเขตบล็อกเหล่านี้อย่างเคร่งครัด ฟีเจอร์นี้จะช่วยรักษาความแม่นยำในการบีบอัดต้นฉบับโดยไม่ทำให้เกิดการบิดเบือนจากการปรับขนาด เนื่องจากไม่จำเป็นต้องเพิ่มระยะห่างจากขอบหรือปรับขนาดพื้นผิวให้พอดีกับการจัดแนวบล็อก ดูความตั้งใจที่จะจัดส่ง

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

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
  throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
  requiredFeatures: ["texture-compression-unaligned"],
});

ขอขอบคุณ Ignacio Castaño ผู้ร่วมให้ข้อมูลภายนอกจาก spark.js ที่ช่วยขับเคลื่อนฟีเจอร์ ข้อกำหนด และงาน CTS นี้

ขอบเขตสี srgb-linear และ display-p3-linear

เมื่อเพิ่มขอบเขตสีที่กำหนดไว้ล่วงหน้า "srgb-linear" และ "display-p3-linear" ตอนนี้บริบท Canvas ของ WebGPU จะแสดงผลโดยตรงในขอบเขตสีเชิงเส้นช่วงขยายเพื่อรองรับการแสดงผลขอบเขตกว้างได้แล้ว ขอบเขตสีเหล่านี้จะรักษาความสัมพันธ์เชิงเส้นระหว่างค่าพิกเซลและความสว่างทางกายภาพ จึงเหมาะอย่างยิ่งสำหรับการแสดงผลแสงทางกายภาพในเกม รวมถึงงานประมวลผลเชิงพื้นที่ เช่น การลดรอยหยัก การประมาณค่าในช่วง และการลดจำนวนตัวอย่าง ดูความตั้งใจที่จะจัดส่งและตัวอย่าง Particles (HDR) PR #574

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

context.configure({
  device,
  format: "rgba16float",
  colorSpace: "display-p3-linear",
});

รูปแบบเวอร์เท็กซ์ snorm10-10-10-2 เพิ่มเติม

รูปแบบจุดยอด "snorm10-10-10-2" เป็นรูปแบบ 32 บิตที่รวมค่าที่ปรับให้เป็นมาตรฐานแบบมีเครื่องหมาย 4 ค่า ได้แก่ คอมโพเนนต์ 10 บิต 3 รายการ (r, g, b) และคอมโพเนนต์ 2 บิต 1 รายการ (a) รูปแบบนี้ช่วยให้คุณจัดเก็บแอตทริบิวต์ได้อย่างมีประสิทธิภาพ เช่น เวกเตอร์ปกติ 3 มิติที่มีสเกลาร์ 2 บิตเพิ่มเติม หรือแฟล็กการจัดแนว พร้อมทั้งประหยัดแบนด์วิดท์หน่วยความจำ ดูข้อกำหนด PR 6491

การรองรับ f16 ใน Linux สำหรับ NVIDIA

ตอนนี้ฟีเจอร์ "shader-f16" (ไม่บังคับ) ซึ่งให้การรองรับค่าจุดลอยตัว 16 บิตใน WGSL ได้รับการรองรับใน Linux สำหรับไดรเวอร์ GPU ของ NVIDIA รุ่นล่าสุดแล้ว ดูปัญหา chromium:42251215

ข้อมูลอัปเดตเกี่ยวกับ Dawn

ตอนนี้คุณสามารถค้นหา LUID ของ DXGIAdapter ที่สำคัญสำหรับอะแดปเตอร์ GPU หนึ่งๆ ได้โดยใช้โครงสร้าง WGPUAdapterPropertiesD3D ดูปัญหา chromium:562849566

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

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

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

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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