| 574 | self.set_scale_factor(scale_factor); |
| 575 | // In-pass path (MSAA=1, Android) never runs `encode`, so the offscreen |
| 576 | // MSAA/resolve textures would only waste memory; `encode` self-guards |
| 577 | // by early-returning when `msaa_targets` is `None`. |
| 578 | if MSAA_SAMPLE_COUNT > 1 { |
| 579 | self.ensure_msaa_targets(device, viewport_size.width, viewport_size.height); |
| 580 | } |
| 581 | |
| 582 | // Sync picking viewport |
| 583 | self.picking |
| 584 | .set_view(bounds_width, bounds_height, scale_factor); |
| 585 | |
| 586 | // Ensure pipelines/grid and synchronize GPU buffers |
| 587 | self.ensure_pipelines_and_update_grid(device, queue, state); |
| 588 | |
| 589 | // Upload camera uniform based on current camera and bounds dimensions |
| 590 | let mut cam_u = CameraUniform::default(); |
| 591 | cam_u.update(&state.camera, bounds_width, bounds_height); |
| 592 | queue.write_buffer(&self.camera_buffer, 0, bytemuck::bytes_of(&cam_u)); |
| 593 | self.sync(device, queue, state); |
| 594 | } |
| 595 | |
| 596 | pub(crate) fn service_picking( |
| 597 | &mut self, |
| 598 | instance_id: u64, |
| 599 | device: &Device, |
| 600 | queue: &Queue, |
| 601 | state: &PlotState, |
| 602 | ) { |
| 603 | let marker_buffer = self.buffers.markers.as_ref().map(|vb| &vb.buffer); |
| 604 | let marker_instances = self |
| 605 | .buffers |