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

François Beaufort
François Beaufort

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

รูปแบบจุดยอด unorm8x4-bgra และรูปแบบจุดยอดแบบ 1 คอมโพเนนต์เพิ่มเติม

เราได้เพิ่ม"unorm8x4-bgra"รูปแบบจุดยอดและรูปแบบจุดยอดแบบ 1 องค์ประกอบต่อไปนี้ "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" และ "float16" รูปแบบจุดยอด "unorm8x4-bgra" ช่วยให้โหลดสีจุดยอดที่เข้ารหัส BGRA ได้สะดวกขึ้นเล็กน้อยในขณะที่ยังคงใช้ Shader เดิม นอกจากนี้ รูปแบบจุดยอดแบบ 1 องค์ประกอบยังช่วยให้คุณขอเฉพาะข้อมูลที่จำเป็นได้ ในขณะที่ก่อนหน้านี้ต้องขอข้อมูลอย่างน้อย 2 เท่าสำหรับประเภทข้อมูล 8 และ 16 บิต ดูรายการใน chromestatus และปัญหา 376924407

อนุญาตให้ขอโควต้าที่ไม่รู้จักโดยมีค่าที่ไม่ได้กำหนด

ตอนนี้คุณขอขีดจำกัดที่ไม่รู้จักด้วยค่า undefined ได้แล้วเมื่อขออุปกรณ์ GPU เพื่อให้ WebGPU API มีความยืดหยุ่นมากขึ้นเมื่อมีการพัฒนา ซึ่งจะมีประโยชน์ในโค้ดของแอปพลิเคชันต่อไปนี้ เช่น adapter.limits.someLimit สามารถเป็น undefined ได้หาก someLimit ไม่มีอยู่อีกต่อไป ดูข้อกำหนด PR 4781

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

การเปลี่ยนแปลงกฎการจัดแนว WGSL

คุณไม่สามารถระบุค่าการจัดแนวที่เล็กเกินไปสำหรับสมาชิกโครงสร้างได้อีกต่อไป เนื่องจากตอนนี้จำเป็นต้องมี @align(n) หาร RequiredAlignOf สำหรับโครงสร้างทั้งหมด การเปลี่ยนแปลงที่ทำให้เกิดข้อผิดพลาดนี้จะช่วยลดความซับซ้อนในการใช้ภาษา WGSL และทำให้เข้ากันได้กับ Firefox และ Safari มากขึ้น คุณดูโค้ดตัวอย่างที่แสดงความแตกต่างระหว่างคอมไพเลอร์ Tint, Naga และ WebKit ได้ใน PR ของข้อกำหนด

การเพิ่มประสิทธิภาพ WGSL ด้วยการทิ้ง

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

ใช้ displaySize ของ VideoFrame สำหรับเท็กซ์เจอร์ภายนอก

ควรใช้มิติข้อมูล displayWidth และ displayHeight เป็นขนาดที่ปรากฏของ GPUExternalTexture เมื่อนำเข้า VideoFrame ตามข้อกำหนดของ WebGPU อย่างไรก็ตาม มีการใช้ขนาดที่มองเห็นได้อย่างไม่ถูกต้อง ซึ่งทำให้เกิดปัญหาเมื่อพยายามใช้ textureLoad() ใน GPUExternalTexture ซึ่งตอนนี้ปัญหาได้รับการแก้ไขแล้ว ดูปัญหา 377574981

จัดการรูปภาพที่มีการวางแนวที่ไม่ใช่ค่าเริ่มต้นโดยใช้ copyExternalImageToTexture

copyExternalImageToTexture() เมธอด GPUQueue ใช้เพื่อคัดลอกเนื้อหาของรูปภาพหรือ Canvas ลงในเท็กซ์เจอร์ ตอนนี้แอปจัดการรูปภาพที่มีการวางแนวที่ไม่ใช่ค่าเริ่มต้นได้อย่างถูกต้องแล้ว ก่อนหน้านี้ไม่ได้เป็นเช่นนี้เมื่อแหล่งที่มาเป็น ImageBitmap ที่มี imageOrientation "from-image" หรือรูปภาพที่มีการวางแนวที่ไม่ใช่ค่าเริ่มต้น ดูปัญหา 384858956

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

คุณอาจแปลกใจเมื่อ adapter.limits แสดงค่าสูง แต่ไม่ทราบว่าต้องขอเพิ่มขีดจำกัดอย่างชัดเจนเมื่อขออุปกรณ์ GPU หากไม่ดำเนินการดังกล่าว คุณอาจใช้เกินขีดจำกัดโดยไม่คาดคิดในภายหลัง

