@@ -19,7 +19,7 @@ extern crate image;
19
19
extern crate winit;
20
20
21
21
use hal:: { buffer, command, format as f, image as i, memory as m, pass, pso, pool, window:: Extent2D } ;
22
- use hal:: { Device , Instance , PhysicalDevice , Surface , Swapchain } ;
22
+ use hal:: { Device , PhysicalDevice , Surface , Swapchain } ;
23
23
use hal:: {
24
24
DescriptorPool , FrameSync , Primitive ,
25
25
Backbuffer , SwapchainConfig ,
@@ -33,6 +33,11 @@ use std::fs;
33
33
use std:: io:: Cursor ;
34
34
use std:: io:: Read ;
35
35
36
+ use std:: sync:: { Arc , Mutex } ;
37
+
38
+ #[ cfg( feature = "gl" ) ]
39
+ use back:: GlInstance ;
40
+
36
41
const ENTRY_NAME : & str = "main" ;
37
42
38
43
#[ derive( Debug , Clone , Copy ) ]
@@ -52,6 +57,8 @@ const QUAD: [Vertex; 6] = [
52
57
Vertex { a_Pos : [ -0.5 , -0.33 ] , a_Uv : [ 0.0 , 0.0 ] } ,
53
58
] ;
54
59
60
+ const DIMS : Extent2D = Extent2D { width : 1024 , height : 768 } ;
61
+
55
62
const COLOR_RANGE : i:: SubresourceRange = i:: SubresourceRange {
56
63
aspects : f:: Aspects :: COLOR ,
57
64
levels : 0 ..1 ,
@@ -62,33 +69,24 @@ const COLOR_RANGE: i::SubresourceRange = i::SubresourceRange {
62
69
fn main ( ) {
63
70
env_logger:: init ( ) ;
64
71
65
- let mut events_loop = winit:: EventsLoop :: new ( ) ;
72
+ let events_loop = Arc :: new ( Mutex :: new ( winit:: EventsLoop :: new ( ) ) ) ;
66
73
74
+ // My understanding of the winit docs is that it will issue a window resize
75
+ // event if the window's display's dpi ends up not equaling 1.
67
76
let wb = winit:: WindowBuilder :: new ( )
68
- . with_dimensions ( 1024 , 768 )
77
+ . with_dimensions ( winit:: dpi:: LogicalSize :: from_physical ( winit:: dpi:: PhysicalSize {
78
+ width : DIMS . width as _ ,
79
+ height : DIMS . height as _ ,
80
+ } , 1.0 ) )
69
81
. with_title ( "quad" . to_string ( ) ) ;
70
82
// instantiate backend
71
- #[ cfg( not( feature = "gl" ) ) ]
72
83
let ( window, _instance, mut adapters, mut surface) = {
73
- let window = wb . build ( & events_loop) . unwrap ( ) ;
74
- let instance = back :: Instance :: create ( "gfx-rs quad" , 1 ) ;
84
+ let instance = back :: Instance :: create ( "gfx-rs quad" , 1 , Arc :: clone ( & events_loop) ) ;
85
+ let window = instance . create_window ( wb ) ;
75
86
let surface = instance. create_surface ( & window) ;
76
87
let adapters = instance. enumerate_adapters ( ) ;
77
88
( window, instance, adapters, surface)
78
89
} ;
79
- #[ cfg( feature = "gl" ) ]
80
- let ( mut adapters, mut surface) = {
81
- let window = {
82
- let builder =
83
- back:: config_context ( back:: glutin:: ContextBuilder :: new ( ) , ColorFormat :: SELF , None )
84
- . with_vsync ( true ) ;
85
- back:: glutin:: GlWindow :: new ( wb, builder, & events_loop) . unwrap ( )
86
- } ;
87
-
88
- let surface = back:: Surface :: from_window ( window) ;
89
- let adapters = surface. enumerate_adapters ( ) ;
90
- ( adapters, surface)
91
- } ;
92
90
93
91
for adapter in & adapters {
94
92
println ! ( "{:?}" , adapter. info) ;
@@ -100,7 +98,7 @@ fn main() {
100
98
101
99
// Build a new device and associated command queues
102
100
let ( mut device, mut queue_group) = adapter
103
- . open_with :: < _ , hal:: Graphics > ( 1 , |family| surface. supports_queue_family ( family) )
101
+ . open_with :: < _ , hal:: Graphics > ( 1 , |family| { println ! ( "{:?}" , family ) ; surface. supports_queue_family ( family) } )
104
102
. unwrap ( ) ;
105
103
106
104
let mut command_pool =
@@ -335,43 +333,21 @@ fn main() {
335
333
device. wait_for_fence ( & frame_fence, !0 ) ;
336
334
}
337
335
338
- let mut swap_chain;
339
- let mut render_pass;
340
- let mut framebuffers;
341
- let mut frame_images;
342
- let mut pipeline;
343
- let mut pipeline_layout;
344
- let mut extent;
345
-
346
- {
347
- #[ cfg( not( feature = "gl" ) ) ]
348
- let window = & window;
349
- #[ cfg( feature = "gl" ) ]
350
- let window = & 0 ;
351
- let (
352
- new_swap_chain,
353
- new_render_pass,
354
- new_framebuffers,
355
- new_frame_images,
356
- new_pipeline,
357
- new_pipeline_layout,
358
- new_extent,
359
- ) = swapchain_stuff (
360
- & mut surface,
361
- & mut device,
362
- & adapter. physical_device ,
363
- & set_layout,
364
- window,
365
- ) ;
366
-
367
- swap_chain = new_swap_chain;
368
- render_pass = new_render_pass;
369
- framebuffers = new_framebuffers;
370
- frame_images = new_frame_images;
371
- pipeline = new_pipeline;
372
- pipeline_layout = new_pipeline_layout;
373
- extent = new_extent;
374
- }
336
+ let (
337
+ mut swap_chain,
338
+ mut render_pass,
339
+ mut framebuffers,
340
+ mut frame_images,
341
+ mut pipeline,
342
+ mut pipeline_layout,
343
+ mut extent,
344
+ ) = swapchain_stuff (
345
+ & mut surface,
346
+ & mut device,
347
+ & adapter. physical_device ,
348
+ & set_layout,
349
+ & window,
350
+ ) ;
375
351
376
352
// Rendering setup
377
353
let mut viewport = pso:: Viewport {
@@ -387,9 +363,8 @@ fn main() {
387
363
//
388
364
let mut running = true ;
389
365
let mut recreate_swapchain = false ;
390
- let mut first = true ;
391
366
while running {
392
- events_loop. poll_events ( |event| {
367
+ events_loop. lock ( ) . unwrap ( ) . poll_events ( |event| {
393
368
if let winit:: Event :: WindowEvent { event, .. } = event {
394
369
match event {
395
370
winit:: WindowEvent :: KeyboardInput {
@@ -401,16 +376,13 @@ fn main() {
401
376
..
402
377
}
403
378
| winit:: WindowEvent :: CloseRequested => running = false ,
404
- winit:: WindowEvent :: Resized ( _width, _height) => {
405
- if !first {
406
- recreate_swapchain = true ;
407
- }
379
+ winit:: WindowEvent :: Resized ( _dims) => {
380
+ recreate_swapchain = true ;
408
381
}
409
382
_ => ( ) ,
410
383
}
411
384
}
412
385
} ) ;
413
- first = false ;
414
386
415
387
if recreate_swapchain {
416
388
device. wait_idle ( ) . unwrap ( ) ;
@@ -429,10 +401,6 @@ fn main() {
429
401
device. destroy_render_pass ( render_pass) ;
430
402
device. destroy_swapchain ( swap_chain) ;
431
403
432
- #[ cfg( not( feature = "gl" ) ) ]
433
- let window = & window;
434
- #[ cfg( feature = "gl" ) ]
435
- let window = & 0 ;
436
404
let (
437
405
new_swap_chain,
438
406
new_render_pass,
@@ -446,7 +414,7 @@ fn main() {
446
414
& mut device,
447
415
& adapter. physical_device ,
448
416
& set_layout,
449
- window,
417
+ & window,
450
418
) ;
451
419
swap_chain = new_swap_chain;
452
420
render_pass = new_render_pass;
@@ -545,18 +513,13 @@ fn main() {
545
513
println ! ( "You need to enable the native API feature (vulkan/metal) in order to test the LL" ) ;
546
514
}
547
515
548
- #[ cfg( any( feature = "vulkan" , feature = "dx12" , feature = "metal" ) ) ]
549
- type WindowType = winit:: Window ;
550
- #[ cfg( feature = "gl" ) ]
551
- type WindowType = u32 ;
552
-
553
516
#[ cfg( any( feature = "vulkan" , feature = "dx12" , feature = "metal" , feature = "gl" ) ) ]
554
517
fn swapchain_stuff (
555
518
surface : & mut <back:: Backend as hal:: Backend >:: Surface ,
556
- device : & mut back:: Device ,
519
+ device : & mut < back:: Backend as hal :: Backend > :: Device ,
557
520
physical_device : & back:: PhysicalDevice ,
558
521
set_layout : & <back:: Backend as hal:: Backend >:: DescriptorSetLayout ,
559
- window : & WindowType ,
522
+ window : & Arc < Mutex < back :: Window > > ,
560
523
) -> (
561
524
<back:: Backend as hal:: Backend >:: Swapchain ,
562
525
<back:: Backend as hal:: Backend >:: RenderPass ,
@@ -581,13 +544,18 @@ fn swapchain_stuff(
581
544
let extent = match caps. current_extent {
582
545
Some ( e) => e,
583
546
None => {
584
- #[ cfg( feature = "gl" ) ]
585
- let _window = window;
586
- #[ cfg( feature = "gl" ) ]
587
- let window = surface. get_window ( ) ;
588
-
589
- let window_size = window. get_inner_size ( ) . unwrap ( ) ;
590
- let mut extent = hal:: window:: Extent2D { width : window_size. 0 , height : window_size. 1 } ;
547
+ let px = window
548
+ . lock ( )
549
+ . unwrap ( )
550
+ . get_inner_size ( )
551
+ . unwrap_or ( winit:: dpi:: PhysicalSize {
552
+ width : DIMS . width as _ ,
553
+ height : DIMS . height as _ ,
554
+ } ) ;
555
+ let mut extent = hal:: window:: Extent2D {
556
+ width : px. width as _ ,
557
+ height : px. height as _ ,
558
+ } ;
591
559
592
560
extent. width = extent. width . max ( caps. extents . start . width ) . min ( caps. extents . end . width ) ;
593
561
extent. height = extent. height . max ( caps. extents . start . height ) . min ( caps. extents . end . height ) ;
@@ -664,7 +632,6 @@ fn swapchain_stuff(
664
632
. collect ( ) ;
665
633
( pairs, fbos)
666
634
}
667
- Backbuffer :: Framebuffer ( fbo) => ( Vec :: new ( ) , vec ! [ fbo] ) ,
668
635
} ;
669
636
670
637
let pipeline_layout =
0 commit comments