Tính năng mới trong WebGPU (Chrome 137)

François Beaufort
François Beaufort

Ngày xuất bản: 26 tháng 5 năm 2025

Sử dụng chế độ xem kết cấu để liên kết externalTexture

Giờ đây, bạn được phép sử dụng GPUTextureView tương thích (2D, tài nguyên phụ duy nhất) thay vì liên kết GPUExternalTexture khi tạo GPUBindGroup.

Điều này giúp đơn giản hoá logic chương trình đổ bóng trong quy trình hiệu ứng video, trong đó phải xử lý cả GPUExternalTexture (đối với video nguồn) và GPUTextureView (đối với quá trình xử lý trung gian). Điều này cũng giúp giảm nhu cầu biên dịch chương trình đổ bóng một cách linh động tuỳ thuộc vào nguồn gốc của hoạ tiết. Xem bài viết Ý định phát hành: WebGPU: GPUTextureView để liên kết externalTexture.

const texture = myDevice.createTexture({
  size: [42, 42],
  format: navigator.gpu.getPreferredCanvasFormat(),
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

const code = `
@group(0) @binding(0) var texture : texture_external;
@group(0) @binding(1) var<storage, read_write> buffer: vec2u;
    
@compute @workgroup_size(1) fn main() {
  buffer = textureDimensions(texture);
}`;

const pipeline = myDevice.createComputePipeline({
  layout: "auto",
  compute: { module: myDevice.createShaderModule({ code }) },
});

const bindGroup = myDevice.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    { binding: 0, resource: texture.createView() }, // Use texture view for an externalTexture binding
    { binding: 1, resource: { buffer: myBuffer } },
  ],
});

Sao chép vùng đệm mà không chỉ định độ dời và kích thước

Phương thức nạp chồng GPUCommandEncoder mới cho phép nhà phát triển bỏ qua các tham số độ dời và kích thước khi sử dụng copyBufferToBuffer() để đơn giản hoá việc sao chép toàn bộ vùng đệm. Xem phần Ý định phát hành: WebGPU: quá tải copyBufferToBuffer.

const size = 42;
const srcBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
const dstBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});

// Copy entire buffer.
myCommandEncoder.copyBufferToBuffer(srcBuffer, dstBuffer);

// This is the same as the following.
// myCommandEncoder.copyBufferToBuffer(srcBuffer, 0, dstBuffer, 0, size);

WGSL workgroupUniformLoad sử dụng con trỏ đến nguyên tử

Thêm một phương thức nạp chồng workgroupUniformLoad(ptr) mới trong WGSL để nhà phát triển thuận tiện hơn. Phương thức này tải giá trị được trỏ đến bởi ptr và trả về giá trị đó cho tất cả các lệnh gọi trong nhóm công việc, trong đó ptr là con trỏ đến nguyên tử bên trong biến nhóm công việc. Xem vấn đề 408241039.

@group(0) @binding(0) var<storage, read_write> buffer : array<u32, 1>;

var<workgroup> wgvar : atomic<u32>;

@compute @workgroup_size(1, 1)
fn main(@builtin(local_invocation_index) lid: u32) {
  if (lid == 0) {
    atomicStore(&(wgvar), 42u);
  }
  buffer[lid] = workgroupUniformLoad(&wgvar);
}

Thuộc tính powerPreference của GPUAdapterInfo

Thuộc tính chuỗi GPUAdapterInfo powerPreference không chuẩn hiện đã có khi người dùng đã bật cờ "Tính năng dành cho nhà phát triển WebGPU" tại chrome://flags/#enable-webgpu-developer-features. Nếu được hỗ trợ, giá trị powerPreference có thể là "low-power" hoặc "high-performance" tuỳ thuộc vào giá trị GPUPowerPreference được sử dụng trong GPURequestAdapterOptions. Xem CL 6438860.

function checkPowerPreferenceForGpuDevice(device) {
  const powerPreference = device.adapterInfo.powerPreference;
  if (powerPreference === "high-performance") {
    // High-performance GPU detected. Enabling enhanced graphics settings.
  } else if (powerPreference === "low-power") {
    // Low-power GPU detected. Optimizing for battery life.
  }
}

Xoá thuộc tính compatibilityMode của GPURequestAdapterOptions

Thuộc tính GPURequestAdapterOptions compatibilityMode thử nghiệm đã bị xoá để thay thế cho thuộc tính featureLevel được chuẩn hoá được thêm trong Chrome 133. Xem vấn đề 366151404.

Thông tin cập nhật về Dawn

Nhà phát triển có thể tạo các dự án WebGPU bằng các ngôn ngữ như C++, sử dụng webgpu.h để nhắm đến cả WebAssembly và các nền tảng cụ thể. "emdawnwebgpu" ("Emscripten Dawn WebGPU") mới phát hành của Dawn triển khai webgpu.h được chuẩn hoá mới nhất qua API trình duyệt.

Emdawnwebgpu là một nhánh (được duy trì) của các liên kết tích hợp (USE_WEBGPU) của Emscripten (hiện không được duy trì). Tất cả hoạt động phát triển mới đều đang được thực hiện trên emdawnwebgpu và các liên kết tích hợp của Emscripten sẽ bị xoá khi nhà phát triển chuyển sang emdawnwebgpu. Tiêu đề C của Emdawnwebgpu rất gần với tiêu đề của Dawn, trong khi các liên kết tích hợp đã lỗi thời đáng kể.

Tải emdawnwebgpu xuống từ trang phát hành GitHub của Dawn và đọc README.md của gói để biết thông tin về cách sử dụng. Bạn có thể tìm thấy các tệp nguồn trong kho lưu trữ Dawn.

Để biết hướng dẫn đầy đủ, hãy xem tài liệu Tạo ứng dụng bằng WebGPU đã cập nhật.

Phần này chỉ đề cập đến một số điểm nổi bật chính. Hãy xem danh sách đầy đủ các thay đổi.

Tính năng mới trong WebGPU

Danh sách mọi nội dung đã được đề cập trong loạt bài Tính năng mới trong WebGPU.

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