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

François Beaufort
François Beaufort

Phần mở rộng ngôn ngữ WGSL được hỗ trợ

Thành phần wgslLanguageFeatures của đối tượng GPU liệt kê tên của tiện ích ngôn ngữ WGSL được hỗ trợ. Các phần mở rộng ngôn ngữ WGSL được hỗ trợ được bật tự động. Do đó, bạn không cần phải yêu cầu một cách rõ ràng. Danh sách này hiện đang trống nhưng bạn có thể có nhiều danh sách hơn trong tương lai (ví dụ: do-while loops). Xem vấn đề buổi sáng:1777.

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Hỗ trợ thử nghiệm cho Direct3D 11

Nhóm Chromium đang nỗ lực bổ sung tính năng hỗ trợ WebGPU cho Direct3D 11. Giờ đây, bạn có thể thử nghiệm cục bộ bằng cách chạy Chrome trên Windows với cờ dòng lệnh --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Xem vấn đề buổi sáng:1705.

Nhận GPU rời theo mặc định khi dùng nguồn AC

Trên thiết bị macOS có GPU kép, nếu requestAdapter() được gọi mà không có tuỳ chọn powerPreference, thì GPU rời sẽ được trả về khi thiết bị của người dùng đang dùng nguồn điện xoay chiều. Nếu không, GPU tích hợp sẽ được trả về. Xem nội dung thay đổi 4499307.

Cải thiện trải nghiệm của nhà phát triển

Cảnh báo mới trong Công cụ cho nhà phát triển

Nếu bạn dùng khoá depth trong GPUExtend3DDict, thì một cảnh báo sẽ hiển thị trong Bảng điều khiển công cụ cho nhà phát triển vì khoá chính xác là depthOrArrayLayers. Hãy xem phần vấn đề về chromium:1440900.

Bạn cũng sẽ nhận được cảnh báo nếu GPUBlendComponent có cả thành phần rõ ràng và thành phần mặc định. Xem vấn đề buổi sáng:1785.

Mặc dù các lệnh gửi và vẽ có kích thước bằng 0 vẫn hợp lệ, nhưng cảnh báo sẽ khuyến khích nhà phát triển tránh các thao tác này khi có thể. Xem vấn đề buổi sáng:1786.

Thông báo lỗi tốt hơn

Giờ đây, bạn sẽ thấy thông báo lỗi được cải thiện khi sử dụng GPUCommandEncoder nếu finish() đã được gọi. Xem vấn đề buổi sáng:1736.

Khi gửi vùng đệm lệnh có đối tượng bị huỷ bỏ, nhãn của vùng đệm lệnh từng được dùng trong submit() sẽ xuất hiện trong thông báo lỗi. Xem vấn đề buổi sáng:1747.

Phần không hợp lệ của trạng thái stencil độ sâu hiện được chỉ định trong thông báo lỗi khi xác thực depthStencil. Xem vấn đề buổi sáng:1735.

Thông báo lỗi xác thực minBindingSize giờ đây sẽ báo cáo nhóm và số lượng liên kết không xác thực được, cũng như vùng đệm. Xem vấn đề bình minh:1604.

Chúng tôi đã cải thiện các thông báo lỗi do phương thức mapAsync() trả về trên đối tượng GPUBuffer để trợ giúp nhà phát triển khi gỡ lỗi. Hãy xem ví dụ bên dưới và vấn đề về chromium:1431622.

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

Nhãn trong công cụ gỡ lỗi của macOS

Nút bật/tắt gỡ lỗi use_user_defined_labels_in_backend cho phép bạn chuyển tiếp các nhãn đối tượng đến phần phụ trợ để có thể nhìn thấy các nhãn đó trong các công cụ gỡ lỗi dành riêng cho nền tảng như RenderDoc, PIX hoặc Instruments. Từ giờ trở đi, trải nghiệm gỡ lỗi tốt hơn sẽ được cung cấp trên macOS khi bạn bật tính năng này để gỡ lỗi. Xem vấn đề dawn:1784

Ảnh chụp màn hình ứng dụng Instruments (Công cụ) trên macOS có các nhãn tuỳ chỉnh của WebGPU.
Nhãn do người dùng xác định trong ứng dụng Instruments (Đo lường) trên macOS.

Ghi lại HLSL nếu biên dịch không thành công

Nút bật/tắt gỡ lỗi dump_shaders cho phép bạn ghi nhật ký chương trình đổ bóng WGSL và chương trình đổ bóng phụ trợ đã dịch. Từ giờ trở đi, khi bạn bật giao thức này để gỡ lỗi, HLSL sẽ bị kết xuất nếu quá trình biên dịch không thành công. Xem vấn đề dawn:1681

Cập nhật bình minh

Huỷ đặt vùng đệm đỉnh

Việc truyền nullptr thay vì wgpu::Buffer đến SetVertexBuffer() trên wgpu::RenderPassEncoder hoặc wgpu::RenderBundleEncoder cho phép bạn huỷ thiết lập vùng đệm đỉnh đã đặt trước đó trong một khe nhất định. Xem vấn đề buổi sáng:1675.

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

Tệp đính kèm tạm thời

Bạn có thể tạo các tệp đính kèm cho phép các thao tác truyền kết xuất nằm trong bộ nhớ thẻ thông tin, tránh lưu lượng truy cập VRAM và có thể tránh phân bổ VRAM cho kết cấu bằng cách thiết lập mức sử dụng wgpu::TextureUsage::TransientAttachment. Tính năng này chỉ được hỗ trợ cho Metal và Vulkan. Xem vấn đề bình minh: 1695.

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

Tạo dựng mà không có depot_tools

Tuỳ chọn CMake DAWN_FETCH_DEPENDENCIES mới cho phép bạn tìm nạp các phần phụ thuộc Dawn bằng cách sử dụng tập lệnh Python đọc tệp DEPS thay vì yêu cầu cài đặt depot_tools của tất cả dự án phụ thuộc vào nó. Xem nội dung thay đổi 131750.

Tính năng mới trong WebGPU

Danh sách mọi nội dung được đề cập trong loạt bài Có gì mới trong WebGPU.

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