Skip to main content

pebble/graphics/
types.rs

1pub mod flags;
2pub mod limits;
3pub mod pipeline_state;
4
5/// Mirrors `winit::window::CursorIcon` — kept as our own type so no `winit`
6/// type leaks into the public API.
7#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
8pub enum CursorIcon {
9    #[default]
10    Default,
11    ContextMenu,
12    Help,
13    Pointer,
14    Progress,
15    Wait,
16    Cell,
17    Crosshair,
18    Text,
19    VerticalText,
20    Alias,
21    Copy,
22    Move,
23    NoDrop,
24    NotAllowed,
25    Grab,
26    Grabbing,
27    EResize,
28    NResize,
29    NeResize,
30    NwResize,
31    SResize,
32    SeResize,
33    SwResize,
34    WResize,
35    EwResize,
36    NsResize,
37    NeswResize,
38    NwseResize,
39    ColResize,
40    RowResize,
41    AllScroll,
42    ZoomIn,
43    ZoomOut,
44    DndAsk,
45    AllResize,
46}
47
48impl From<CursorIcon> for winit::window::CursorIcon {
49    fn from(value: CursorIcon) -> Self {
50        match value {
51            CursorIcon::Default => Self::Default,
52            CursorIcon::ContextMenu => Self::ContextMenu,
53            CursorIcon::Help => Self::Help,
54            CursorIcon::Pointer => Self::Pointer,
55            CursorIcon::Progress => Self::Progress,
56            CursorIcon::Wait => Self::Wait,
57            CursorIcon::Cell => Self::Cell,
58            CursorIcon::Crosshair => Self::Crosshair,
59            CursorIcon::Text => Self::Text,
60            CursorIcon::VerticalText => Self::VerticalText,
61            CursorIcon::Alias => Self::Alias,
62            CursorIcon::Copy => Self::Copy,
63            CursorIcon::Move => Self::Move,
64            CursorIcon::NoDrop => Self::NoDrop,
65            CursorIcon::NotAllowed => Self::NotAllowed,
66            CursorIcon::Grab => Self::Grab,
67            CursorIcon::Grabbing => Self::Grabbing,
68            CursorIcon::EResize => Self::EResize,
69            CursorIcon::NResize => Self::NResize,
70            CursorIcon::NeResize => Self::NeResize,
71            CursorIcon::NwResize => Self::NwResize,
72            CursorIcon::SResize => Self::SResize,
73            CursorIcon::SeResize => Self::SeResize,
74            CursorIcon::SwResize => Self::SwResize,
75            CursorIcon::WResize => Self::WResize,
76            CursorIcon::EwResize => Self::EwResize,
77            CursorIcon::NsResize => Self::NsResize,
78            CursorIcon::NeswResize => Self::NeswResize,
79            CursorIcon::NwseResize => Self::NwseResize,
80            CursorIcon::ColResize => Self::ColResize,
81            CursorIcon::RowResize => Self::RowResize,
82            CursorIcon::AllScroll => Self::AllScroll,
83            CursorIcon::ZoomIn => Self::ZoomIn,
84            CursorIcon::ZoomOut => Self::ZoomOut,
85            CursorIcon::DndAsk => Self::DndAsk,
86            CursorIcon::AllResize => Self::AllResize,
87        }
88    }
89}
90
91/// Mirrors `winit::window::CursorGrabMode`, for [`Window::set_cursor_grab`](crate::graphics::window::Window::set_cursor_grab).
92#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
93pub enum CursorGrabMode {
94    #[default]
95    None,
96    Confined,
97    Locked,
98}
99
100impl From<CursorGrabMode> for winit::window::CursorGrabMode {
101    fn from(value: CursorGrabMode) -> Self {
102        match value {
103            CursorGrabMode::None => Self::None,
104            CursorGrabMode::Confined => Self::Confined,
105            CursorGrabMode::Locked => Self::Locked,
106        }
107    }
108}
109
110/// Mirrors `winit::keyboard::KeyCode` (physical key position, not the
111/// character it produces) — no `winit` type leaks into the public API.
112#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
113pub enum KeyCode {
114    Backquote,
115    Backslash,
116    BracketLeft,
117    BracketRight,
118    Comma,
119    Digit0,
120    Digit1,
121    Digit2,
122    Digit3,
123    Digit4,
124    Digit5,
125    Digit6,
126    Digit7,
127    Digit8,
128    Digit9,
129    Equal,
130    IntlBackslash,
131    IntlRo,
132    IntlYen,
133    KeyA,
134    KeyB,
135    KeyC,
136    KeyD,
137    KeyE,
138    KeyF,
139    KeyG,
140    KeyH,
141    KeyI,
142    KeyJ,
143    KeyK,
144    KeyL,
145    KeyM,
146    KeyN,
147    KeyO,
148    KeyP,
149    KeyQ,
150    KeyR,
151    KeyS,
152    KeyT,
153    KeyU,
154    KeyV,
155    KeyW,
156    KeyX,
157    KeyY,
158    KeyZ,
159    Minus,
160    Period,
161    Quote,
162    Semicolon,
163    Slash,
164    AltLeft,
165    AltRight,
166    Backspace,
167    CapsLock,
168    ContextMenu,
169    ControlLeft,
170    ControlRight,
171    Enter,
172    SuperLeft,
173    SuperRight,
174    ShiftLeft,
175    ShiftRight,
176    Space,
177    Tab,
178    Convert,
179    KanaMode,
180    Lang1,
181    Lang2,
182    Lang3,
183    Lang4,
184    Lang5,
185    NonConvert,
186    Delete,
187    End,
188    Help,
189    Home,
190    Insert,
191    PageDown,
192    PageUp,
193    ArrowDown,
194    ArrowLeft,
195    ArrowRight,
196    ArrowUp,
197    NumLock,
198    Numpad0,
199    Numpad1,
200    Numpad2,
201    Numpad3,
202    Numpad4,
203    Numpad5,
204    Numpad6,
205    Numpad7,
206    Numpad8,
207    Numpad9,
208    NumpadAdd,
209    NumpadBackspace,
210    NumpadClear,
211    NumpadClearEntry,
212    NumpadComma,
213    NumpadDecimal,
214    NumpadDivide,
215    NumpadEnter,
216    NumpadEqual,
217    NumpadHash,
218    NumpadMemoryAdd,
219    NumpadMemoryClear,
220    NumpadMemoryRecall,
221    NumpadMemoryStore,
222    NumpadMemorySubtract,
223    NumpadMultiply,
224    NumpadParenLeft,
225    NumpadParenRight,
226    NumpadStar,
227    NumpadSubtract,
228    Escape,
229    Fn,
230    FnLock,
231    PrintScreen,
232    ScrollLock,
233    Pause,
234    BrowserBack,
235    BrowserFavorites,
236    BrowserForward,
237    BrowserHome,
238    BrowserRefresh,
239    BrowserSearch,
240    BrowserStop,
241    Eject,
242    LaunchApp1,
243    LaunchApp2,
244    LaunchMail,
245    MediaPlayPause,
246    MediaSelect,
247    MediaStop,
248    MediaTrackNext,
249    MediaTrackPrevious,
250    Power,
251    Sleep,
252    AudioVolumeDown,
253    AudioVolumeMute,
254    AudioVolumeUp,
255    WakeUp,
256    Meta,
257    Hyper,
258    Turbo,
259    Abort,
260    Resume,
261    Suspend,
262    Again,
263    Copy,
264    Cut,
265    Find,
266    Open,
267    Paste,
268    Props,
269    Select,
270    Undo,
271    Hiragana,
272    Katakana,
273    F1,
274    F2,
275    F3,
276    F4,
277    F5,
278    F6,
279    F7,
280    F8,
281    F9,
282    F10,
283    F11,
284    F12,
285    F13,
286    F14,
287    F15,
288    F16,
289    F17,
290    F18,
291    F19,
292    F20,
293    F21,
294    F22,
295    F23,
296    F24,
297    F25,
298    F26,
299    F27,
300    F28,
301    F29,
302    F30,
303    F31,
304    F32,
305    F33,
306    F34,
307    F35,
308}
309
310impl From<KeyCode> for winit::keyboard::KeyCode {
311    fn from(value: KeyCode) -> Self {
312        match value {
313            KeyCode::Backquote => Self::Backquote,
314            KeyCode::Backslash => Self::Backslash,
315            KeyCode::BracketLeft => Self::BracketLeft,
316            KeyCode::BracketRight => Self::BracketRight,
317            KeyCode::Comma => Self::Comma,
318            KeyCode::Digit0 => Self::Digit0,
319            KeyCode::Digit1 => Self::Digit1,
320            KeyCode::Digit2 => Self::Digit2,
321            KeyCode::Digit3 => Self::Digit3,
322            KeyCode::Digit4 => Self::Digit4,
323            KeyCode::Digit5 => Self::Digit5,
324            KeyCode::Digit6 => Self::Digit6,
325            KeyCode::Digit7 => Self::Digit7,
326            KeyCode::Digit8 => Self::Digit8,
327            KeyCode::Digit9 => Self::Digit9,
328            KeyCode::Equal => Self::Equal,
329            KeyCode::IntlBackslash => Self::IntlBackslash,
330            KeyCode::IntlRo => Self::IntlRo,
331            KeyCode::IntlYen => Self::IntlYen,
332            KeyCode::KeyA => Self::KeyA,
333            KeyCode::KeyB => Self::KeyB,
334            KeyCode::KeyC => Self::KeyC,
335            KeyCode::KeyD => Self::KeyD,
336            KeyCode::KeyE => Self::KeyE,
337            KeyCode::KeyF => Self::KeyF,
338            KeyCode::KeyG => Self::KeyG,
339            KeyCode::KeyH => Self::KeyH,
340            KeyCode::KeyI => Self::KeyI,
341            KeyCode::KeyJ => Self::KeyJ,
342            KeyCode::KeyK => Self::KeyK,
343            KeyCode::KeyL => Self::KeyL,
344            KeyCode::KeyM => Self::KeyM,
345            KeyCode::KeyN => Self::KeyN,
346            KeyCode::KeyO => Self::KeyO,
347            KeyCode::KeyP => Self::KeyP,
348            KeyCode::KeyQ => Self::KeyQ,
349            KeyCode::KeyR => Self::KeyR,
350            KeyCode::KeyS => Self::KeyS,
351            KeyCode::KeyT => Self::KeyT,
352            KeyCode::KeyU => Self::KeyU,
353            KeyCode::KeyV => Self::KeyV,
354            KeyCode::KeyW => Self::KeyW,
355            KeyCode::KeyX => Self::KeyX,
356            KeyCode::KeyY => Self::KeyY,
357            KeyCode::KeyZ => Self::KeyZ,
358            KeyCode::Minus => Self::Minus,
359            KeyCode::Period => Self::Period,
360            KeyCode::Quote => Self::Quote,
361            KeyCode::Semicolon => Self::Semicolon,
362            KeyCode::Slash => Self::Slash,
363            KeyCode::AltLeft => Self::AltLeft,
364            KeyCode::AltRight => Self::AltRight,
365            KeyCode::Backspace => Self::Backspace,
366            KeyCode::CapsLock => Self::CapsLock,
367            KeyCode::ContextMenu => Self::ContextMenu,
368            KeyCode::ControlLeft => Self::ControlLeft,
369            KeyCode::ControlRight => Self::ControlRight,
370            KeyCode::Enter => Self::Enter,
371            KeyCode::SuperLeft => Self::SuperLeft,
372            KeyCode::SuperRight => Self::SuperRight,
373            KeyCode::ShiftLeft => Self::ShiftLeft,
374            KeyCode::ShiftRight => Self::ShiftRight,
375            KeyCode::Space => Self::Space,
376            KeyCode::Tab => Self::Tab,
377            KeyCode::Convert => Self::Convert,
378            KeyCode::KanaMode => Self::KanaMode,
379            KeyCode::Lang1 => Self::Lang1,
380            KeyCode::Lang2 => Self::Lang2,
381            KeyCode::Lang3 => Self::Lang3,
382            KeyCode::Lang4 => Self::Lang4,
383            KeyCode::Lang5 => Self::Lang5,
384            KeyCode::NonConvert => Self::NonConvert,
385            KeyCode::Delete => Self::Delete,
386            KeyCode::End => Self::End,
387            KeyCode::Help => Self::Help,
388            KeyCode::Home => Self::Home,
389            KeyCode::Insert => Self::Insert,
390            KeyCode::PageDown => Self::PageDown,
391            KeyCode::PageUp => Self::PageUp,
392            KeyCode::ArrowDown => Self::ArrowDown,
393            KeyCode::ArrowLeft => Self::ArrowLeft,
394            KeyCode::ArrowRight => Self::ArrowRight,
395            KeyCode::ArrowUp => Self::ArrowUp,
396            KeyCode::NumLock => Self::NumLock,
397            KeyCode::Numpad0 => Self::Numpad0,
398            KeyCode::Numpad1 => Self::Numpad1,
399            KeyCode::Numpad2 => Self::Numpad2,
400            KeyCode::Numpad3 => Self::Numpad3,
401            KeyCode::Numpad4 => Self::Numpad4,
402            KeyCode::Numpad5 => Self::Numpad5,
403            KeyCode::Numpad6 => Self::Numpad6,
404            KeyCode::Numpad7 => Self::Numpad7,
405            KeyCode::Numpad8 => Self::Numpad8,
406            KeyCode::Numpad9 => Self::Numpad9,
407            KeyCode::NumpadAdd => Self::NumpadAdd,
408            KeyCode::NumpadBackspace => Self::NumpadBackspace,
409            KeyCode::NumpadClear => Self::NumpadClear,
410            KeyCode::NumpadClearEntry => Self::NumpadClearEntry,
411            KeyCode::NumpadComma => Self::NumpadComma,
412            KeyCode::NumpadDecimal => Self::NumpadDecimal,
413            KeyCode::NumpadDivide => Self::NumpadDivide,
414            KeyCode::NumpadEnter => Self::NumpadEnter,
415            KeyCode::NumpadEqual => Self::NumpadEqual,
416            KeyCode::NumpadHash => Self::NumpadHash,
417            KeyCode::NumpadMemoryAdd => Self::NumpadMemoryAdd,
418            KeyCode::NumpadMemoryClear => Self::NumpadMemoryClear,
419            KeyCode::NumpadMemoryRecall => Self::NumpadMemoryRecall,
420            KeyCode::NumpadMemoryStore => Self::NumpadMemoryStore,
421            KeyCode::NumpadMemorySubtract => Self::NumpadMemorySubtract,
422            KeyCode::NumpadMultiply => Self::NumpadMultiply,
423            KeyCode::NumpadParenLeft => Self::NumpadParenLeft,
424            KeyCode::NumpadParenRight => Self::NumpadParenRight,
425            KeyCode::NumpadStar => Self::NumpadStar,
426            KeyCode::NumpadSubtract => Self::NumpadSubtract,
427            KeyCode::Escape => Self::Escape,
428            KeyCode::Fn => Self::Fn,
429            KeyCode::FnLock => Self::FnLock,
430            KeyCode::PrintScreen => Self::PrintScreen,
431            KeyCode::ScrollLock => Self::ScrollLock,
432            KeyCode::Pause => Self::Pause,
433            KeyCode::BrowserBack => Self::BrowserBack,
434            KeyCode::BrowserFavorites => Self::BrowserFavorites,
435            KeyCode::BrowserForward => Self::BrowserForward,
436            KeyCode::BrowserHome => Self::BrowserHome,
437            KeyCode::BrowserRefresh => Self::BrowserRefresh,
438            KeyCode::BrowserSearch => Self::BrowserSearch,
439            KeyCode::BrowserStop => Self::BrowserStop,
440            KeyCode::Eject => Self::Eject,
441            KeyCode::LaunchApp1 => Self::LaunchApp1,
442            KeyCode::LaunchApp2 => Self::LaunchApp2,
443            KeyCode::LaunchMail => Self::LaunchMail,
444            KeyCode::MediaPlayPause => Self::MediaPlayPause,
445            KeyCode::MediaSelect => Self::MediaSelect,
446            KeyCode::MediaStop => Self::MediaStop,
447            KeyCode::MediaTrackNext => Self::MediaTrackNext,
448            KeyCode::MediaTrackPrevious => Self::MediaTrackPrevious,
449            KeyCode::Power => Self::Power,
450            KeyCode::Sleep => Self::Sleep,
451            KeyCode::AudioVolumeDown => Self::AudioVolumeDown,
452            KeyCode::AudioVolumeMute => Self::AudioVolumeMute,
453            KeyCode::AudioVolumeUp => Self::AudioVolumeUp,
454            KeyCode::WakeUp => Self::WakeUp,
455            KeyCode::Meta => Self::Meta,
456            KeyCode::Hyper => Self::Hyper,
457            KeyCode::Turbo => Self::Turbo,
458            KeyCode::Abort => Self::Abort,
459            KeyCode::Resume => Self::Resume,
460            KeyCode::Suspend => Self::Suspend,
461            KeyCode::Again => Self::Again,
462            KeyCode::Copy => Self::Copy,
463            KeyCode::Cut => Self::Cut,
464            KeyCode::Find => Self::Find,
465            KeyCode::Open => Self::Open,
466            KeyCode::Paste => Self::Paste,
467            KeyCode::Props => Self::Props,
468            KeyCode::Select => Self::Select,
469            KeyCode::Undo => Self::Undo,
470            KeyCode::Hiragana => Self::Hiragana,
471            KeyCode::Katakana => Self::Katakana,
472            KeyCode::F1 => Self::F1,
473            KeyCode::F2 => Self::F2,
474            KeyCode::F3 => Self::F3,
475            KeyCode::F4 => Self::F4,
476            KeyCode::F5 => Self::F5,
477            KeyCode::F6 => Self::F6,
478            KeyCode::F7 => Self::F7,
479            KeyCode::F8 => Self::F8,
480            KeyCode::F9 => Self::F9,
481            KeyCode::F10 => Self::F10,
482            KeyCode::F11 => Self::F11,
483            KeyCode::F12 => Self::F12,
484            KeyCode::F13 => Self::F13,
485            KeyCode::F14 => Self::F14,
486            KeyCode::F15 => Self::F15,
487            KeyCode::F16 => Self::F16,
488            KeyCode::F17 => Self::F17,
489            KeyCode::F18 => Self::F18,
490            KeyCode::F19 => Self::F19,
491            KeyCode::F20 => Self::F20,
492            KeyCode::F21 => Self::F21,
493            KeyCode::F22 => Self::F22,
494            KeyCode::F23 => Self::F23,
495            KeyCode::F24 => Self::F24,
496            KeyCode::F25 => Self::F25,
497            KeyCode::F26 => Self::F26,
498            KeyCode::F27 => Self::F27,
499            KeyCode::F28 => Self::F28,
500            KeyCode::F29 => Self::F29,
501            KeyCode::F30 => Self::F30,
502            KeyCode::F31 => Self::F31,
503            KeyCode::F32 => Self::F32,
504            KeyCode::F33 => Self::F33,
505            KeyCode::F34 => Self::F34,
506            KeyCode::F35 => Self::F35,
507        }
508    }
509}
510
511#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
512/// Mirrors `winit_input_helper`'s mouse button representation.
513pub enum MouseButton {
514    Left,
515    Right,
516    Middle,
517    Back,
518    Forward,
519    Other(u16),
520}
521
522impl From<MouseButton> for winit::event::MouseButton {
523    fn from(value: MouseButton) -> Self {
524        match value {
525            MouseButton::Left => Self::Left,
526            MouseButton::Right => Self::Right,
527            MouseButton::Middle => Self::Middle,
528            MouseButton::Back => Self::Back,
529            MouseButton::Forward => Self::Forward,
530            MouseButton::Other(code) => Self::Other(code),
531        }
532    }
533}
534
535#[derive(Copy, Clone, Debug, PartialEq, Eq)]
536/// Mirrors `winit::event::TouchPhase`.
537pub enum TouchPhase {
538    Started,
539    Moved,
540    Ended,
541    Cancelled,
542}
543
544impl From<winit::event::TouchPhase> for TouchPhase {
545    fn from(value: winit::event::TouchPhase) -> Self {
546        match value {
547            winit::event::TouchPhase::Started => Self::Started,
548            winit::event::TouchPhase::Moved => Self::Moved,
549            winit::event::TouchPhase::Ended => Self::Ended,
550            winit::event::TouchPhase::Cancelled => Self::Cancelled,
551        }
552    }
553}
554
555#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
556/// ASTC compressed texture block size — see [`TextureFormat::Astc`].
557pub enum AstcBlock {
558    B4x4,
559    B5x4,
560    B5x5,
561    B6x5,
562    B6x6,
563    B8x5,
564    B8x6,
565    B8x8,
566    B10x5,
567    B10x6,
568    B10x8,
569    B10x10,
570    B12x10,
571    B12x12,
572}
573
574impl From<AstcBlock> for wgpu::AstcBlock {
575    fn from(value: AstcBlock) -> Self {
576        match value {
577            AstcBlock::B4x4 => Self::B4x4,
578            AstcBlock::B5x4 => Self::B5x4,
579            AstcBlock::B5x5 => Self::B5x5,
580            AstcBlock::B6x5 => Self::B6x5,
581            AstcBlock::B6x6 => Self::B6x6,
582            AstcBlock::B8x5 => Self::B8x5,
583            AstcBlock::B8x6 => Self::B8x6,
584            AstcBlock::B8x8 => Self::B8x8,
585            AstcBlock::B10x5 => Self::B10x5,
586            AstcBlock::B10x6 => Self::B10x6,
587            AstcBlock::B10x8 => Self::B10x8,
588            AstcBlock::B10x10 => Self::B10x10,
589            AstcBlock::B12x10 => Self::B12x10,
590            AstcBlock::B12x12 => Self::B12x12,
591        }
592    }
593}
594
595impl From<wgpu::AstcBlock> for AstcBlock {
596    fn from(value: wgpu::AstcBlock) -> Self {
597        match value {
598            wgpu::AstcBlock::B4x4 => Self::B4x4,
599            wgpu::AstcBlock::B5x4 => Self::B5x4,
600            wgpu::AstcBlock::B5x5 => Self::B5x5,
601            wgpu::AstcBlock::B6x5 => Self::B6x5,
602            wgpu::AstcBlock::B6x6 => Self::B6x6,
603            wgpu::AstcBlock::B8x5 => Self::B8x5,
604            wgpu::AstcBlock::B8x6 => Self::B8x6,
605            wgpu::AstcBlock::B8x8 => Self::B8x8,
606            wgpu::AstcBlock::B10x5 => Self::B10x5,
607            wgpu::AstcBlock::B10x6 => Self::B10x6,
608            wgpu::AstcBlock::B10x8 => Self::B10x8,
609            wgpu::AstcBlock::B10x10 => Self::B10x10,
610            wgpu::AstcBlock::B12x10 => Self::B12x10,
611            wgpu::AstcBlock::B12x12 => Self::B12x12,
612        }
613    }
614}
615
616#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
617/// ASTC compressed texture channel encoding — see [`TextureFormat::Astc`].
618pub enum AstcChannel {
619    Unorm,
620    UnormSrgb,
621    Hdr,
622}
623
624impl From<AstcChannel> for wgpu::AstcChannel {
625    fn from(value: AstcChannel) -> Self {
626        match value {
627            AstcChannel::Unorm => Self::Unorm,
628            AstcChannel::UnormSrgb => Self::UnormSrgb,
629            AstcChannel::Hdr => Self::Hdr,
630        }
631    }
632}
633
634impl From<wgpu::AstcChannel> for AstcChannel {
635    fn from(value: wgpu::AstcChannel) -> Self {
636        match value {
637            wgpu::AstcChannel::Unorm => Self::Unorm,
638            wgpu::AstcChannel::UnormSrgb => Self::UnormSrgb,
639            wgpu::AstcChannel::Hdr => Self::Hdr,
640        }
641    }
642}
643
644#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
645/// Mirrors `wgpu::TextureFormat` — every GPU pixel format a [`Texture`](crate::graphics::pipeline::textures::Texture)
646/// or render target can use.
647pub enum TextureFormat {
648    R8Unorm,
649    R8Snorm,
650    R8Uint,
651    R8Sint,
652    R16Uint,
653    R16Sint,
654    R16Unorm,
655    R16Snorm,
656    R16Float,
657    Rg8Unorm,
658    Rg8Snorm,
659    Rg8Uint,
660    Rg8Sint,
661    R32Uint,
662    R32Sint,
663    R32Float,
664    Rg16Uint,
665    Rg16Sint,
666    Rg16Unorm,
667    Rg16Snorm,
668    Rg16Float,
669    Rgba8Unorm,
670    Rgba8UnormSrgb,
671    Rgba8Snorm,
672    Rgba8Uint,
673    Rgba8Sint,
674    Bgra8Unorm,
675    Bgra8UnormSrgb,
676    Rgb9e5Ufloat,
677    Rgb10a2Uint,
678    Rgb10a2Unorm,
679    Rg11b10Ufloat,
680    R64Uint,
681    Rg32Uint,
682    Rg32Sint,
683    Rg32Float,
684    Rgba16Uint,
685    Rgba16Sint,
686    Rgba16Unorm,
687    Rgba16Snorm,
688    Rgba16Float,
689    Rgba32Uint,
690    Rgba32Sint,
691    Rgba32Float,
692    Stencil8,
693    Depth16Unorm,
694    Depth24Plus,
695    Depth24PlusStencil8,
696    Depth32Float,
697    Depth32FloatStencil8,
698    NV12,
699    P010,
700    Bc1RgbaUnorm,
701    Bc1RgbaUnormSrgb,
702    Bc2RgbaUnorm,
703    Bc2RgbaUnormSrgb,
704    Bc3RgbaUnorm,
705    Bc3RgbaUnormSrgb,
706    Bc4RUnorm,
707    Bc4RSnorm,
708    Bc5RgUnorm,
709    Bc5RgSnorm,
710    Bc6hRgbUfloat,
711    Bc6hRgbFloat,
712    Bc7RgbaUnorm,
713    Bc7RgbaUnormSrgb,
714    Etc2Rgb8Unorm,
715    Etc2Rgb8UnormSrgb,
716    Etc2Rgb8A1Unorm,
717    Etc2Rgb8A1UnormSrgb,
718    Etc2Rgba8Unorm,
719    Etc2Rgba8UnormSrgb,
720    EacR11Unorm,
721    EacR11Snorm,
722    EacRg11Unorm,
723    EacRg11Snorm,
724    Astc { block: AstcBlock, channel: AstcChannel },
725}
726
727impl From<TextureFormat> for wgpu::TextureFormat {
728    fn from(format: TextureFormat) -> Self {
729        match format {
730            TextureFormat::R8Unorm => Self::R8Unorm,
731            TextureFormat::R8Snorm => Self::R8Snorm,
732            TextureFormat::R8Uint => Self::R8Uint,
733            TextureFormat::R8Sint => Self::R8Sint,
734            TextureFormat::R16Uint => Self::R16Uint,
735            TextureFormat::R16Sint => Self::R16Sint,
736            TextureFormat::R16Unorm => Self::R16Unorm,
737            TextureFormat::R16Snorm => Self::R16Snorm,
738            TextureFormat::R16Float => Self::R16Float,
739            TextureFormat::Rg8Unorm => Self::Rg8Unorm,
740            TextureFormat::Rg8Snorm => Self::Rg8Snorm,
741            TextureFormat::Rg8Uint => Self::Rg8Uint,
742            TextureFormat::Rg8Sint => Self::Rg8Sint,
743            TextureFormat::R32Uint => Self::R32Uint,
744            TextureFormat::R32Sint => Self::R32Sint,
745            TextureFormat::R32Float => Self::R32Float,
746            TextureFormat::Rg16Uint => Self::Rg16Uint,
747            TextureFormat::Rg16Sint => Self::Rg16Sint,
748            TextureFormat::Rg16Unorm => Self::Rg16Unorm,
749            TextureFormat::Rg16Snorm => Self::Rg16Snorm,
750            TextureFormat::Rg16Float => Self::Rg16Float,
751            TextureFormat::Rgba8Unorm => Self::Rgba8Unorm,
752            TextureFormat::Rgba8UnormSrgb => Self::Rgba8UnormSrgb,
753            TextureFormat::Rgba8Snorm => Self::Rgba8Snorm,
754            TextureFormat::Rgba8Uint => Self::Rgba8Uint,
755            TextureFormat::Rgba8Sint => Self::Rgba8Sint,
756            TextureFormat::Bgra8Unorm => Self::Bgra8Unorm,
757            TextureFormat::Bgra8UnormSrgb => Self::Bgra8UnormSrgb,
758            TextureFormat::Rgb9e5Ufloat => Self::Rgb9e5Ufloat,
759            TextureFormat::Rgb10a2Uint => Self::Rgb10a2Uint,
760            TextureFormat::Rgb10a2Unorm => Self::Rgb10a2Unorm,
761            TextureFormat::Rg11b10Ufloat => Self::Rg11b10Ufloat,
762            TextureFormat::R64Uint => Self::R64Uint,
763            TextureFormat::Rg32Uint => Self::Rg32Uint,
764            TextureFormat::Rg32Sint => Self::Rg32Sint,
765            TextureFormat::Rg32Float => Self::Rg32Float,
766            TextureFormat::Rgba16Uint => Self::Rgba16Uint,
767            TextureFormat::Rgba16Sint => Self::Rgba16Sint,
768            TextureFormat::Rgba16Unorm => Self::Rgba16Unorm,
769            TextureFormat::Rgba16Snorm => Self::Rgba16Snorm,
770            TextureFormat::Rgba16Float => Self::Rgba16Float,
771            TextureFormat::Rgba32Uint => Self::Rgba32Uint,
772            TextureFormat::Rgba32Sint => Self::Rgba32Sint,
773            TextureFormat::Rgba32Float => Self::Rgba32Float,
774            TextureFormat::Stencil8 => Self::Stencil8,
775            TextureFormat::Depth16Unorm => Self::Depth16Unorm,
776            TextureFormat::Depth24Plus => Self::Depth24Plus,
777            TextureFormat::Depth24PlusStencil8 => Self::Depth24PlusStencil8,
778            TextureFormat::Depth32Float => Self::Depth32Float,
779            TextureFormat::Depth32FloatStencil8 => Self::Depth32FloatStencil8,
780            TextureFormat::NV12 => Self::NV12,
781            TextureFormat::P010 => Self::P010,
782            TextureFormat::Bc1RgbaUnorm => Self::Bc1RgbaUnorm,
783            TextureFormat::Bc1RgbaUnormSrgb => Self::Bc1RgbaUnormSrgb,
784            TextureFormat::Bc2RgbaUnorm => Self::Bc2RgbaUnorm,
785            TextureFormat::Bc2RgbaUnormSrgb => Self::Bc2RgbaUnormSrgb,
786            TextureFormat::Bc3RgbaUnorm => Self::Bc3RgbaUnorm,
787            TextureFormat::Bc3RgbaUnormSrgb => Self::Bc3RgbaUnormSrgb,
788            TextureFormat::Bc4RUnorm => Self::Bc4RUnorm,
789            TextureFormat::Bc4RSnorm => Self::Bc4RSnorm,
790            TextureFormat::Bc5RgUnorm => Self::Bc5RgUnorm,
791            TextureFormat::Bc5RgSnorm => Self::Bc5RgSnorm,
792            TextureFormat::Bc6hRgbUfloat => Self::Bc6hRgbUfloat,
793            TextureFormat::Bc6hRgbFloat => Self::Bc6hRgbFloat,
794            TextureFormat::Bc7RgbaUnorm => Self::Bc7RgbaUnorm,
795            TextureFormat::Bc7RgbaUnormSrgb => Self::Bc7RgbaUnormSrgb,
796            TextureFormat::Etc2Rgb8Unorm => Self::Etc2Rgb8Unorm,
797            TextureFormat::Etc2Rgb8UnormSrgb => Self::Etc2Rgb8UnormSrgb,
798            TextureFormat::Etc2Rgb8A1Unorm => Self::Etc2Rgb8A1Unorm,
799            TextureFormat::Etc2Rgb8A1UnormSrgb => Self::Etc2Rgb8A1UnormSrgb,
800            TextureFormat::Etc2Rgba8Unorm => Self::Etc2Rgba8Unorm,
801            TextureFormat::Etc2Rgba8UnormSrgb => Self::Etc2Rgba8UnormSrgb,
802            TextureFormat::EacR11Unorm => Self::EacR11Unorm,
803            TextureFormat::EacR11Snorm => Self::EacR11Snorm,
804            TextureFormat::EacRg11Unorm => Self::EacRg11Unorm,
805            TextureFormat::EacRg11Snorm => Self::EacRg11Snorm,
806            TextureFormat::Astc { block, channel } => {
807                Self::Astc { block: block.into(), channel: channel.into() }
808            }
809        }
810    }
811}
812
813impl From<wgpu::TextureFormat> for TextureFormat {
814    fn from(format: wgpu::TextureFormat) -> Self {
815        match format {
816            wgpu::TextureFormat::R8Unorm => Self::R8Unorm,
817            wgpu::TextureFormat::R8Snorm => Self::R8Snorm,
818            wgpu::TextureFormat::R8Uint => Self::R8Uint,
819            wgpu::TextureFormat::R8Sint => Self::R8Sint,
820            wgpu::TextureFormat::R16Uint => Self::R16Uint,
821            wgpu::TextureFormat::R16Sint => Self::R16Sint,
822            wgpu::TextureFormat::R16Unorm => Self::R16Unorm,
823            wgpu::TextureFormat::R16Snorm => Self::R16Snorm,
824            wgpu::TextureFormat::R16Float => Self::R16Float,
825            wgpu::TextureFormat::Rg8Unorm => Self::Rg8Unorm,
826            wgpu::TextureFormat::Rg8Snorm => Self::Rg8Snorm,
827            wgpu::TextureFormat::Rg8Uint => Self::Rg8Uint,
828            wgpu::TextureFormat::Rg8Sint => Self::Rg8Sint,
829            wgpu::TextureFormat::R32Uint => Self::R32Uint,
830            wgpu::TextureFormat::R32Sint => Self::R32Sint,
831            wgpu::TextureFormat::R32Float => Self::R32Float,
832            wgpu::TextureFormat::Rg16Uint => Self::Rg16Uint,
833            wgpu::TextureFormat::Rg16Sint => Self::Rg16Sint,
834            wgpu::TextureFormat::Rg16Unorm => Self::Rg16Unorm,
835            wgpu::TextureFormat::Rg16Snorm => Self::Rg16Snorm,
836            wgpu::TextureFormat::Rg16Float => Self::Rg16Float,
837            wgpu::TextureFormat::Rgba8Unorm => Self::Rgba8Unorm,
838            wgpu::TextureFormat::Rgba8UnormSrgb => Self::Rgba8UnormSrgb,
839            wgpu::TextureFormat::Rgba8Snorm => Self::Rgba8Snorm,
840            wgpu::TextureFormat::Rgba8Uint => Self::Rgba8Uint,
841            wgpu::TextureFormat::Rgba8Sint => Self::Rgba8Sint,
842            wgpu::TextureFormat::Bgra8Unorm => Self::Bgra8Unorm,
843            wgpu::TextureFormat::Bgra8UnormSrgb => Self::Bgra8UnormSrgb,
844            wgpu::TextureFormat::Rgb9e5Ufloat => Self::Rgb9e5Ufloat,
845            wgpu::TextureFormat::Rgb10a2Uint => Self::Rgb10a2Uint,
846            wgpu::TextureFormat::Rgb10a2Unorm => Self::Rgb10a2Unorm,
847            wgpu::TextureFormat::Rg11b10Ufloat => Self::Rg11b10Ufloat,
848            wgpu::TextureFormat::R64Uint => Self::R64Uint,
849            wgpu::TextureFormat::Rg32Uint => Self::Rg32Uint,
850            wgpu::TextureFormat::Rg32Sint => Self::Rg32Sint,
851            wgpu::TextureFormat::Rg32Float => Self::Rg32Float,
852            wgpu::TextureFormat::Rgba16Uint => Self::Rgba16Uint,
853            wgpu::TextureFormat::Rgba16Sint => Self::Rgba16Sint,
854            wgpu::TextureFormat::Rgba16Unorm => Self::Rgba16Unorm,
855            wgpu::TextureFormat::Rgba16Snorm => Self::Rgba16Snorm,
856            wgpu::TextureFormat::Rgba16Float => Self::Rgba16Float,
857            wgpu::TextureFormat::Rgba32Uint => Self::Rgba32Uint,
858            wgpu::TextureFormat::Rgba32Sint => Self::Rgba32Sint,
859            wgpu::TextureFormat::Rgba32Float => Self::Rgba32Float,
860            wgpu::TextureFormat::Stencil8 => Self::Stencil8,
861            wgpu::TextureFormat::Depth16Unorm => Self::Depth16Unorm,
862            wgpu::TextureFormat::Depth24Plus => Self::Depth24Plus,
863            wgpu::TextureFormat::Depth24PlusStencil8 => Self::Depth24PlusStencil8,
864            wgpu::TextureFormat::Depth32Float => Self::Depth32Float,
865            wgpu::TextureFormat::Depth32FloatStencil8 => Self::Depth32FloatStencil8,
866            wgpu::TextureFormat::NV12 => Self::NV12,
867            wgpu::TextureFormat::P010 => Self::P010,
868            wgpu::TextureFormat::Bc1RgbaUnorm => Self::Bc1RgbaUnorm,
869            wgpu::TextureFormat::Bc1RgbaUnormSrgb => Self::Bc1RgbaUnormSrgb,
870            wgpu::TextureFormat::Bc2RgbaUnorm => Self::Bc2RgbaUnorm,
871            wgpu::TextureFormat::Bc2RgbaUnormSrgb => Self::Bc2RgbaUnormSrgb,
872            wgpu::TextureFormat::Bc3RgbaUnorm => Self::Bc3RgbaUnorm,
873            wgpu::TextureFormat::Bc3RgbaUnormSrgb => Self::Bc3RgbaUnormSrgb,
874            wgpu::TextureFormat::Bc4RUnorm => Self::Bc4RUnorm,
875            wgpu::TextureFormat::Bc4RSnorm => Self::Bc4RSnorm,
876            wgpu::TextureFormat::Bc5RgUnorm => Self::Bc5RgUnorm,
877            wgpu::TextureFormat::Bc5RgSnorm => Self::Bc5RgSnorm,
878            wgpu::TextureFormat::Bc6hRgbUfloat => Self::Bc6hRgbUfloat,
879            wgpu::TextureFormat::Bc6hRgbFloat => Self::Bc6hRgbFloat,
880            wgpu::TextureFormat::Bc7RgbaUnorm => Self::Bc7RgbaUnorm,
881            wgpu::TextureFormat::Bc7RgbaUnormSrgb => Self::Bc7RgbaUnormSrgb,
882            wgpu::TextureFormat::Etc2Rgb8Unorm => Self::Etc2Rgb8Unorm,
883            wgpu::TextureFormat::Etc2Rgb8UnormSrgb => Self::Etc2Rgb8UnormSrgb,
884            wgpu::TextureFormat::Etc2Rgb8A1Unorm => Self::Etc2Rgb8A1Unorm,
885            wgpu::TextureFormat::Etc2Rgb8A1UnormSrgb => Self::Etc2Rgb8A1UnormSrgb,
886            wgpu::TextureFormat::Etc2Rgba8Unorm => Self::Etc2Rgba8Unorm,
887            wgpu::TextureFormat::Etc2Rgba8UnormSrgb => Self::Etc2Rgba8UnormSrgb,
888            wgpu::TextureFormat::EacR11Unorm => Self::EacR11Unorm,
889            wgpu::TextureFormat::EacR11Snorm => Self::EacR11Snorm,
890            wgpu::TextureFormat::EacRg11Unorm => Self::EacRg11Unorm,
891            wgpu::TextureFormat::EacRg11Snorm => Self::EacRg11Snorm,
892            wgpu::TextureFormat::Astc { block, channel } => {
893                Self::Astc { block: block.into(), channel: channel.into() }
894            }
895        }
896    }
897}
898
899#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
900/// Mirrors `wgpu::VertexFormat` — the layout of one vertex attribute, used
901/// in a [`VertexAttribute`](pipeline_state::VertexAttribute).
902pub enum VertexFormat {
903    Uint8,
904    Uint8x2,
905    Uint8x4,
906    Sint8,
907    Sint8x2,
908    Sint8x4,
909    Unorm8,
910    Unorm8x2,
911    Unorm8x4,
912    Snorm8,
913    Snorm8x2,
914    Snorm8x4,
915    Uint16,
916    Uint16x2,
917    Uint16x4,
918    Sint16,
919    Sint16x2,
920    Sint16x4,
921    Unorm16,
922    Unorm16x2,
923    Unorm16x4,
924    Snorm16,
925    Snorm16x2,
926    Snorm16x4,
927    Float16,
928    Float16x2,
929    Float16x4,
930    Float32,
931    Float32x2,
932    Float32x3,
933    Float32x4,
934    Uint32,
935    Uint32x2,
936    Uint32x3,
937    Uint32x4,
938    Sint32,
939    Sint32x2,
940    Sint32x3,
941    Sint32x4,
942    Float64,
943    Float64x2,
944    Float64x3,
945    Float64x4,
946    Unorm10_10_10_2,
947    Unorm8x4Bgra,
948}
949
950impl From<VertexFormat> for wgpu::VertexFormat {
951    fn from(format: VertexFormat) -> Self {
952        match format {
953            VertexFormat::Uint8 => Self::Uint8,
954            VertexFormat::Uint8x2 => Self::Uint8x2,
955            VertexFormat::Uint8x4 => Self::Uint8x4,
956            VertexFormat::Sint8 => Self::Sint8,
957            VertexFormat::Sint8x2 => Self::Sint8x2,
958            VertexFormat::Sint8x4 => Self::Sint8x4,
959            VertexFormat::Unorm8 => Self::Unorm8,
960            VertexFormat::Unorm8x2 => Self::Unorm8x2,
961            VertexFormat::Unorm8x4 => Self::Unorm8x4,
962            VertexFormat::Snorm8 => Self::Snorm8,
963            VertexFormat::Snorm8x2 => Self::Snorm8x2,
964            VertexFormat::Snorm8x4 => Self::Snorm8x4,
965            VertexFormat::Uint16 => Self::Uint16,
966            VertexFormat::Uint16x2 => Self::Uint16x2,
967            VertexFormat::Uint16x4 => Self::Uint16x4,
968            VertexFormat::Sint16 => Self::Sint16,
969            VertexFormat::Sint16x2 => Self::Sint16x2,
970            VertexFormat::Sint16x4 => Self::Sint16x4,
971            VertexFormat::Unorm16 => Self::Unorm16,
972            VertexFormat::Unorm16x2 => Self::Unorm16x2,
973            VertexFormat::Unorm16x4 => Self::Unorm16x4,
974            VertexFormat::Snorm16 => Self::Snorm16,
975            VertexFormat::Snorm16x2 => Self::Snorm16x2,
976            VertexFormat::Snorm16x4 => Self::Snorm16x4,
977            VertexFormat::Float16 => Self::Float16,
978            VertexFormat::Float16x2 => Self::Float16x2,
979            VertexFormat::Float16x4 => Self::Float16x4,
980            VertexFormat::Float32 => Self::Float32,
981            VertexFormat::Float32x2 => Self::Float32x2,
982            VertexFormat::Float32x3 => Self::Float32x3,
983            VertexFormat::Float32x4 => Self::Float32x4,
984            VertexFormat::Uint32 => Self::Uint32,
985            VertexFormat::Uint32x2 => Self::Uint32x2,
986            VertexFormat::Uint32x3 => Self::Uint32x3,
987            VertexFormat::Uint32x4 => Self::Uint32x4,
988            VertexFormat::Sint32 => Self::Sint32,
989            VertexFormat::Sint32x2 => Self::Sint32x2,
990            VertexFormat::Sint32x3 => Self::Sint32x3,
991            VertexFormat::Sint32x4 => Self::Sint32x4,
992            VertexFormat::Float64 => Self::Float64,
993            VertexFormat::Float64x2 => Self::Float64x2,
994            VertexFormat::Float64x3 => Self::Float64x3,
995            VertexFormat::Float64x4 => Self::Float64x4,
996            VertexFormat::Unorm10_10_10_2 => Self::Unorm10_10_10_2,
997            VertexFormat::Unorm8x4Bgra => Self::Unorm8x4Bgra,
998        }
999    }
1000}
1001
1002#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1003/// Whether a vertex buffer advances per-vertex or per-instance.
1004pub enum VertexStepMode {
1005    Vertex,
1006    Instance,
1007}
1008
1009impl From<VertexStepMode> for wgpu::VertexStepMode {
1010    fn from(mode: VertexStepMode) -> Self {
1011        match mode {
1012            VertexStepMode::Vertex => Self::Vertex,
1013            VertexStepMode::Instance => Self::Instance,
1014        }
1015    }
1016}
1017
1018#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1019/// Which triangle winding to cull — passed to [`Material::with_cull_mode`](crate::graphics::pipeline::material::Material::with_cull_mode).
1020pub enum Face {
1021    Front,
1022    Back,
1023}
1024
1025impl From<Face> for wgpu::Face {
1026    fn from(value: Face) -> Self {
1027        match value {
1028            Face::Front => Self::Front,
1029            Face::Back => Self::Back,
1030        }
1031    }
1032}
1033
1034#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1035/// Fill, wireframe, or point rendering for a [`Material`](crate::graphics::pipeline::material::Material)'s pipeline.
1036pub enum PolygonMode {
1037    Fill,
1038    Line,
1039    Point,
1040}
1041
1042impl From<PolygonMode> for wgpu::PolygonMode {
1043    fn from(value: PolygonMode) -> Self {
1044        match value {
1045            PolygonMode::Fill => Self::Fill,
1046            PolygonMode::Line => Self::Line,
1047            PolygonMode::Point => Self::Point,
1048        }
1049    }
1050}
1051
1052#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1053/// Mirrors `wgpu::BlendFactor`, for [`ColorTargetState`](pipeline_state::ColorTargetState) blending.
1054pub enum BlendFactor {
1055    Zero,
1056    One,
1057    Src,
1058    OneMinusSrc,
1059    SrcAlpha,
1060    OneMinusSrcAlpha,
1061    Dst,
1062    OneMinusDst,
1063    DstAlpha,
1064    OneMinusDstAlpha,
1065    SrcAlphaSaturated,
1066    Constant,
1067    OneMinusConstant,
1068    Src1,
1069    OneMinusSrc1,
1070    Src1Alpha,
1071    OneMinusSrc1Alpha,
1072}
1073
1074impl From<BlendFactor> for wgpu::BlendFactor {
1075    fn from(value: BlendFactor) -> Self {
1076        match value {
1077            BlendFactor::Zero => Self::Zero,
1078            BlendFactor::One => Self::One,
1079            BlendFactor::Src => Self::Src,
1080            BlendFactor::OneMinusSrc => Self::OneMinusSrc,
1081            BlendFactor::SrcAlpha => Self::SrcAlpha,
1082            BlendFactor::OneMinusSrcAlpha => Self::OneMinusSrcAlpha,
1083            BlendFactor::Dst => Self::Dst,
1084            BlendFactor::OneMinusDst => Self::OneMinusDst,
1085            BlendFactor::DstAlpha => Self::DstAlpha,
1086            BlendFactor::OneMinusDstAlpha => Self::OneMinusDstAlpha,
1087            BlendFactor::SrcAlphaSaturated => Self::SrcAlphaSaturated,
1088            BlendFactor::Constant => Self::Constant,
1089            BlendFactor::OneMinusConstant => Self::OneMinusConstant,
1090            BlendFactor::Src1 => Self::Src1,
1091            BlendFactor::OneMinusSrc1 => Self::OneMinusSrc1,
1092            BlendFactor::Src1Alpha => Self::Src1Alpha,
1093            BlendFactor::OneMinusSrc1Alpha => Self::OneMinusSrc1Alpha,
1094        }
1095    }
1096}
1097
1098#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1099/// How source and destination color combine when blending — see [`BlendFactor`].
1100pub enum BlendOperation {
1101    Add,
1102    Subtract,
1103    ReverseSubtract,
1104    Min,
1105    Max,
1106}
1107
1108impl From<BlendOperation> for wgpu::BlendOperation {
1109    fn from(value: BlendOperation) -> Self {
1110        match value {
1111            BlendOperation::Add => Self::Add,
1112            BlendOperation::Subtract => Self::Subtract,
1113            BlendOperation::ReverseSubtract => Self::ReverseSubtract,
1114            BlendOperation::Min => Self::Min,
1115            BlendOperation::Max => Self::Max,
1116        }
1117    }
1118}
1119
1120#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1121/// Mirrors `wgpu::CompareFunction` — depth/stencil/sampler comparison mode.
1122pub enum CompareFunction {
1123    Never,
1124    Less,
1125    Equal,
1126    LessEqual,
1127    Greater,
1128    NotEqual,
1129    GreaterEqual,
1130    Always,
1131}
1132
1133impl From<CompareFunction> for wgpu::CompareFunction {
1134    fn from(value: CompareFunction) -> Self {
1135        match value {
1136            CompareFunction::Never => Self::Never,
1137            CompareFunction::Less => Self::Less,
1138            CompareFunction::Equal => Self::Equal,
1139            CompareFunction::LessEqual => Self::LessEqual,
1140            CompareFunction::Greater => Self::Greater,
1141            CompareFunction::NotEqual => Self::NotEqual,
1142            CompareFunction::GreaterEqual => Self::GreaterEqual,
1143            CompareFunction::Always => Self::Always,
1144        }
1145    }
1146}
1147
1148#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1149/// Mirrors `wgpu::StencilOperation` — what a stencil test does on pass/fail.
1150pub enum StencilOperation {
1151    Keep,
1152    Zero,
1153    Replace,
1154    Invert,
1155    IncrementClamp,
1156    DecrementClamp,
1157    IncrementWrap,
1158    DecrementWrap,
1159}
1160
1161impl From<StencilOperation> for wgpu::StencilOperation {
1162    fn from(value: StencilOperation) -> Self {
1163        match value {
1164            StencilOperation::Keep => Self::Keep,
1165            StencilOperation::Zero => Self::Zero,
1166            StencilOperation::Replace => Self::Replace,
1167            StencilOperation::Invert => Self::Invert,
1168            StencilOperation::IncrementClamp => Self::IncrementClamp,
1169            StencilOperation::DecrementClamp => Self::DecrementClamp,
1170            StencilOperation::IncrementWrap => Self::IncrementWrap,
1171            StencilOperation::DecrementWrap => Self::DecrementWrap,
1172        }
1173    }
1174}
1175
1176#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1177/// How a bound texture is sampled in-shader — see [`BindingKind::texture_2d`](crate::graphics::pipeline::binding::BindingKind::texture_2d)
1178/// and friends, which build this implicitly.
1179pub enum TextureSampleType {
1180    Float { filterable: bool },
1181    Depth,
1182    Sint,
1183    Uint,
1184}
1185
1186impl From<TextureSampleType> for wgpu::TextureSampleType {
1187    fn from(value: TextureSampleType) -> Self {
1188        match value {
1189            TextureSampleType::Float { filterable } => Self::Float { filterable },
1190            TextureSampleType::Depth => Self::Depth,
1191            TextureSampleType::Sint => Self::Sint,
1192            TextureSampleType::Uint => Self::Uint,
1193        }
1194    }
1195}
1196
1197#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1198/// Mirrors `wgpu::TextureViewDimension` — 2D, 2D array, cube, etc.
1199pub enum TextureViewDimension {
1200    D1,
1201    D2,
1202    D2Array,
1203    Cube,
1204    CubeArray,
1205    D3,
1206}
1207
1208impl From<TextureViewDimension> for wgpu::TextureViewDimension {
1209    fn from(value: TextureViewDimension) -> Self {
1210        match value {
1211            TextureViewDimension::D1 => Self::D1,
1212            TextureViewDimension::D2 => Self::D2,
1213            TextureViewDimension::D2Array => Self::D2Array,
1214            TextureViewDimension::Cube => Self::Cube,
1215            TextureViewDimension::CubeArray => Self::CubeArray,
1216            TextureViewDimension::D3 => Self::D3,
1217        }
1218    }
1219}
1220
1221#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1222/// Read/write access for a storage texture binding — see [`BindingKind::storage_texture`](crate::graphics::pipeline::binding::BindingKind::storage_texture).
1223pub enum StorageTextureAccess {
1224    WriteOnly,
1225    ReadOnly,
1226    ReadWrite,
1227    Atomic,
1228}
1229
1230impl From<StorageTextureAccess> for wgpu::StorageTextureAccess {
1231    fn from(value: StorageTextureAccess) -> Self {
1232        match value {
1233            StorageTextureAccess::WriteOnly => Self::WriteOnly,
1234            StorageTextureAccess::ReadOnly => Self::ReadOnly,
1235            StorageTextureAccess::ReadWrite => Self::ReadWrite,
1236            StorageTextureAccess::Atomic => Self::Atomic,
1237        }
1238    }
1239}
1240
1241#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
1242/// Index buffer element width — mirrors `wgpu::IndexFormat`.
1243pub enum IndexFormat {
1244    Uint16,
1245    Uint32,
1246}
1247
1248impl From<IndexFormat> for wgpu::IndexFormat {
1249    fn from(format: IndexFormat) -> Self {
1250        match format {
1251            IndexFormat::Uint16 => Self::Uint16,
1252            IndexFormat::Uint32 => Self::Uint32,
1253        }
1254    }
1255}
1256
1257#[cfg(test)]
1258mod tests {
1259    use super::*;
1260
1261    #[test]
1262    fn cursor_icon_conversion_is_positional_not_coincidental() {
1263        assert_eq!(winit::window::CursorIcon::from(CursorIcon::Default), winit::window::CursorIcon::Default);
1264        assert_eq!(winit::window::CursorIcon::from(CursorIcon::Pointer), winit::window::CursorIcon::Pointer);
1265        assert_eq!(winit::window::CursorIcon::from(CursorIcon::NwseResize), winit::window::CursorIcon::NwseResize);
1266        assert_eq!(winit::window::CursorIcon::from(CursorIcon::AllResize), winit::window::CursorIcon::AllResize);
1267    }
1268
1269    #[test]
1270    fn cursor_grab_mode_conversion_round_trips() {
1271        assert_eq!(winit::window::CursorGrabMode::from(CursorGrabMode::None), winit::window::CursorGrabMode::None);
1272        assert_eq!(winit::window::CursorGrabMode::from(CursorGrabMode::Confined), winit::window::CursorGrabMode::Confined);
1273        assert_eq!(winit::window::CursorGrabMode::from(CursorGrabMode::Locked), winit::window::CursorGrabMode::Locked);
1274    }
1275
1276    #[test]
1277    fn key_code_conversion_is_positional_not_coincidental() {
1278        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::Backquote), winit::keyboard::KeyCode::Backquote);
1279        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::KeyW), winit::keyboard::KeyCode::KeyW);
1280        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::ArrowUp), winit::keyboard::KeyCode::ArrowUp);
1281        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::ShiftLeft), winit::keyboard::KeyCode::ShiftLeft);
1282        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::F35), winit::keyboard::KeyCode::F35);
1283    }
1284
1285    #[test]
1286    fn mouse_button_conversion_preserves_the_other_code() {
1287        assert_eq!(winit::event::MouseButton::from(MouseButton::Left), winit::event::MouseButton::Left);
1288        assert_eq!(winit::event::MouseButton::from(MouseButton::Other(7)), winit::event::MouseButton::Other(7));
1289    }
1290
1291    #[test]
1292    fn touch_phase_conversion_is_positional() {
1293        assert_eq!(TouchPhase::from(winit::event::TouchPhase::Started), TouchPhase::Started);
1294        assert_eq!(TouchPhase::from(winit::event::TouchPhase::Cancelled), TouchPhase::Cancelled);
1295    }
1296
1297    #[test]
1298    fn texture_format_round_trips_including_astc() {
1299        let astc = TextureFormat::Astc { block: AstcBlock::B4x4, channel: AstcChannel::Hdr };
1300        let raw = wgpu::TextureFormat::from(astc);
1301        assert_eq!(TextureFormat::from(raw), astc);
1302        assert_eq!(wgpu::TextureFormat::from(TextureFormat::Bgra8UnormSrgb), wgpu::TextureFormat::Bgra8UnormSrgb);
1303    }
1304
1305    #[test]
1306    fn index_format_conversion_round_trips() {
1307        assert_eq!(wgpu::IndexFormat::from(IndexFormat::Uint16), wgpu::IndexFormat::Uint16);
1308        assert_eq!(wgpu::IndexFormat::from(IndexFormat::Uint32), wgpu::IndexFormat::Uint32);
1309    }
1310}