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 속성

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

이 문제를 해결하기 위해 adapterInfo 속성을 통해 GPUAdapterInfo이 노출됩니다.GPUDevice 이는 기존 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을 참고하세요.

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

확장된 하위 그룹 실험

처음 Chrome 131에서 종료되도록 설정된 하위 그룹 실험이 Chrome 133으로 연장되어 2025년 4월 16일에 종료됩니다. 첫 번째 오리진 트라이얼은 성능에 중점을 두었지만 중요한 이동성 보호 장치가 부족했습니다. 이제 이러한 안전 장치가 추가되어 기존 코드에 오류가 발생할 수 있습니다.

개발자 환경 개선

이제 Windows에서 powerPreference 옵션을 requestAdapter()와 함께 사용하면 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...

새벽 업데이트

wgpu::Adapterwgpu::DeviceEnumerateFeatures(FeatureName * features) 메서드는 GetFeatures(SupportedFeatures * features) 사용을 위해 지원 중단되었습니다. 문제 368672123을 참고하세요.

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

여기에서는 몇 가지 주요 사항만 다룹니다. 전체 커밋 목록을 확인하세요.

WebGPU의 새로운 기능

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

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