ruffle/render/wgpu/src/globals.rs

62 lines
1.8 KiB
Rust
Raw Normal View History

//use super::utils::create_debug_label;
use bytemuck::{Pod, Zeroable};
use wgpu::util::DeviceExt;
#[derive(Debug)]
pub struct Globals {
bind_group: wgpu::BindGroup,
_buffer: wgpu::Buffer,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Pod, Zeroable)]
struct GlobalsUniform {
view_matrix: [[f32; 4]; 4],
}
impl Globals {
pub fn new(
device: &wgpu::Device,
layout: &wgpu::BindGroupLayout,
viewport_width: u32,
viewport_height: u32,
) -> Self {
let temp_label = create_debug_label!("Globals buffer");
let buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: temp_label.as_deref(),
contents: bytemuck::cast_slice(&[GlobalsUniform {
view_matrix: [
[1.0 / (viewport_width as f32 / 2.0), 0.0, 0.0, 0.0],
[0.0, -1.0 / (viewport_height as f32 / 2.0), 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[-1.0, 1.0, 0.0, 1.0],
],
}]),
usage: wgpu::BufferUsages::UNIFORM,
});
let bind_group_label = create_debug_label!("Globals bind group");
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
label: bind_group_label.as_deref(),
layout: &layout,
entries: &[wgpu::BindGroupEntry {
binding: 0,
2021-04-29 20:42:12 +00:00
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
buffer: &buffer,
offset: 0,
size: wgpu::BufferSize::new(std::mem::size_of::<GlobalsUniform>() as u64),
2021-04-29 20:42:12 +00:00
}),
}],
});
Self {
bind_group,
_buffer: buffer,
}
}
pub fn bind_group(&self) -> &wgpu::BindGroup {
&self.bind_group
}
}