เราได้ขยายข้อความแสดงข้อผิดพลาดพร้อมคำแนะนำที่บอกให้คุณขอเพิ่มขีดจำกัดอย่างชัดเจนเมื่อไม่ได้ระบุขีดจำกัดใน requiredLimits เมื่อเรียกใช้ requestDevice() เพื่อช่วยคุณ ดูปัญหา 42240683

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

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

เปิดใช้โหมดความเข้ากันได้ด้วย featureLevel

ตอนนี้คุณขออะแดปเตอร์ GPU ในโหมดความเข้ากันได้แบบทดลองได้แล้วโดยตั้งค่าตัวเลือก featureLevel ที่ได้มาตรฐานเป็น "compatibility" สตริง "core" (ค่าเริ่มต้น) และ "compatibility" เป็นค่าเดียวที่อนุญาต ดูตัวอย่างต่อไปนี้และคำขอแก้ไขข้อกำหนด 4897

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

ตัวเลือก featureLevel จะแทนที่ตัวเลือก compatibilityMode ที่ไม่เป็นไปตามมาตรฐาน ในขณะที่แอตทริบิวต์ featureLevel ที่ไม่เป็นไปตามมาตรฐานจะแทนที่แอตทริบิวต์ isCompatibilityMode

เนื่องจากยังเป็นเวอร์ชันทดลอง คุณจึงต้องเรียกใช้ Chrome ด้วย Flag "การรองรับ WebGPU ที่ไม่ปลอดภัย" ที่ chrome://flags/#enable-unsafe-webgpu ในตอนนี้ ลองใช้ได้ที่ webgpureport.org

การล้างข้อมูลฟีเจอร์กลุ่มย่อยเวอร์ชันทดลอง

เราได้นำฟีเจอร์กลุ่มย่อยเวอร์ชันทดลอง "chromium-experimental-subgroups" และ "chromium-experimental-subgroup-uniform-control-flow" ที่เลิกใช้งานแล้วออก ดูปัญหา 377868468

ตอนนี้คุณใช้"subgroups"ฟีเจอร์เวอร์ชันทดลองได้เลยเมื่อทดสอบกับกลุ่มย่อย "subgroups-f16" ฟีเจอร์ทดลองเลิกใช้งานแล้วและจะถูกนำออกในเร็วๆ นี้ คุณสามารถใช้ค่า f16 กับกลุ่มย่อยได้เมื่อแอปพลิเคชันขอทั้งฟีเจอร์ "shader-f16" และ "subgroups" ดูปัญหา 380244620

เลิกใช้งานขีดจำกัด maxInterStageShaderComponents

เราเลิกใช้งานขีดจำกัด maxInterStageShaderComponents เนื่องจากปัจจัยหลายประการดังนี้

  • ความซ้ำซ้อนกับ maxInterStageShaderVariables: ขีดจำกัดนี้มีวัตถุประสงค์คล้ายกันอยู่แล้ว นั่นคือการควบคุมปริมาณข้อมูลที่ส่งผ่านระหว่างขั้นตอนของ Shader
  • ความคลาดเคลื่อนเล็กน้อย: แม้ว่าการคำนวณขีดจำกัดทั้ง 2 จะแตกต่างกันเล็กน้อย แต่ความแตกต่างเหล่านี้มีเพียงเล็กน้อยและสามารถจัดการได้อย่างมีประสิทธิภาพภายในmaxInterStageShaderVariablesขีดจำกัด
  • การลดความซับซ้อน: การนำ maxInterStageShaderComponents ออกจะช่วยปรับปรุงอินเทอร์เฟซของ Shader และลดความซับซ้อนสำหรับนักพัฒนาแอป แทนที่จะจัดการโควต้า 2 รายการที่แยกกันซึ่งมีความแตกต่างกันเล็กน้อย ผู้ใช้จะมุ่งเน้นไปที่maxInterStageShaderVariablesที่มีชื่อที่เหมาะสมกว่าและครอบคลุมกว่าได้

โดยมีเป้าหมายที่จะนำออกอย่างสมบูรณ์ใน Chrome 135 ดูความตั้งใจที่จะเลิกใช้งานและปัญหา 364338810

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

wgpu::Device::GetAdapterInfo(adapterInfo) ช่วยให้คุณดูข้อมูลอะแดปเตอร์ได้โดยตรงจาก wgpu::Device ดูปัญหา 376600838

เราได้เปลี่ยนชื่อโครงสร้าง WGPUProgrammableStageDescriptor เป็น WGPUComputeState เพื่อให้สถานะการคำนวณสอดคล้องกับสถานะของ Vertex และ Fragment ดูปัญหา 379059434

นำค่า enum wgpu::VertexStepMode::VertexBufferNotUsed ออกแล้ว ตอนนี้คุณสามารถแสดงเลย์เอาต์ของ Vertex Buffer ที่ไม่ได้ใช้ด้วย {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} ได้แล้ว ดูปัญหา 383147017

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

มีอะไรใหม่ใน 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