@@ -9,6 +9,7 @@ pub fn all_tests(vec: &mut Vec<GpuTestInitializer>) {
99 vec. push ( DRAW_MULTIVIEW_SINGLE ) ;
1010 vec. push ( DRAW_MULTIVIEW ) ;
1111 vec. push ( DRAW_MULTIVIEW_NONCONTIGUOUS ) ;
12+ vec. push ( DRAW_MULTIVIEW_MULTISAMPLE ) ;
1213}
1314
1415#[ gpu_test]
@@ -21,7 +22,7 @@ static DRAW_MULTIVIEW_SINGLE: GpuTestConfiguration = GpuTestConfiguration::new()
2122 ..Limits :: defaults ( )
2223 } ) ,
2324 )
24- . run_async ( |ctx| run_test ( ctx, 0b1 ) ) ;
25+ . run_async ( |ctx| run_test ( ctx, 0b1 , 1 ) ) ;
2526
2627#[ gpu_test]
2728static DRAW_MULTIVIEW : GpuTestConfiguration = GpuTestConfiguration :: new ( )
@@ -33,7 +34,7 @@ static DRAW_MULTIVIEW: GpuTestConfiguration = GpuTestConfiguration::new()
3334 ..Limits :: defaults ( )
3435 } ) ,
3536 )
36- . run_async ( |ctx| run_test ( ctx, 0b11 ) ) ;
37+ . run_async ( |ctx| run_test ( ctx, 0b11 , 1 ) ) ;
3738
3839#[ gpu_test]
3940static DRAW_MULTIVIEW_NONCONTIGUOUS : GpuTestConfiguration = GpuTestConfiguration :: new ( )
@@ -45,9 +46,21 @@ static DRAW_MULTIVIEW_NONCONTIGUOUS: GpuTestConfiguration = GpuTestConfiguration
4546 ..Limits :: defaults ( )
4647 } ) ,
4748 )
48- . run_async ( |ctx| run_test ( ctx, 0b1001 ) ) ;
49+ . run_async ( |ctx| run_test ( ctx, 0b1001 , 1 ) ) ;
4950
50- async fn run_test ( ctx : TestingContext , layer_mask : u32 ) {
51+ #[ gpu_test]
52+ static DRAW_MULTIVIEW_MULTISAMPLE : GpuTestConfiguration = GpuTestConfiguration :: new ( )
53+ . parameters (
54+ TestParameters :: default ( )
55+ . features ( Features :: MULTIVIEW | Features :: MULTISAMPLE_ARRAY )
56+ . limits ( Limits {
57+ max_multiview_view_count : 2 ,
58+ ..Limits :: defaults ( )
59+ } ) ,
60+ )
61+ . run_async ( |ctx| run_test ( ctx, 0b11 , 4 ) ) ;
62+
63+ async fn run_test ( ctx : TestingContext , layer_mask : u32 , sample_count : u32 ) {
5164 let num_layers = 32 - layer_mask. leading_zeros ( ) ;
5265
5366 let shader_src = include_str ! ( "shader.wgsl" ) ;
@@ -79,29 +92,34 @@ async fn run_test(ctx: TestingContext, layer_mask: u32) {
7992 } ) ] ,
8093 } ) ,
8194 multiview_mask : NonZero :: new ( layer_mask) ,
82- multisample : Default :: default ( ) ,
95+ multisample : wgpu:: MultisampleState {
96+ count : sample_count,
97+ ..Default :: default ( )
98+ } ,
8399 layout : None ,
84100 depth_stencil : None ,
85101 cache : None ,
86102 } ;
87103
88104 const TEXTURE_SIZE : u32 = 256 ;
89105 let pipeline = ctx. device . create_render_pipeline ( & pipeline_desc) ;
90- let texture = ctx. device . create_texture ( & wgpu:: TextureDescriptor {
106+
107+ let texture_desc = wgpu:: TextureDescriptor {
91108 label : None ,
92109 size : wgpu:: Extent3d {
93110 width : TEXTURE_SIZE ,
94111 height : TEXTURE_SIZE ,
95112 depth_or_array_layers : 32 - layer_mask. leading_zeros ( ) ,
96113 } ,
97114 mip_level_count : 1 ,
98- sample_count : 1 ,
115+ sample_count,
99116 dimension : wgpu:: TextureDimension :: D2 ,
100117 format : wgpu:: TextureFormat :: R8Unorm ,
101118 usage : wgpu:: TextureUsages :: RENDER_ATTACHMENT | wgpu:: TextureUsages :: COPY_SRC ,
102119 view_formats : & [ ] ,
103- } ) ;
104- let entire_texture_view = texture. create_view ( & wgpu:: TextureViewDescriptor {
120+ } ;
121+ let texture = ctx. device . create_texture ( & texture_desc) ;
122+ let texture_view_desc = wgpu:: TextureViewDescriptor {
105123 label : None ,
106124 format : Some ( wgpu:: TextureFormat :: R8Unorm ) ,
107125 dimension : Some ( wgpu:: TextureViewDimension :: D2Array ) ,
@@ -111,7 +129,21 @@ async fn run_test(ctx: TestingContext, layer_mask: u32) {
111129 mip_level_count : None ,
112130 base_array_layer : 0 ,
113131 array_layer_count : Some ( num_layers) ,
114- } ) ;
132+ } ;
133+ let entire_texture_view = texture. create_view ( & texture_view_desc) ;
134+
135+ let ( resolve_texture, resolve_texture_view) = if sample_count != 1 {
136+ let mut texture_desc = texture_desc. clone ( ) ;
137+ texture_desc. sample_count = 1 ;
138+
139+ let resolve_texture = ctx. device . create_texture ( & texture_desc) ;
140+ let resolve_texture_view = resolve_texture. create_view ( & texture_view_desc) ;
141+
142+ ( Some ( resolve_texture) , Some ( resolve_texture_view) )
143+ } else {
144+ ( None , None )
145+ } ;
146+
115147 let readback_buffer = ctx. device . create_buffer ( & wgpu:: BufferDescriptor {
116148 label : None ,
117149 size : TEXTURE_SIZE as u64 * TEXTURE_SIZE as u64 * num_layers as u64 ,
@@ -130,7 +162,7 @@ async fn run_test(ctx: TestingContext, layer_mask: u32) {
130162 color_attachments : & [ Some ( wgpu:: RenderPassColorAttachment {
131163 view : & entire_texture_view,
132164 depth_slice : None ,
133- resolve_target : None ,
165+ resolve_target : resolve_texture_view . as_ref ( ) ,
134166 ops : wgpu:: Operations {
135167 load : wgpu:: LoadOp :: Clear ( wgpu:: Color :: TRANSPARENT ) ,
136168 store : wgpu:: StoreOp :: Store ,
@@ -146,7 +178,7 @@ async fn run_test(ctx: TestingContext, layer_mask: u32) {
146178 }
147179 encoder. copy_texture_to_buffer (
148180 wgpu:: TexelCopyTextureInfo {
149- texture : & texture,
181+ texture : resolve_texture . as_ref ( ) . unwrap_or ( & texture) ,
150182 mip_level : 0 ,
151183 origin : wgpu:: Origin3d { x : 0 , y : 0 , z : 0 } ,
152184 aspect : wgpu:: TextureAspect :: All ,
0 commit comments