pub struct Cache {
texture: wgpu::Texture,
pub(super) view: wgpu::TextureView,
}
impl Cache {
pub fn new(device: &wgpu::Device, width: u32, height: u32) -> Cache {
let texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("text::Cache"),
size: wgpu::Extent3d {
width,
height,
depth_or_array_layers: 1,
},
view_formats: &[],
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::R8Unorm,
usage: wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::TEXTURE_BINDING,
mip_level_count: 1,
sample_count: 1,
});
let view = texture.create_view(&wgpu::TextureViewDescriptor::default());
Cache { texture, view }
}
pub fn update(
&mut self,
queue: &wgpu::Queue,
offset: [u16; 2],
size: [u16; 2],
data: &[u8],
) {
let width = size[0] as usize;
let height = size[1] as usize;
queue.write_texture(
wgpu::TexelCopyTextureInfo {
texture: &self.texture,
mip_level: 0,
origin: wgpu::Origin3d {
x: u32::from(offset[0]),
y: u32::from(offset[1]),
z: 0,
},
aspect: wgpu::TextureAspect::All,
},
data,
wgpu::TexelCopyBufferLayout {
offset: 0,
bytes_per_row: Some(width as u32),
rows_per_image: Some(height as u32),
},
wgpu::Extent3d {
width: size[0] as u32,
height: size[1] as u32,
depth_or_array_layers: 1,
},
);
}
}