WebGPU의 새로운 기능 (Chrome 133)

François Beaufort
François Beaufort

게시일: 2025년 1월 29일

추가 unorm8x4-bgra 및 1개 구성요소 정점 형식

"unorm8x4-bgra" 정점 형식과 다음과 같은 1개 구성요소 정점 형식("uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16", "float16")이 추가되었습니다. "unorm8x4-bgra" 정점 형식을 사용하면 동일한 셰이더를 유지하면서 BGRA로 인코딩된 정점 색상을 로드하는 것이 약간 더 편리합니다. 또한 1개 구성요소 정점 형식을 사용하면 이전에 8비트 및 16비트 데이터 유형에 필요한 것의 2배 이상이 필요했던 경우 필요한 데이터만 요청할 수 있습니다. chromestatus 항목문제 376924407을 참고하세요.

정의되지 않은 값으로 알 수 없는 제한을 요청할 수 있도록 허용

WebGPU API가 발전함에 따라 취약하지 않도록 하려면 이제 GPU 기기를 요청할 때 undefined 값으로 알 수 없는 한도를 요청할 수 있습니다. 이는 다음과 같은 애플리케이션 코드에서 유용합니다. 예를 들어 someLimit가 더 이상 존재하지 않는 경우 adapter.limits.someLimitundefined일 수 있습니다. 사양 PR 4781을 참고하세요.

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL 정렬 규칙 변경사항

이제 모든 구조체에서 @align(n)RequiredAlignOf를 나눠야 하므로 구조체 멤버에 너무 작은 정렬 값을 제공할 수 없습니다. 이 중단사항은 WGSL 언어의 사용을 간소화하고 Firefox 및 Safari와의 호환성을 개선합니다. Tint, Naga, WebKit 컴파일러 간의 차이점을 보여주는 샘플 코드는 사양 PR에서 확인할 수 있습니다.

삭제를 통한 WGSL 성능 향상

복잡한 화면 공간 반사 (SSR) 효과를 렌더링할 때 성능이 크게 저하되는 것으로 관찰되어 디스크리드 문 구현은 가능한 경우 도우미 호출로 다운그레이드하기 위해 플랫폼에서 제공하는 시맨틱을 사용합니다. 이렇게 하면 삭제를 사용하는 셰이더의 성능이 개선됩니다. 문제 372714384를 참고하세요.

외부 텍스처에 VideoFrame displaySize 사용

WebGPU 사양에 따라 VideoFrame을 가져올 때 displayWidthdisplayHeight 크기를 GPUExternalTexture의 표시 크기로 사용해야 합니다. 하지만 표시 크기가 잘못 사용되어 GPUExternalTexture에서 textureLoad()를 사용하려고 하면 문제가 발생했습니다. 이제 이 문제가 해결되었습니다. 문제 377574981을 참고하세요.

copyExternalImageToTexture를 사용하여 기본이 아닌 방향의 이미지 처리

copyExternalImageToTexture() GPUQueue 메서드는 이미지 또는 캔버스의 콘텐츠를 텍스처로 복사하는 데 사용됩니다. 이제 기본이 아닌 방향의 이미지를 올바르게 처리합니다. 이전에는 소스가 imageOrientation "from-image"가 있는 ImageBitmap이거나 기본이 아닌 방향의 이미지인 경우 이 문제가 발생하지 않았습니다. 문제 384858956을 참고하세요.

개발자 환경 개선

adapter.limits에 높은 값이 표시되면 놀랄 수 있지만 GPU 기기를 요청할 때 더 높은 한도를 명시적으로 요청해야 한다는 사실을 모르는 경우가 있습니다. 이렇게 하지 않으면 나중에 예상치 못하게 한도가 초과될 수 있습니다.

이를 돕기 위해 requestDevice()를 호출할 때 requiredLimits에 한도가 지정되지 않은 경우 더 높은 한도를 명시적으로 요청하라는 힌트가 포함된 오류 메시지가 확장되었습니다. 문제 42240683을 참고하세요.

다음 예는 크기가 기본 최대 버퍼 크기 기기 제한을 초과하는 GPU 버퍼를 만들 때 DevTools 콘솔에 로깅된 개선된 오류 메시지를 보여줍니다.

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

featureLevel을 사용하여 호환성 모드 사용 설정

이제 표준화된 featureLevel 옵션을 "compatibility"로 설정하여 실험 호환성 모드에서 GPU 어댑터를 요청할 수 있습니다. "core" (기본값) 및 "compatibility" 문자열만 허용되는 값입니다. 다음 예시와 사양 PR 4897을 참고하세요.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel 옵션은 비표준화된 compatibilityMode 옵션을 대체하고 비표준화된 featureLevel 속성은 isCompatibilityMode 속성을 대체합니다.

아직 실험 단계이므로 지금은 chrome://flags/#enable-unsafe-webgpu에서 '안전하지 않은 WebGPU 지원' 플래그를 사용 설정하여 Chrome을 실행해야 합니다. webgpureport.org에서 사용해 보세요.

실험용 하위 그룹 기능 정리

지원 중단된 "chromium-experimental-subgroups""chromium-experimental-subgroup-uniform-control-flow" 실험용 하위 그룹 기능이 삭제되었습니다. 문제 377868468을 참고하세요.

이제 하위 그룹을 실험할 때 "subgroups" 실험용 기능만 있으면 됩니다. "subgroups-f16" 실험용 기능은 지원 중단되었으며 곧 삭제됩니다. 애플리케이션이 "shader-f16""subgroups" 기능을 모두 요청하는 경우 하위 그룹과 함께 f16 값을 사용할 수 있습니다. 문제 380244620을 참고하세요.

maxInterStageShaderComponents 한도 지원 중단

maxInterStageShaderComponents 한도는 다음과 같은 여러 요인으로 인해 지원 중단되었습니다.

  • maxInterStageShaderVariables 중복: 이 한도는 이미 셰이더 단계 간에 전달되는 데이터의 양을 제어하는 유사한 목적으로 사용됩니다.
  • 경미한 불일치: 두 한도의 계산 방법에는 약간의 차이가 있지만 이러한 차이는 미미하며 maxInterStageShaderVariables 한도 내에서 효과적으로 관리할 수 있습니다.
  • 간소화: maxInterStageShaderComponents를 삭제하면 셰이더 인터페이스가 간소화되고 개발자의 복잡성이 줄어듭니다. 미묘한 차이가 있는 두 가지 한도를 별도로 관리하는 대신 더 적절한 이름을 지정하고 포괄적인 maxInterStageShaderVariables에 집중할 수 있습니다.

Chrome 135에서 완전히 삭제하는 것이 목표입니다. 지원 중단 인텐트문제 364338810을 참고하세요.

Dawn 업데이트

wgpu::Device::GetAdapterInfo(adapterInfo)를 사용하면 wgpu::Device에서 직접 어댑터 정보를 가져올 수 있습니다. 문제 376600838을 참고하세요.

계산 상태를 정점 및 프래그먼트 상태와 일치시키기 위해 WGPUProgrammableStageDescriptor 구조체의 이름을 WGPUComputeState로 바꿨습니다. 문제 379059434를 참고하세요.

wgpu::VertexStepMode::VertexBufferNotUsed enum 값이 삭제되었습니다. 사용되지 않는 정점 버퍼 레이아웃은 이제 {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0}로 표현할 수 있습니다. 문제 383147017을 참고하세요.

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

WebGPU의 새로운 기능

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

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