@@ -8,6 +8,7 @@ pub mod index;
8
8
mod layouter;
9
9
mod namer;
10
10
mod terminator;
11
+ mod type_methods;
11
12
mod typifier;
12
13
13
14
pub use constant_evaluator:: {
@@ -74,91 +75,6 @@ impl From<super::StorageFormat> for super::Scalar {
74
75
}
75
76
}
76
77
77
- impl super :: ScalarKind {
78
- pub const fn is_numeric ( self ) -> bool {
79
- match self {
80
- crate :: ScalarKind :: Sint
81
- | crate :: ScalarKind :: Uint
82
- | crate :: ScalarKind :: Float
83
- | crate :: ScalarKind :: AbstractInt
84
- | crate :: ScalarKind :: AbstractFloat => true ,
85
- crate :: ScalarKind :: Bool => false ,
86
- }
87
- }
88
- }
89
-
90
- impl super :: Scalar {
91
- pub const I32 : Self = Self {
92
- kind : crate :: ScalarKind :: Sint ,
93
- width : 4 ,
94
- } ;
95
- pub const U32 : Self = Self {
96
- kind : crate :: ScalarKind :: Uint ,
97
- width : 4 ,
98
- } ;
99
- pub const F32 : Self = Self {
100
- kind : crate :: ScalarKind :: Float ,
101
- width : 4 ,
102
- } ;
103
- pub const F64 : Self = Self {
104
- kind : crate :: ScalarKind :: Float ,
105
- width : 8 ,
106
- } ;
107
- pub const I64 : Self = Self {
108
- kind : crate :: ScalarKind :: Sint ,
109
- width : 8 ,
110
- } ;
111
- pub const U64 : Self = Self {
112
- kind : crate :: ScalarKind :: Uint ,
113
- width : 8 ,
114
- } ;
115
- pub const BOOL : Self = Self {
116
- kind : crate :: ScalarKind :: Bool ,
117
- width : crate :: BOOL_WIDTH ,
118
- } ;
119
- pub const ABSTRACT_INT : Self = Self {
120
- kind : crate :: ScalarKind :: AbstractInt ,
121
- width : crate :: ABSTRACT_WIDTH ,
122
- } ;
123
- pub const ABSTRACT_FLOAT : Self = Self {
124
- kind : crate :: ScalarKind :: AbstractFloat ,
125
- width : crate :: ABSTRACT_WIDTH ,
126
- } ;
127
-
128
- pub const fn is_abstract ( self ) -> bool {
129
- match self . kind {
130
- crate :: ScalarKind :: AbstractInt | crate :: ScalarKind :: AbstractFloat => true ,
131
- crate :: ScalarKind :: Sint
132
- | crate :: ScalarKind :: Uint
133
- | crate :: ScalarKind :: Float
134
- | crate :: ScalarKind :: Bool => false ,
135
- }
136
- }
137
-
138
- /// Construct a float `Scalar` with the given width.
139
- ///
140
- /// This is especially common when dealing with
141
- /// `TypeInner::Matrix`, where the scalar kind is implicit.
142
- pub const fn float ( width : crate :: Bytes ) -> Self {
143
- Self {
144
- kind : crate :: ScalarKind :: Float ,
145
- width,
146
- }
147
- }
148
-
149
- pub const fn to_inner_scalar ( self ) -> crate :: TypeInner {
150
- crate :: TypeInner :: Scalar ( self )
151
- }
152
-
153
- pub const fn to_inner_vector ( self , size : crate :: VectorSize ) -> crate :: TypeInner {
154
- crate :: TypeInner :: Vector { size, scalar : self }
155
- }
156
-
157
- pub const fn to_inner_atomic ( self ) -> crate :: TypeInner {
158
- crate :: TypeInner :: Atomic ( self )
159
- }
160
- }
161
-
162
78
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
163
79
pub enum HashableLiteral {
164
80
F64 ( u64 ) ,
@@ -240,176 +156,6 @@ impl crate::Literal {
240
156
}
241
157
}
242
158
243
- pub const POINTER_SPAN : u32 = 4 ;
244
-
245
- impl super :: TypeInner {
246
- /// Return the scalar type of `self`.
247
- ///
248
- /// If `inner` is a scalar, vector, or matrix type, return
249
- /// its scalar type. Otherwise, return `None`.
250
- pub const fn scalar ( & self ) -> Option < super :: Scalar > {
251
- use crate :: TypeInner as Ti ;
252
- match * self {
253
- Ti :: Scalar ( scalar) | Ti :: Vector { scalar, .. } => Some ( scalar) ,
254
- Ti :: Matrix { scalar, .. } => Some ( scalar) ,
255
- _ => None ,
256
- }
257
- }
258
-
259
- pub fn scalar_kind ( & self ) -> Option < super :: ScalarKind > {
260
- self . scalar ( ) . map ( |scalar| scalar. kind )
261
- }
262
-
263
- /// Returns the scalar width in bytes
264
- pub fn scalar_width ( & self ) -> Option < u8 > {
265
- self . scalar ( ) . map ( |scalar| scalar. width )
266
- }
267
-
268
- pub const fn pointer_space ( & self ) -> Option < crate :: AddressSpace > {
269
- match * self {
270
- Self :: Pointer { space, .. } => Some ( space) ,
271
- Self :: ValuePointer { space, .. } => Some ( space) ,
272
- _ => None ,
273
- }
274
- }
275
-
276
- pub fn is_atomic_pointer ( & self , types : & crate :: UniqueArena < crate :: Type > ) -> bool {
277
- match * self {
278
- crate :: TypeInner :: Pointer { base, .. } => match types[ base] . inner {
279
- crate :: TypeInner :: Atomic { .. } => true ,
280
- _ => false ,
281
- } ,
282
- _ => false ,
283
- }
284
- }
285
-
286
- /// Get the size of this type.
287
- pub fn size ( & self , _gctx : GlobalCtx ) -> u32 {
288
- match * self {
289
- Self :: Scalar ( scalar) | Self :: Atomic ( scalar) => scalar. width as u32 ,
290
- Self :: Vector { size, scalar } => size as u32 * scalar. width as u32 ,
291
- // matrices are treated as arrays of aligned columns
292
- Self :: Matrix {
293
- columns,
294
- rows,
295
- scalar,
296
- } => Alignment :: from ( rows) * scalar. width as u32 * columns as u32 ,
297
- Self :: Pointer { .. } | Self :: ValuePointer { .. } => POINTER_SPAN ,
298
- Self :: Array {
299
- base : _,
300
- size,
301
- stride,
302
- } => {
303
- let count = match size {
304
- super :: ArraySize :: Constant ( count) => count. get ( ) ,
305
- // any struct member or array element needing a size at pipeline-creation time
306
- // must have a creation-fixed footprint
307
- super :: ArraySize :: Pending ( _) => 0 ,
308
- // A dynamically-sized array has to have at least one element
309
- super :: ArraySize :: Dynamic => 1 ,
310
- } ;
311
- count * stride
312
- }
313
- Self :: Struct { span, .. } => span,
314
- Self :: Image { .. }
315
- | Self :: Sampler { .. }
316
- | Self :: AccelerationStructure
317
- | Self :: RayQuery
318
- | Self :: BindingArray { .. } => 0 ,
319
- }
320
- }
321
-
322
- /// Return the canonical form of `self`, or `None` if it's already in
323
- /// canonical form.
324
- ///
325
- /// Certain types have multiple representations in `TypeInner`. This
326
- /// function converts all forms of equivalent types to a single
327
- /// representative of their class, so that simply applying `Eq` to the
328
- /// result indicates whether the types are equivalent, as far as Naga IR is
329
- /// concerned.
330
- pub fn canonical_form (
331
- & self ,
332
- types : & crate :: UniqueArena < crate :: Type > ,
333
- ) -> Option < crate :: TypeInner > {
334
- use crate :: TypeInner as Ti ;
335
- match * self {
336
- Ti :: Pointer { base, space } => match types[ base] . inner {
337
- Ti :: Scalar ( scalar) => Some ( Ti :: ValuePointer {
338
- size : None ,
339
- scalar,
340
- space,
341
- } ) ,
342
- Ti :: Vector { size, scalar } => Some ( Ti :: ValuePointer {
343
- size : Some ( size) ,
344
- scalar,
345
- space,
346
- } ) ,
347
- _ => None ,
348
- } ,
349
- _ => None ,
350
- }
351
- }
352
-
353
- /// Compare `self` and `rhs` as types.
354
- ///
355
- /// This is mostly the same as `<TypeInner as Eq>::eq`, but it treats
356
- /// `ValuePointer` and `Pointer` types as equivalent.
357
- ///
358
- /// When you know that one side of the comparison is never a pointer, it's
359
- /// fine to not bother with canonicalization, and just compare `TypeInner`
360
- /// values with `==`.
361
- pub fn equivalent (
362
- & self ,
363
- rhs : & crate :: TypeInner ,
364
- types : & crate :: UniqueArena < crate :: Type > ,
365
- ) -> bool {
366
- let left = self . canonical_form ( types) ;
367
- let right = rhs. canonical_form ( types) ;
368
- left. as_ref ( ) . unwrap_or ( self ) == right. as_ref ( ) . unwrap_or ( rhs)
369
- }
370
-
371
- pub fn is_dynamically_sized ( & self , types : & crate :: UniqueArena < crate :: Type > ) -> bool {
372
- use crate :: TypeInner as Ti ;
373
- match * self {
374
- Ti :: Array { size, .. } => size == crate :: ArraySize :: Dynamic ,
375
- Ti :: Struct { ref members, .. } => members
376
- . last ( )
377
- . map ( |last| types[ last. ty ] . inner . is_dynamically_sized ( types) )
378
- . unwrap_or ( false ) ,
379
- _ => false ,
380
- }
381
- }
382
-
383
- pub fn components ( & self ) -> Option < u32 > {
384
- Some ( match * self {
385
- Self :: Vector { size, .. } => size as u32 ,
386
- Self :: Matrix { columns, .. } => columns as u32 ,
387
- Self :: Array {
388
- size : crate :: ArraySize :: Constant ( len) ,
389
- ..
390
- } => len. get ( ) ,
391
- Self :: Struct { ref members, .. } => members. len ( ) as u32 ,
392
- _ => return None ,
393
- } )
394
- }
395
-
396
- pub fn component_type ( & self , index : usize ) -> Option < TypeResolution > {
397
- Some ( match * self {
398
- Self :: Vector { scalar, .. } => TypeResolution :: Value ( crate :: TypeInner :: Scalar ( scalar) ) ,
399
- Self :: Matrix { rows, scalar, .. } => {
400
- TypeResolution :: Value ( crate :: TypeInner :: Vector { size : rows, scalar } )
401
- }
402
- Self :: Array {
403
- base,
404
- size : crate :: ArraySize :: Constant ( _) ,
405
- ..
406
- } => TypeResolution :: Handle ( base) ,
407
- Self :: Struct { ref members, .. } => TypeResolution :: Handle ( members[ index] . ty ) ,
408
- _ => return None ,
409
- } )
410
- }
411
- }
412
-
413
159
impl super :: AddressSpace {
414
160
pub fn access ( self ) -> crate :: StorageAccess {
415
161
use crate :: StorageAccess as Sa ;
0 commit comments