규칙 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_NAMESinsrc/compiler/ts/type-map.tsfor the nine shapes and the three short spellings (TS8002 UNKNOWN_TYPEnames all twelve);TS8027 MAT_UNSUPPORTEDfor a non-squarematCxR<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 LAYOUTinsrc/compiler/ts/bindings.tsfor 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 namemat2x4and twovec2fields as the remedies), pinned bysrc/compiler/ts/uniform-layout.test.ts;wgslLayoutinsrc/core/reflect.tsthrows the same sentence fromsrc/core/std140.tsfor a std140 layout built another way;TS8003 TYPE_MISMATCHfora * bon 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 bysrc/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, andexamples/normal-matrix.shade.tson both halves of the gate, which pin them.
커밋 c66579bf에서 이 규칙을 확인하는 파일입니다. 파일마다 규칙을 처음 가리키는 줄로 연결했습니다.
설명하는 절
커밋 c66579bf의 표면 문서에서 이 규칙을 설명하는 절입니다.
적용하는 오류 코드
규칙이 Enforced by 항목에서 가리키는 진단 코드와, 레지스트리 설명에서 이 규칙을 가리키는 진단 코드입니다.
-
TS8002UNKNOWN_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, animplementsclause, 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). -
TS8003TYPE_MISMATCH - 연산자나 조건, 선언, 반환, 인자처럼 두 값이 만나는 자리에서 타입이 서로 맞지 않거나, 컴파일러가 접는 상수를 WGSL이 거부합니다. 31을 넘는 시프트 양, 0인 제수, 서로 엇갈린 clamp 경계, 범위를 넘는 f32 값이 그렇습니다.
-
TS8027MAT_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. -
TS8051LAYOUT - 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 auniformorstoragebinding, 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 ofvec3<bool>), a runtime-sizedarray<T>that is not its struct's last member, or a runtime-sized array in a uniform, whose type must be constructible.
함께 보기
소스
커밋 c66579bf의 규칙 원문:
docs/language-design.md:319(설계 문서)reqs/rules/RULE-0408.md(추적 항목)