WebGPU의 새로운 기능 (Chrome 132)

François Beaufort
François Beaufort

게시일: 2025년 1월 8일

텍스처 뷰 사용량

GPU 텍스처 뷰는 현재 소스 GPU 텍스처에서 모든 사용 플래그를 상속합니다. 일부 보기 형식은 특정 용도와 호환되지 않으므로 문제가 될 수 있습니다. 이 문제를 해결하려면 선택적 usage 구성원으로 createView()를 호출하면 선택한 뷰 형식과 호환되는 소스 텍스처의 사용 플래그 하위 집합을 명시적으로 지정할 수 있습니다.

이 변경사항을 통해 사전 유효성 검사를 실행하고 뷰가 사용되는 방식을 더 세부적으로 제어할 수 있습니다. 또한 사용 플래그가 뷰 생성의 일반적인 매개변수인 다른 그래픽 API와도 일치하여 최적화 기회를 제공합니다.

다음 스니펫, chromestatus 항목, 문제 363903526을 참고하세요.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

32비트 부동 소수점 텍스처 블렌딩

32비트 부동 소수점 텍스처는 HDR 렌더링이 다양한 색상 값을 보존하고 색상 밴딩 아티팩트를 방지하는 데 필수적입니다. 과학 시각화의 예를 들 수 있습니다.

새로운 "float32-blendable" GPU 기능을 사용하면 "r32float", "rg32float", "rgba32float" 형식의 GPU 텍스처를 혼합할 수 있습니다. 이제 이 기능이 있는 GPU 기기를 요청할 때 float32 형식의 애착이 있는 블렌딩을 사용하는 렌더링 파이프라인을 만들 수 있습니다.

다음 스니펫, chromestatus 항목, 문제 369649348을 참고하세요.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice adapterInfo 속성

GPU 아키텍처를 기반으로 해결 방법을 최적화하거나 구현해야 할 수 있으므로 사용자 제공 GPUDevice 객체를 사용하는 라이브러리는 실제 GPU에 대한 정보에 액세스하는 것이 중요합니다. GPUAdapter 객체를 통해 이 정보에 액세스할 수는 있지만 GPUDevice만으로는 이 정보를 가져오는 직접적인 방법이 없습니다. 이 경우 사용자가 GPUDevice와 함께 추가 정보를 제공해야 할 수 있으므로 불편할 수 있습니다.

이 문제를 해결하기 위해 이제 GPUAdapterInfoGPUDevice adapterInfo 속성을 통해 노출됩니다. 이는 기존 GPUAdapter info 속성과 유사합니다.

다음 스니펫, chromestatus 항목, 문제 376600838을 참고하세요.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

잘못된 형식으로 캔버스 컨텍스트를 구성하면 JavaScript 오류가 발생함

이전에는 GPU 캔버스 컨텍스트의 configure() 메서드에서 잘못된 텍스처 형식을 사용하면 GPU 유효성 검사 오류가 발생했습니다. JavaScript TypeError를 발생시키도록 변경되었습니다. 이렇게 하면 GPU 캔버스 컨텍스트가 잘못 구성되어 있더라도 getCurrentTexture()가 유효한 GPU 텍스처를 반환하는 시나리오를 방지할 수 있습니다. 자세한 내용은 문제 372837859를 참고하세요.

텍스처에 대한 필터링 샘플러 제한사항

이전에는 필터링 샘플과 함께 "sint", "uint", 'depth"' 형식 텍스처를 사용할 수 있었습니다. 이제 필터링 샘플러와 함께 "sint" 또는 "uint" 형식 텍스처를 사용하는 것이 올바르게 허용되지 않습니다. 필터링 샘플러와 함께 depth" 텍스처를 사용하면 현재 경고가 표시되지만 향후는 허용되지 않습니다. 문제 376497143을 참고하세요.

이러한 제한사항은 필터링되지 않는 샘플러와 함께 깊이 텍스처를 사용하려면 바인딩 그룹 레이아웃을 수동으로 만들어야 함을 의미합니다. '자동' 생성된 바인딩 그룹 레이아웃이 아직 이 조합을 지원하지 않기 때문입니다. 사양 문제 4952에는 향후 이 제한사항을 해결하기 위해 고려 중인 제안서가 포함되어 있습니다.

하위 그룹 실험 확장

처음에는 Chrome 131에서 종료되도록 설정된 하위 그룹 실험이 Chrome 133으로 연장되어 2025년 4월 16일에 종료됩니다. 첫 번째 출처 무료 체험판은 성능에 중점을 두었지만 중요한 이식성 보호 조치가 없었습니다. 이제 이러한 보호 조치가 추가되어 기존 코드에 오류가 발생할 수 있습니다.

개발자 환경 개선

이제 Windows에서 requestAdapter()와 함께 powerPreference 옵션을 사용하면 DevTools에 경고가 표시됩니다. Chrome에서 두 개의 서로 다른 GPU를 사용하고 그 결과를 합성하는 방법을 알게 되면 이 경고가 삭제됩니다. 문제 369219127을 참고하세요.

이제 너무 큰 GPU 버퍼를 만들 때 오류 메시지에 GPU 버퍼의 크기가 표시됩니다. 문제 374167798을 참고하세요.

16비트 정규화된 텍스처 형식의 실험적 지원

16비트 부호화 정규화 텍스처 형식과 부호화되지 않은 정규화 텍스처 형식은 표준화에 관해 논의되는 동안 "chromium-experimental-snorm16-texture-formats""chromium-experimental-unorm16-texture-formats" GPU 기능 뒤에서 각각 실험적으로 사용할 수 있습니다.

이러한 기능은 COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT 사용, 멀티샘플링, 해결 기능이 있는 16비트 정규화된 텍스처 형식을 지원합니다. 추가 형식은 "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm", "rgba16snorm"입니다.

이러한 실험용 기능이 표준화될 때까지 chrome://flags/#enable-unsafe-webgpu에서 '안전하지 않은 WebGPU 지원' 플래그를 사용 설정하여 Chrome에서 사용할 수 있도록 합니다.

다음 스니펫과 문제 374790898을 참고하세요.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Dawn 업데이트

wgpu::Adapterwgpu::DeviceEnumerateFeatures(FeatureName * features) 메서드를 지원 중단하고 GetFeatures(SupportedFeatures * features)를 사용하도록 했습니다. 문제 368672123을 참고하세요.

webgpu.h C API는 모든 char const *를 UTF-8 인코딩된 문자열에 대한 뷰를 정의하는 WGPUStringView 구조로 변경했습니다. 길이와 결합된 문자열 데이터의 포인터 역할을 합니다. 이렇게 하면 문자열을 복사하지 않고도 문자열의 일부를 사용할 수 있습니다. 문제 42241188을 참고하세요.

여기에는 주요 내용 중 일부만 다룹니다. 전체 커밋 목록을 확인하세요.

WebGPU의 새로운 기능

WebGPU의 새로운 기능 시리즈에서 다룬 모든 항목의 목록입니다.

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