Novidades da WebGPU (Chrome 155-156)

Extensão WGSL fragment_depth

Em transmissões de renderização com uso intenso de geometria, as otimizações de Z inicial são as melhores amigas dos desenvolvedores. Elas oferecem um grande aumento de performance, permitindo que a GPU descarte pixels ocultos antes de executar shaders de fragmentos caros. Se uma profundidade rasterizada falhar no teste de profundidade, a GPU vai ignorar completamente o shader de fragmento, desde que ele não tenha outros efeitos colaterais.

Se quiser saber como o hardware lida com isso, MJP tem um excelente artigo sobre When Does Early-Z Have to be Disabled? (em inglês).

Embora a manipulação personalizada de profundidade seja útil, fazê-la no seu shader de fragmentos tem um custo oculto. Escrever em @builtin(frag_depth) dentro de um shader de fragmento geralmente força os drivers a desativar essas otimizações de Z inicial para toda a chamada de desenho. Isso acontece porque a heurística do driver não pode garantir que a profundidade de saída calculada do shader corresponda à profundidade interpolada pelo rasterizador.

Para resolver essa penalidade de desempenho, a extensão WGSL fragment_depth permite especificar um nome de modo de profundidade less ou greater em @builtin(frag_depth) para declarar explicitamente como a profundidade gravada se compara à profundidade interpolada, permitindo que a GPU aplique otimizações Z iniciais com segurança.

Essa extensão de linguagem pode ser detectada por recursos em JavaScript usando navigator.gpu.wgslLanguageFeatures. Recomendamos usar uma diretiva "requires" para sinalizar a possibilidade de não portabilidade com requires fragment_depth; na parte de cima do código do shader WGSL. Confira o exemplo a seguir e o intent to ship.

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

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

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

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

Compactação de textura não alinhada

O recurso de GPU "texture-compression-unaligned" permite a criação de texturas compactadas com dimensões que não são múltiplos inteiros do tamanho do bloco (como 4x4 para formatos BC, ETC2 e ASTC). Antes, o WebGPU exigia estritamente que os tamanhos de textura fossem alinhados com esses limites de bloco. Ao remover a necessidade de adicionar padding ou escalonar texturas para ajustar os alinhamentos de blocos, esse recurso preserva a fidelidade da compressão original sem introduzir distorção de escalonamento. Consulte a intenção de enviar.

O snippet de código a seguir verifica se o adaptador é compatível com a compactação de textura desalinhada e, se disponível, solicita um dispositivo com ela.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
  throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
  requiredFeatures: ["texture-compression-unaligned"],
});

Agradecemos ao colaborador externo Ignacio Castaño por impulsionar esse recurso.

Espaços de cores srgb-linear e display-p3-linear

Com a adição dos espaços de cores predefinidos "srgb-linear" e "display-p3-linear", o contexto de tela do WebGPU agora pode renderizar diretamente em espaços de cores lineares de intervalo estendido para oferecer suporte a telas de ampla gama. Esses espaços de cores mantêm uma relação linear entre os valores de pixel e a luminância física. Isso os torna ideais para renderização de luz física em jogos, bem como para tarefas de processamento espacial, como antialiasing, interpolação e decimação. Consulte a intenção de envio e a solicitação de pull de exemplo de partículas (HDR) nº 574.

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

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

context.configure({
  device,
  format: "rgba16float",
  colorSpace: "display-p3-linear",
});

Formato de vértice snorm10-10-10-2 adicional

O formato de vértice "snorm10-10-10-2" é um formato compactado de 32 bits que contém quatro valores normalizados assinados: três componentes de 10 bits (r, g, b) e um componente de 2 bits (a). Com esse formato, é possível armazenar atributos com eficiência, como vetores normais 3D com um escalar extra de 2 bits ou uma flag de alinhamento, economizando largura de banda da memória. Consulte o PR 6491 da especificação.

Suporte a f16 no Linux para NVIDIA

O recurso opcional "shader-f16", que oferece suporte a valores de ponto flutuante de 16 bits em WGSL, agora está disponível no Linux para drivers de GPU NVIDIA recentes. Consulte o problema chromium:42251215.

Atualizações do amanhecer

Agora é possível consultar o LUID do DXGIAdapter subjacente para um determinado adaptador de GPU usando a struct WGPUAdapterPropertiesD3D. Consulte o problema chromium:562849566.

Isso abrange alguns dos principais destaques. Confira a lista completa de commits.

Novidades no WebGPU

Uma lista de tudo o que foi abordado na série Novidades no 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