Các tính năng dành cho nhà phát triển WebGPU

François Beaufort
François Beaufort

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

Việc triển khai WebGPU API của Chrome bao gồm các tính năng chỉ dành cho mục đích phát triển và kiểm thử. Các tính năng này nằm ngoài quy cách WebGPU tiêu chuẩn. Không sử dụng các tính năng này trong phiên bản phát hành chính thức.

Tài liệu này trình bày chi tiết cách bật các tính năng dành cho nhà phát triển WebGPU và cung cấp một danh sách toàn diện.

Điều kiện tiên quyết

Để bật các tính năng WebGPU dành cho nhà phát triển trong Chrome, hãy làm theo các bước sau:

  1. Bật cờ "WebGPU Developer Features" (Các tính năng dành cho nhà phát triển WebGPU) tại chrome://flags/#enable-webgpu-developer-features.
  2. Khởi động lại trình duyệt Chrome.

Tắt tính năng định lượng hoá cụm từ tìm kiếm có dấu thời gian

Các truy vấn dấu thời gian cho phép các ứng dụng WebGPU đo lường chính xác (đến nano giây) thời gian thực thi của các lệnh GPU trong quá trình tính toán và kết xuất. Các truy vấn này rất cần thiết để phân tích hiệu suất và hành vi của khối lượng công việc trên GPU. Để biết thêm thông tin chi tiết, hãy tham khảo phần Truy vấn dấu thời gian trong các lượt tính toán và kết xuất.

Do lo ngại về tấn công định thời, các truy vấn dấu thời gian được lượng tử hoá với độ phân giải 100 micro giây, giúp thoả hiệp tốt giữa độ chính xác và tính bảo mật. Quá trình lượng tử hoá này sẽ tự động tắt khi cờ "WebGPU Developer Features" (Các tính năng dành cho nhà phát triển WebGPU) được bật.

Thông tin mở rộng về bộ chuyển đổi

Để hiểu rõ hơn về bộ chuyển đổi đang được sử dụng, GPUAdapterInfo sẽ hiển thị các thuộc tính sau:

  • Thuộc tính device (được chuẩn hoá) là giá trị nhận dạng bộ chuyển đổi dành riêng cho nhà cung cấp.
  • Thuộc tính description (chuẩn hoá) là một chuỗi ký tự mà con người đọc được, cung cấp thông tin chi tiết về bộ chuyển đổi.
  • Thuộc tính driver (không chuẩn hoá) là một chuỗi ký tự mà con người đọc được, dùng để mô tả trình điều khiển.
  • Thuộc tính backend (không được chuẩn hoá) cho biết phần phụ trợ đồ hoạ, chẳng hạn như "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" hoặc "null".
  • Thuộc tính type (không được chuẩn hoá) xác định loại GPU: "discrete GPU", "integrated GPU", "CPU" hoặc "unknown".
  • Thuộc tính d3dShaderModel (không được chuẩn hoá) chỉ định số mô hình trình đổ bóng D3D tối đa được hỗ trợ, ví dụ: 62 cho biết hỗ trợ HLSL SM 6.2.
  • Thuộc tính vkDriverVersion (không chuẩn hoá) là phiên bản trình điều khiển Vulkan do nhà cung cấp chỉ định.
  • Thuộc tính powerPreference (không được chuẩn hoá) là "low-power" hoặc "high-performance", dựa trên GPUPowerPreference trong GPURequestAdapterOptions.

Để dự đoán các hạn chế về bộ nhớ khi phân bổ một lượng lớn trong quá trình phát triển ứng dụng, GPUAdapterInfo sẽ hiển thị memoryHeaps thông tin không được chuẩn hoá, chẳng hạn như kích thước và loại của các vùng nhớ có sẵn trên bộ điều hợp.

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

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

Lựa chọn biên dịch mô-đun chương trình đổ bóng strict math

GPUShaderModuleDescriptor bao gồm một lựa chọn boolean strictMath không được chuẩn hoá, cho phép bật hoặc tắt độ chính xác toán học nghiêm ngặt trong quá trình biên dịch mô-đun chương trình đổ bóng. Tuỳ chọn này được hỗ trợ trên Metal và Direct3D. Khi strictMath được bật, trình biên dịch sẽ tuân thủ các quy tắc toán học chính xác. Ngược lại, việc tắt tính năng này cho phép trình biên dịch tối ưu hoá chương trình đổ bóng bằng cách:

  • Bỏ qua khả năng có các giá trị NaN và Infinity.
  • Coi -0 là +0.
  • Thay thế phép chia bằng phép nhân nhanh hơn theo số nghịch đảo.
  • Sắp xếp lại các phép toán dựa trên tính chất kết hợp và phân phối.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

Nhập video bằng tính năng sao chép không cần thao tác

Thuộc tính boolean không được chuẩn hoá isZeroCopy GPUExternalTexture cho bạn biết liệu video được nhập bằng importExternalTexture() có được GPU truy cập trực tiếp hay không mà không cần bản sao trung gian.

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

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}