better draw without copy

This commit is contained in:
2026-03-15 11:19:34 -06:00
parent 84185c62b0
commit aa4711c5a7

View File

@@ -1,8 +1,8 @@
use alloc::{string::ToString, vec::Vec}; use alloc::{string::ToString, vec::Vec};
use core::{ffi::c_char, ptr, sync::atomic::Ordering}; use core::{ffi::c_char, ptr, slice, sync::atomic::Ordering};
use embassy_rp::clocks::{RoscRng, clk_sys_freq}; use embassy_rp::clocks::{RoscRng, clk_sys_freq};
use embassy_time::Instant; use embassy_time::Instant;
use embedded_graphics::draw_target::DrawTarget; use embedded_graphics::{Pixel, draw_target::DrawTarget, pixelcolor::Rgb565};
use embedded_sdmmc::LfnBuffer; use embedded_sdmmc::LfnBuffer;
use heapless::spsc::Queue; use heapless::spsc::Queue;
use userlib_sys::{ use userlib_sys::{
@@ -89,13 +89,16 @@ pub extern "C" fn get_ms() -> u64 {
const _: DrawIter = draw_iter; const _: DrawIter = draw_iter;
pub extern "C" fn draw_iter(cpixels: *const CPixel, len: usize) { pub extern "C" fn draw_iter(cpixels: *const CPixel, len: usize) {
// SAFETY: caller guarantees `ptr` is valid for `len` bytes let pixels: &[Pixel<Rgb565>] = unsafe { slice::from_raw_parts(cpixels.cast(), len) };
let cpixels = unsafe { core::slice::from_raw_parts(cpixels, len) };
let iter = cpixels.iter().copied().map(|c: CPixel| c.into());
FB_PAUSED.store(true, Ordering::Release); FB_PAUSED.store(true, Ordering::Release);
unsafe { FRAMEBUFFER.as_mut().unwrap().draw_iter(iter).unwrap() } unsafe {
FRAMEBUFFER
.as_mut()
.unwrap()
.draw_iter(pixels.iter().copied())
.unwrap()
}
FB_PAUSED.store(false, Ordering::Release); FB_PAUSED.store(false, Ordering::Release);
} }