@@ -194,3 +194,68 @@ impl<V: Vector<S, 4>, S: Scalar>
194194pub trait ImageCoordinateSubpassData < T , const ARRAYED : u32 > { }
195195impl < V : Vector < I , 2 > , I : Integer > ImageCoordinateSubpassData < I , { Arrayed :: False as u32 } > for V { }
196196impl < V : Vector < I , 3 > , I : Integer > ImageCoordinateSubpassData < I , { Arrayed :: True as u32 } > for V { }
197+
198+ /// Marker trait for query size results based on image dimension and arraying.
199+ ///
200+ /// Unlike `ImageCoordinate`, this trait represents the SPIR-V size query results:
201+ /// - 1D images return a scalar
202+ /// - 2D/Cube/Rect images return 2 components (Cube returns face width/height)
203+ /// - 3D images return 3 components
204+ /// - Arrayed images add one component for the array size
205+ pub trait ImageSizeQuery < T , const DIM : u32 , const ARRAYED : u32 > { }
206+
207+ // 1D images
208+ impl < T : Scalar > ImageSizeQuery < T , { Dimensionality :: OneD as u32 } , { Arrayed :: False as u32 } >
209+ for T
210+ {
211+ }
212+ impl < V : Vector < T , 2 > , T : Scalar >
213+ ImageSizeQuery < T , { Dimensionality :: OneD as u32 } , { Arrayed :: True as u32 } > for V
214+ {
215+ }
216+
217+ // 2D images
218+ impl < V : Vector < T , 2 > , T : Scalar >
219+ ImageSizeQuery < T , { Dimensionality :: TwoD as u32 } , { Arrayed :: False as u32 } > for V
220+ {
221+ }
222+ impl < V : Vector < T , 3 > , T : Scalar >
223+ ImageSizeQuery < T , { Dimensionality :: TwoD as u32 } , { Arrayed :: True as u32 } > for V
224+ {
225+ }
226+
227+ // 3D images
228+ impl < V : Vector < T , 3 > , T : Scalar >
229+ ImageSizeQuery < T , { Dimensionality :: ThreeD as u32 } , { Arrayed :: False as u32 } > for V
230+ {
231+ }
232+ impl < V : Vector < T , 4 > , T : Scalar >
233+ ImageSizeQuery < T , { Dimensionality :: ThreeD as u32 } , { Arrayed :: True as u32 } > for V
234+ {
235+ }
236+
237+ // Cube images - returns 2D size (width/height of face)
238+ impl < V : Vector < T , 2 > , T : Scalar >
239+ ImageSizeQuery < T , { Dimensionality :: Cube as u32 } , { Arrayed :: False as u32 } > for V
240+ {
241+ }
242+ impl < V : Vector < T , 3 > , T : Scalar >
243+ ImageSizeQuery < T , { Dimensionality :: Cube as u32 } , { Arrayed :: True as u32 } > for V
244+ {
245+ }
246+
247+ // Rect images
248+ impl < V : Vector < T , 2 > , T : Scalar >
249+ ImageSizeQuery < T , { Dimensionality :: Rect as u32 } , { Arrayed :: False as u32 } > for V
250+ {
251+ }
252+ impl < V : Vector < T , 3 > , T : Scalar >
253+ ImageSizeQuery < T , { Dimensionality :: Rect as u32 } , { Arrayed :: True as u32 } > for V
254+ {
255+ }
256+
257+ // Buffer images
258+ impl < T : Scalar > ImageSizeQuery < T , { Dimensionality :: Buffer as u32 } , { Arrayed :: False as u32 } >
259+ for T
260+ {
261+ }
0 commit comments