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

François Beaufort
François Beaufort

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

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

เราได้เพิ่ม"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 ไม่มีอยู่อีกต่อไป ดูคำขอแก้ไขข้อกำหนด 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

ตัวอย่างต่อไปนี้แสดงข้อความแสดงข้อผิดพลาดที่ได้รับการปรับปรุงซึ่งบันทึกไว้ในคอนโซล DevTools เมื่อสร้างบัฟเฟอร์ 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 ด้วยแฟล็ก "การรองรับ 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 struct เป็น WGPUComputeState เพื่อให้สถานะการคำนวณสอดคล้องกับสถานะของ Vertex และ Fragment ดูปัญหา 379059434

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

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

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