diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-12 23:35:00 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-12 23:35:00 +0100 |
commit | 9f5d815e932c9c01265fec2f5a079470d73d6cc8 (patch) | |
tree | 4d86b50699ea4a36cba451bdffe13a30b457d889 /shared | |
parent | 32b749262d305b5ce09d1fc0c02f40023033c9bd (diff) | |
download | weareserver-9f5d815e932c9c01265fec2f5a079470d73d6cc8.tar weareserver-9f5d815e932c9c01265fec2f5a079470d73d6cc8.tar.bz2 weareserver-9f5d815e932c9c01265fec2f5a079470d73d6cc8.tar.zst |
zero copy texture write
Diffstat (limited to 'shared')
-rw-r--r-- | shared/src/helper.rs | 22 | ||||
-rw-r--r-- | shared/src/resources.rs | 31 |
2 files changed, 37 insertions, 16 deletions
diff --git a/shared/src/helper.rs b/shared/src/helper.rs index d267f68..eb1f321 100644 --- a/shared/src/helper.rs +++ b/shared/src/helper.rs @@ -18,6 +18,7 @@ use crate::packets::{Data, Object, Resource}; use anyhow::Result; use glam::{Affine3A, Vec2, Vec3A}; use std::{ + borrow::Cow, io::{Read, Write}, marker::PhantomData, }; @@ -26,10 +27,10 @@ pub trait ReadWrite: Sized { fn write(&self, w: &mut dyn Write) -> Result<()>; fn read(r: &mut dyn Read) -> Result<Self>; - fn write_alloc(&self) -> Vec<u8> { + fn write_alloc<'a>(&'a self) -> Cow<'a, [u8]> { let mut buf = Vec::new(); self.write(&mut buf).unwrap(); - buf + Cow::Owned(buf) } } @@ -66,6 +67,23 @@ impl ReadWrite for Vec<u8> { Ok(buf) } } +impl<'a> ReadWrite for Cow<'a, [u8]> { + fn write(&self, w: &mut dyn Write) -> Result<()> { + w.write_all(&self)?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + let mut buf = Vec::new(); + r.read_to_end(&mut buf)?; + Ok(Cow::Owned(buf)) + } + fn write_alloc<'b>(&'b self) -> Cow<'b, [u8]> { + match self { + Cow::Borrowed(x) => Cow::Borrowed(x), + Cow::Owned(x) => Cow::Borrowed(&x), + } + } +} impl ReadWrite for Vec<Vec3A> { fn write(&self, w: &mut dyn Write) -> Result<()> { for e in self { diff --git a/shared/src/resources.rs b/shared/src/resources.rs index ba45284..40a9cad 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -19,6 +19,7 @@ use anyhow::Result; use glam::{Affine3A, Vec2, Vec3A}; use log::warn; use std::{ + borrow::Cow, collections::BTreeMap, io::{Read, Write}, }; @@ -40,7 +41,7 @@ pub struct LightPart { #[derive(Debug, Default, Clone)] pub struct EnvironmentPart { - pub skybox: Option<Resource<Image>>, + pub skybox: Option<Resource<Image<'static>>>, pub sun: Option<(Vec3A, Vec3A)>, } @@ -69,15 +70,15 @@ pub struct MeshPart { pub va_transmission: Option<Resource<Vec<f32>>>, pub va_alpha: Option<Resource<Vec<f32>>>, pub va_emission: Option<Resource<Vec<Vec3A>>>, - pub tex_normal: Option<Resource<Image>>, - pub tex_roughness: Option<Resource<Image>>, - pub tex_metallic: Option<Resource<Image>>, - pub tex_albedo: Option<Resource<Image>>, - pub tex_transmission: Option<Resource<Image>>, - pub tex_alpha: Option<Resource<Image>>, - pub tex_emission: Option<Resource<Image>>, - pub tex_thickness: Option<Resource<Image>>, - pub tex_occlusion: Option<Resource<Image>>, + pub tex_normal: Option<Resource<Image<'static>>>, + pub tex_roughness: Option<Resource<Image<'static>>>, + pub tex_metallic: Option<Resource<Image<'static>>>, + pub tex_albedo: Option<Resource<Image<'static>>>, + pub tex_transmission: Option<Resource<Image<'static>>>, + pub tex_alpha: Option<Resource<Image<'static>>>, + pub tex_emission: Option<Resource<Image<'static>>>, + pub tex_thickness: Option<Resource<Image<'static>>>, + pub tex_occlusion: Option<Resource<Image<'static>>>, } #[derive(Debug, Default, Clone)] @@ -97,7 +98,7 @@ pub struct CollisionPart { pub struct PrefabIndex(pub BTreeMap<String, Resource<Prefab>>); #[derive(Debug, Clone)] -pub struct Image(pub Vec<u8>); +pub struct Image<'a>(pub Cow<'a, [u8]>); impl ReadWrite for PrefabIndex { fn write(&self, w: &mut dyn Write) -> Result<()> { @@ -331,12 +332,14 @@ fn write_kv(w: &mut dyn Write, key: &[u8], value: &[u8]) -> Result<()> { Ok(()) } -impl ReadWrite for Image { +impl<'a> ReadWrite for Image<'a> { fn write(&self, w: &mut dyn Write) -> Result<()> { self.0.write(w) } - fn read(r: &mut dyn Read) -> Result<Self> { - Ok(Self(<Vec<u8> as ReadWrite>::read(r)?)) + Ok(Self(<Vec<u8> as ReadWrite>::read(r)?.into())) + } + fn write_alloc<'b>(&'b self) -> Cow<'b, [u8]> { + self.0.write_alloc() } } |