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

François Beaufort
François Beaufort

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

รูปแบบเวิร์กเท็กซ์แบบ unorm8x4-bgra และแบบคอมโพเนนต์เดียวเพิ่มเติม

เพิ่มรูปแบบเวิร์กเท็กซ์ "unorm8x4-bgra" และรูปแบบเวิร์กเท็กซ์คอมโพเนนต์เดียวต่อไปนี้ "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" และ "float16" รูปแบบเวิร์กเท็กซ์ "unorm8x4-bgra" ช่วยให้โหลดสีเวิร์กเท็กซ์ที่เข้ารหัส BGRA ได้ง่ายขึ้นเล็กน้อยในขณะที่ใช้เฉดสีเดิม นอกจากนี้ รูปแบบเวิร์กเท็กซ์คอมโพเนนต์เดียวยังช่วยให้คุณขอเฉพาะข้อมูลที่จําเป็นได้ เมื่อก่อนหน้านี้ต้องขอข้อมูลเป็นปริมาณที่มากกว่าอย่างน้อย 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 ได้ใน spec PR

ประสิทธิภาพ WGSL ที่เพิ่มขึ้นเมื่อมีการทิ้ง

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

ใช้ displaySize ของ VideoFrame สำหรับพื้นผิวภายนอก

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

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

copyExternalImageToTexture() ใช้เมธอด GPUQueue เพื่อคัดลอกเนื้อหาของรูปภาพหรือผืนผ้าใบลงในพื้นผิว ตอนนี้เครื่องมือจัดการรูปภาพสามารถจัดการรูปภาพที่มีการวางแนวที่ไม่ใช่ค่าเริ่มต้นได้อย่างถูกต้อง ซึ่งก่อนหน้านี้ไม่ได้เป็นเช่นนั้นเมื่อแหล่งที่มาคือ 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" เป็นค่าเดียวที่อนุญาต โปรดดูตัวอย่างต่อไปนี้และ spec PR 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: ข้อจำกัดนี้มีประโยชน์คล้ายกันอยู่แล้ว ซึ่งก็คือการควบคุมปริมาณข้อมูลที่ส่งผ่านระหว่างระยะของโปรแกรมเปลี่ยนรูปแบบ
  • ความคลาดเคลื่อนเล็กน้อย: แม้ว่าการคํานวณขีดจํากัด 2 รายการจะแตกต่างกันเล็กน้อย แต่ความแตกต่างเหล่านี้ก็เล็กน้อยและจัดการได้อย่างมีประสิทธิภาพภายในขีดจํากัด maxInterStageShaderVariables
  • ลดความซับซ้อน: การนํา maxInterStageShaderComponents ออกจะช่วยปรับปรุงอินเทอร์เฟซ Shader และลดความซับซ้อนสําหรับนักพัฒนาแอป ผู้ใช้สามารถมุ่งเน้นที่ maxInterStageShaderVariables ที่มีชื่อเหมาะสมและครอบคลุมมากขึ้นแทนที่จะต้องจัดการขีดจํากัด 2 รายการแยกกันซึ่งมีความแตกต่างเล็กน้อย

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

การอัปเดต Dawn

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

เราได้เปลี่ยนชื่อโครงสร้าง WGPUProgrammableStageDescriptor เป็น WGPUComputeState เพื่อให้สถานะการประมวลผลสอดคล้องกับสถานะเวิร์กเทอร์เทกซ์และเศษ ดูปัญหา 379059434

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

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

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

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

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