use crate::{
core::math::Rect, define_shared_wrapper, error::FrameworkError,
framebuffer::GpuFrameBufferTrait,
};
use bytemuck::Pod;
use fyrox_core::define_as_any_trait;
define_as_any_trait!(GpuAsyncReadBufferAsAny => GpuAsyncReadBufferTrait);
pub trait GpuAsyncReadBufferTrait: GpuAsyncReadBufferAsAny {
fn schedule_pixels_transfer(
&self,
framebuffer: &dyn GpuFrameBufferTrait,
color_buffer_index: u32,
rect: Option<Rect<i32>>,
) -> Result<(), FrameworkError>;
fn is_request_running(&self) -> bool;
fn try_read(&self) -> Option<Vec<u8>>;
}
impl dyn GpuAsyncReadBufferTrait {
pub fn try_read_of_type<T>(&self) -> Option<Vec<T>>
where
T: Pod,
{
let mut bytes = self.try_read()?;
let typed = unsafe {
Some(Vec::from_raw_parts(
bytes.as_mut_ptr() as *mut T,
bytes.len() / size_of::<T>(),
bytes.capacity() / size_of::<T>(),
))
};
std::mem::forget(bytes);
typed
}
}
define_shared_wrapper!(GpuAsyncReadBuffer<dyn GpuAsyncReadBufferTrait>);