11use std:: sync:: Arc ;
22
3+ use bytemuck:: { Pod , Zeroable } ;
34use thiserror:: Error ;
45use winit:: window:: Window ;
56
@@ -103,6 +104,7 @@ pub(crate) struct GraphicsState {
103104 config : wgpu:: SurfaceConfiguration ,
104105 render_pipeline : wgpu:: RenderPipeline ,
105106 sampler : wgpu:: Sampler ,
107+ viewport_scale : [ f32 ; 2 ] ,
106108 viewport_offset : [ f32 ; 2 ] ,
107109 viewport_texture : Option < wgpu:: Texture > ,
108110 ui_texture : Option < wgpu:: Texture > ,
@@ -182,7 +184,7 @@ impl GraphicsState {
182184 bind_group_layouts : & [ & texture_bind_group_layout] ,
183185 push_constant_ranges : & [ wgpu:: PushConstantRange {
184186 stages : wgpu:: ShaderStages :: FRAGMENT ,
185- range : 0 ..std :: mem :: size_of :: < [ f32 ; 2 ] > ( ) as u32 , // 2 floats for viewport offset
187+ range : 0 ..size_of :: < Constants > ( ) as u32 ,
186188 } ] ,
187189 } ) ;
188190
@@ -230,6 +232,7 @@ impl GraphicsState {
230232 config,
231233 render_pipeline,
232234 sampler,
235+ viewport_scale : [ 1.0 , 1.0 ] ,
233236 viewport_offset : [ 0.0 , 0.0 ] ,
234237 viewport_texture : None ,
235238 ui_texture : None ,
@@ -261,6 +264,10 @@ impl GraphicsState {
261264 self . bind_group = Some ( bind_group) ;
262265 }
263266
267+ pub ( crate ) fn set_viewport_scale ( & mut self , scale : [ f32 ; 2 ] ) {
268+ self . viewport_scale = scale;
269+ }
270+
264271 pub ( crate ) fn set_viewport_offset ( & mut self , offset : [ f32 ; 2 ] ) {
265272 self . viewport_offset = offset;
266273 }
@@ -312,7 +319,14 @@ impl GraphicsState {
312319 } ) ;
313320
314321 render_pass. set_pipeline ( & self . render_pipeline ) ;
315- render_pass. set_push_constants ( wgpu:: ShaderStages :: FRAGMENT , 0 , bytemuck:: cast_slice ( & self . viewport_offset ) ) ;
322+ render_pass. set_push_constants (
323+ wgpu:: ShaderStages :: FRAGMENT ,
324+ 0 ,
325+ bytemuck:: bytes_of ( & Constants {
326+ viewport_scale : self . viewport_scale ,
327+ viewport_offset : self . viewport_offset ,
328+ } ) ,
329+ ) ;
316330 if let Some ( bind_group) = & self . bind_group {
317331 render_pass. set_bind_group ( 0 , bind_group, & [ ] ) ;
318332 render_pass. draw ( 0 ..6 , 0 ..1 ) ; // Draw 3 vertices for fullscreen triangle
@@ -326,3 +340,10 @@ impl GraphicsState {
326340 Ok ( ( ) )
327341 }
328342}
343+
344+ #[ repr( C ) ]
345+ #[ derive( Copy , Clone , Pod , Zeroable ) ]
346+ struct Constants {
347+ viewport_scale : [ f32 ; 2 ] ,
348+ viewport_offset : [ f32 ; 2 ] ,
349+ }
0 commit comments