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

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

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

หากต้องการอ่านเพิ่มเติมเกี่ยวกับวิธีที่ฮาร์ดแวร์จัดการเรื่องนี้ MJP มีบทความที่ยอดเยี่ยมเกี่ยวกับWhen Does Early-Z Have to be Disabled?

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

ส่วนขยาย WGSL fragment_depth ช่วยให้คุณระบุlessหรือgreaterชื่อโหมดความลึกใน @builtin(frag_depth) เพื่อระบุอย่างชัดเจนว่าความลึกที่เขียนเทียบกับความลึกที่ประมาณค่าเป็นอย่างไร ซึ่งจะช่วยให้ GPU ใช้การเพิ่มประสิทธิภาพ 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 ผู้มีส่วนร่วมภายนอกที่ขับเคลื่อนฟีเจอร์นี้

พื้นที่สี srgb-linear และ display-p3-linear

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

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

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

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

ตอนนี้คุณสามารถค้นหา LUID ของ DXGIAdapter พื้นฐานสำหรับ GPU Adapter ที่กำหนดได้โดยใช้โครงสร้าง 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