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

François Beaufort
François Beaufort

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

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

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

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

  • 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 แบบไวร์เฟรมได้ด้วย

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

ส่วนขยาย 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 ดูข้อมูลเพิ่มเติมได้ที่การใช้งาน Buffer Map Write Extended และปัญหา 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 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