규칙 4.8
이 페이지에서

규칙 4.8

4장, 타입 테스트

Every matCxR with C and R in 2, 3, 4 must be a type, and a square one must also answer to matN. A matrix element must be f32, or f64 on a square shape only. A two-row matrix (mat2x2, mat3x2, mat4x2) in a uniform block must be refused with the remedy, since WGSL gives its column a stride of 8 and std140 rounds every column to 16, so the two targets would place it and every later field at different offsets.

규칙 본문과 그 아래 항목은 설계 문서에 적힌 컴파일러 원문이라 한국어 페이지에서도 영어로 둡니다.

근거

a shape both targets lay out alike needs no ceremony, and a shape they lay out differently is refused rather than padded, because padding would make the emitted WGSL disagree with the offsets reflect() reports (Rule 6.8).

출처

Matrix Types (matCxR<T>, T a floating-point type) and Memory Layout (the column stride is AlignOf(vecR<T>)); PR #166, which measured the std140 stride on a WebGL2 driver and on Tint (surface §40); #149.

검증 방식

테스트로 확인합니다. 테스트나 게이트 스크립트, CI 워크플로가 이 규칙을 가리키고, 아래 파일 가운데 하나라도 규칙을 더는 가리키지 않으면 추적 검사가 실패합니다.

컴파일러가 이 규칙을 적용하는 곳을 규칙이 직접 적은 내용입니다.

  • MAT_TYPE_NAMES in src/compiler/ts/type-map.ts for the nine shapes and the three short spellings (TS8002 UNKNOWN_TYPE names all twelve);
  • TS8027 MAT_UNSUPPORTED for a non-square matCxR<f64> (mat2x3<f64> has no emulated-double form: the fp64 pass carries a square matrix of doubles only (mat2, mat3, mat4). Declare it mat2x3 and narrow, or use a square shape.);
  • TS8051 LAYOUT in src/compiler/ts/bindings.ts for the two-row uniform field, at the binding’s declaration and with neither target emitted ("U.m" is in a uniform: mat2x2 in std140 is not supported, a sentence that goes on to name mat2x4 and two vec2 fields as the remedies), pinned by src/compiler/ts/uniform-layout.test.ts; wgslLayout in src/core/reflect.ts throws the same sentence from src/core/std140.ts for a std140 layout built another way;
  • TS8003 TYPE_MISMATCH for a * b on two matrices whose dimensions do not meet, two of one non-square shape among them (Type mismatch: cannot * mat2x3 and mat2x3. WGSL's matrix product is matKxR * matCxK -> matCxR: …), pinned by src/compiler/ts/matrices.test.ts (refuses two matrices of ONE non-square shape, which have one type key) (#169);
  • src/compiler/ts/matrices.test.ts, src/core/reflect.test.ts, and examples/normal-matrix.shade.ts on both halves of the gate, which pin them.

커밋 c66579bf에서 이 규칙을 확인하는 파일입니다. 파일마다 규칙을 처음 가리키는 줄로 연결했습니다.

설명하는 절

커밋 c66579bf의 표면 문서에서 이 규칙을 설명하는 절입니다.

적용하는 오류 코드

규칙이 Enforced by 항목에서 가리키는 진단 코드와, 레지스트리 설명에서 이 규칙을 가리키는 진단 코드입니다.

TS8002 UNKNOWN_TYPE
A type name nothing declares, said once for the file wherever it is written (a parameter, a claim, a type argument, B<vec3<Foo>> included, an alias, an implements clause, the base a class or an interface extends, a body no call lowers), a type the library declares for TypeScript alone (Number) where the file declares none of its name, or a type this surface does not take in a position the mapper reads (Rule 2.1).
TS8003 TYPE_MISMATCH
연산자나 조건, 선언, 반환, 인자처럼 두 값이 만나는 자리에서 타입이 서로 맞지 않거나, 컴파일러가 접는 상수를 WGSL이 거부합니다. 31을 넘는 시프트 양, 0인 제수, 서로 엇갈린 clamp 경계, 범위를 넘는 f32 값이 그렇습니다.
TS8027 MAT_UNSUPPORTED
A non-square matCxR<f64>: the fp64 pass carries one df64 body per dimension (DF64MatN, matmul, matvec, transpose), so only a square matrix of doubles lowers.
TS8051 LAYOUT
A buffer binding's store type breaks one of WGSL's host-shareable rules (§51), which a struct hides from the type map and the backend only meets as emitted text: a bool, alone or in a vector, in a uniform or storage binding, as a field, a runtime array's element or the whole type (type 'bool' cannot be used in address space 'uniform' as it is non-host-shareable, and the same of vec3<bool>), a runtime-sized array<T> that is not its struct's last member, or a runtime-sized array in a uniform, whose type must be constructible.

함께 보기

소스

커밋 c66579bf의 규칙 원문:

이 페이지 편집 문제 보고