ruffle/render/wgpu/src/utils.rs

95 lines
2.4 KiB
Rust
Raw Normal View History

use std::borrow::Cow;
2020-08-27 10:32:41 +00:00
use std::mem::size_of;
2021-04-16 20:55:31 +00:00
use std::num::NonZeroU32;
2020-08-27 10:32:41 +00:00
use wgpu::util::DeviceExt;
macro_rules! create_debug_label {
($($arg:tt)*) => (
if cfg!(feature = "render_debug_labels") {
Some(format!($($arg)*))
} else {
None
}
)
}
pub fn format_list<'a>(values: &[&'a str], connector: &'a str) -> Cow<'a, str> {
match values.len() {
0 => Cow::Borrowed(""),
1 => Cow::Borrowed(values[0]),
_ => Cow::Owned(
values[0..values.len() - 1].join(", ")
+ " "
+ connector
+ " "
+ values[values.len() - 1],
),
}
}
pub fn get_backend_names(backends: wgpu::BackendBit) -> Vec<&'static str> {
let mut names = Vec::new();
if backends.contains(wgpu::BackendBit::VULKAN) {
names.push("Vulkan");
}
if backends.contains(wgpu::BackendBit::DX12) {
names.push("DirectX 12");
}
if backends.contains(wgpu::BackendBit::DX11) {
names.push("DirectX 11");
}
if backends.contains(wgpu::BackendBit::METAL) {
names.push("Metal");
}
if backends.contains(wgpu::BackendBit::GL) {
names.push("Open GL");
}
if backends.contains(wgpu::BackendBit::BROWSER_WEBGPU) {
names.push("Web GPU");
}
names
}
pub fn create_buffer_with_data(
device: &wgpu::Device,
data: &[u8],
usage: wgpu::BufferUsage,
label: Option<String>,
) -> wgpu::Buffer {
2020-08-27 10:32:41 +00:00
device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
usage,
label: label.as_deref(),
2020-08-27 10:32:41 +00:00
contents: data,
})
}
2020-08-27 10:32:41 +00:00
// Based off wgpu example 'capture'
#[derive(Debug)]
pub struct BufferDimensions {
pub width: usize,
pub height: usize,
pub unpadded_bytes_per_row: usize,
2021-04-16 20:55:31 +00:00
pub padded_bytes_per_row: NonZeroU32,
2020-08-27 10:32:41 +00:00
}
impl BufferDimensions {
pub fn new(width: usize, height: usize) -> Self {
let bytes_per_pixel = size_of::<u32>();
let unpadded_bytes_per_row = width * bytes_per_pixel;
let align = wgpu::COPY_BYTES_PER_ROW_ALIGNMENT as usize;
let padded_bytes_per_row_padding = (align - unpadded_bytes_per_row % align) % align;
2021-04-16 20:55:31 +00:00
let padded_bytes_per_row =
NonZeroU32::new((unpadded_bytes_per_row + padded_bytes_per_row_padding) as u32)
.unwrap();
2020-08-27 10:32:41 +00:00
Self {
width,
height,
unpadded_bytes_per_row,
padded_bytes_per_row,
}
}
}