มีอะไรใหม่ใน WebGPU (Chrome 153-154)

François Beaufort
François Beaufort

เผยแพร่: 15 กันยายน 2569

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

ส่วนขยายภาษา WGSL buffer_view ช่วยให้สามารถตีความข้อมูลของตัวแปรแบบ Uniform, Storage หรือ Workgroup เป็นประเภทต่างๆ ได้ ซึ่งมีประโยชน์มากมายตั้งแต่การใช้งานแบบ Type Punning ทั่วไปไปจนถึงการแบ่งตัวแปรออกเป็นตัวแปรเชิงตรรกะหลายตัว

เพื่อความปลอดภัยและลดความซับซ้อนในการใช้งาน คุณจะเข้าถึงประเภทที่ตีความใหม่ได้โดยใช้ฟังก์ชันในตัวต่อไปนี้เท่านั้น

  • bufferView<T>() ตีความหน่วยความจำที่ออฟเซ็ตไบต์ที่เฉพาะเจาะจงเป็นพอยน์เตอร์ไปยังประเภท T
  • bufferArrayView<T>() สร้างตัวชี้อาร์เรย์ที่จำกัดขอบเขตพร้อมจำนวนองค์ประกอบที่ชัดเจน
  • bufferLength() จะแสดงขนาดไบต์ของบัฟเฟอร์

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

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

นอกจากนี้ คุณยังดูรายละเอียดเพิ่มเติมได้ในข้อเสนอการดูบัฟเฟอร์ และลองใช้ตัวอย่าง WebGPU แบบไวร์เฟรมได้ด้วย

ส่วนขยาย WGSL swizzle_assignment

ส่วนขยาย WGSL swizzle_assignment ช่วยให้คุณเขียนไปยังการสลับเวกเตอร์ได้โดยตรง ซึ่งช่วยให้คุณอัปเดตคอมโพเนนต์หลายรายการในคำสั่งเดียวได้ ซึ่งเป็นหนึ่งในฟีเจอร์ของชุมชนที่มีการร้องขอมากที่สุด ซึ่งจะช่วยลดโค้ดสำเร็จรูปและปรับปรุงความสามารถในการอ่าน Shader ได้อย่างมาก ในขณะเดียวกันก็ทำให้ WGSL สอดคล้องกับภาษาการแรเงาอื่นๆ

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

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

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

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

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

การปรับปรุงส่วนขยาย WGSL

แม้ว่าส่วนขยายภาษา texture-formats-tier1 จะรองรับในโค้ด WGSL แต่ก่อนหน้านี้ไม่ได้แมปกับ navigator.gpu.wgslLanguageFeatures (เป็น texture_formats_tier1) ใน JavaScript อย่างถูกต้อง ขณะนี้ปัญหาการแมปนี้ได้รับการแก้ไขแล้ว ดู Chromium CL 8159562

ตอนนี้ระบบจะเปิดใช้subgroupsส่วนขยายภาษาโดยอัตโนมัติเมื่อเปิดใช้subgroup_size_controlใน WGSL ดูปัญหา dawn:545285663

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

wgpu::FeatureName::BufferMapWriteExtendedUsagesฟีเจอร์ทดลอง ใหม่ช่วยให้คุณสร้างบัฟเฟอร์ด้วย wgpu::BufferUsage::MapWrite ร่วมกับ wgpu::BufferUsage อื่นๆ ยกเว้น wgpu::BufferUsage::MapRead เพื่อเขียน ลงในบัฟเฟอร์ที่ทำแผนที่ได้โดยตรงซึ่งใช้กับ GPU ได้ด้วย ซึ่งจะช่วยลดบัฟเฟอร์การจัดเตรียมและสำเนาเพิ่มเติมในแบ็กเอนด์ Vulkan และ D3D12 ดูข้อมูลเพิ่มเติมได้ที่การใช้งานแบบขยายของการเขียนแผนที่บัฟเฟอร์ และปัญหา dawn:386255678

ตอนนี้คุณสามารถใช้การเชื่อมโยง webgpu_cpp.h เหนือการติดตั้งใช้งาน webgpu.h ใดก็ได้แทนที่จะเชื่อมโยงกับรูปแบบของ Dawn โดยใช้ webgpu_upstream_cpp_headers ใหม่ ดูปัญหา #596 ใน webgpu-headers

ตอนนี้ Dawn ต้องใช้ macOS 13.0 ขึ้นไป ดู Dawn CL 334415

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

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