wgpu: Inline IncompleteDrawType::build

This commit is contained in:
relrelb 2021-03-19 13:22:06 +02:00 committed by Mike Welsh
parent 3da60a2e04
commit e1734a2bec
2 changed files with 130 additions and 155 deletions

View File

@ -345,31 +345,150 @@ impl<T: RenderTarget> WgpuRenderBackend<T> {
return; return;
} }
let vbo = create_buffer_with_data( let vertex_buffer = create_buffer_with_data(
device, device,
bytemuck::cast_slice(&lyon_mesh.vertices), bytemuck::cast_slice(&lyon_mesh.vertices),
wgpu::BufferUsage::VERTEX, wgpu::BufferUsage::VERTEX,
create_debug_label!("Shape {} ({}) vbo", shape_id, draw.name()), create_debug_label!("Shape {} ({}) vbo", shape_id, draw.name()),
); );
let ibo = create_buffer_with_data( let index_buffer = create_buffer_with_data(
device, device,
bytemuck::cast_slice(&lyon_mesh.indices), bytemuck::cast_slice(&lyon_mesh.indices),
wgpu::BufferUsage::INDEX, wgpu::BufferUsage::INDEX,
create_debug_label!("Shape {} ({}) ibo", shape_id, draw.name()), create_debug_label!("Shape {} ({}) ibo", shape_id, draw.name()),
); );
let index_count = lyon_mesh.indices.len() as u32;
let draw_id = draws.len(); let draw_id = draws.len();
draws.push(draw.build( draws.push(match draw {
device, IncompleteDrawType::Color => Draw {
vbo, draw_type: DrawType::Color,
ibo, vertex_buffer,
lyon_mesh.indices.len() as u32, index_buffer,
pipelines, index_count,
shape_id, },
draw_id, IncompleteDrawType::Gradient {
)); texture_transform,
gradient,
} => {
let tex_transforms_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[texture_transform]),
wgpu::BufferUsage::UNIFORM,
create_debug_label!(
"Shape {} draw {} textransforms ubo transfer buffer",
shape_id,
draw_id
),
);
let gradient_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[gradient]),
wgpu::BufferUsage::STORAGE,
create_debug_label!(
"Shape {} draw {} gradient ubo transfer buffer",
shape_id,
draw_id
),
);
let bind_group_label =
create_debug_label!("Shape {} (gradient) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &pipelines.gradient_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::Buffer {
buffer: &tex_transforms_ubo,
offset: 0,
size: wgpu::BufferSize::new(
std::mem::size_of::<TextureTransforms>() as u64
),
},
},
wgpu::BindGroupEntry {
binding: 1,
resource: wgpu::BindingResource::Buffer {
buffer: &gradient_ubo,
offset: 0,
size: wgpu::BufferSize::new(
std::mem::size_of::<GradientUniforms>() as u64
),
},
},
],
label: bind_group_label.as_deref(),
});
Draw {
draw_type: DrawType::Gradient {
texture_transforms: tex_transforms_ubo,
gradient: gradient_ubo,
bind_group,
},
vertex_buffer,
index_buffer,
index_count,
}
}
IncompleteDrawType::Bitmap {
texture_transform,
is_smoothed,
is_repeating,
texture_view,
} => {
let tex_transforms_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[texture_transform]),
wgpu::BufferUsage::UNIFORM,
create_debug_label!(
"Shape {} draw {} textransforms ubo transfer buffer",
shape_id,
draw_id
),
);
let bind_group_label =
create_debug_label!("Shape {} (bitmap) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &pipelines.bitmap_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::Buffer {
buffer: &tex_transforms_ubo,
offset: 0,
size: wgpu::BufferSize::new(
std::mem::size_of::<TextureTransforms>() as u64
),
},
},
wgpu::BindGroupEntry {
binding: 1,
resource: wgpu::BindingResource::TextureView(&texture_view),
},
],
label: bind_group_label.as_deref(),
});
Draw {
draw_type: DrawType::Bitmap {
texture_transforms: tex_transforms_ubo,
texture_view,
is_smoothed,
is_repeating,
bind_group,
},
vertex_buffer,
index_buffer,
index_count,
}
}
});
*lyon_mesh = VertexBuffers::new(); *lyon_mesh = VertexBuffers::new();
} }

View File

@ -1,9 +1,5 @@
use crate::pipelines::Pipelines;
use crate::utils::create_buffer_with_data;
use crate::TextureTransforms;
use bytemuck::{Pod, Zeroable}; use bytemuck::{Pod, Zeroable};
use ruffle_core::backend::audio::swf::CharacterId; use ruffle_core::backend::audio::swf::CharacterId;
use wgpu::BufferSize;
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone, Debug, Pod, Zeroable)] #[derive(Copy, Clone, Debug, Pod, Zeroable)]
@ -72,144 +68,4 @@ impl IncompleteDrawType {
IncompleteDrawType::Bitmap { .. } => "Bitmap", IncompleteDrawType::Bitmap { .. } => "Bitmap",
} }
} }
#[allow(clippy::too_many_arguments)]
pub fn build(
self,
device: &wgpu::Device,
vertex_buffer: wgpu::Buffer,
index_buffer: wgpu::Buffer,
index_count: u32,
pipelines: &Pipelines,
shape_id: CharacterId,
draw_id: usize,
) -> Draw {
match self {
IncompleteDrawType::Color => Draw {
draw_type: DrawType::Color,
vertex_buffer,
index_buffer,
index_count,
},
IncompleteDrawType::Gradient {
texture_transform,
gradient,
} => {
let tex_transforms_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[texture_transform]),
wgpu::BufferUsage::UNIFORM,
create_debug_label!(
"Shape {} draw {} textransforms ubo transfer buffer",
shape_id,
draw_id
),
);
let gradient_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[gradient]),
wgpu::BufferUsage::STORAGE,
create_debug_label!(
"Shape {} draw {} gradient ubo transfer buffer",
shape_id,
draw_id
),
);
let bind_group_label =
create_debug_label!("Shape {} (gradient) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &pipelines.gradient_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::Buffer {
buffer: &tex_transforms_ubo,
offset: 0,
size: BufferSize::new(
std::mem::size_of::<TextureTransforms>() as u64
),
},
},
wgpu::BindGroupEntry {
binding: 1,
resource: wgpu::BindingResource::Buffer {
buffer: &gradient_ubo,
offset: 0,
size: BufferSize::new(
std::mem::size_of::<GradientUniforms>() as u64
),
},
},
],
label: bind_group_label.as_deref(),
});
Draw {
draw_type: DrawType::Gradient {
texture_transforms: tex_transforms_ubo,
gradient: gradient_ubo,
bind_group,
},
vertex_buffer,
index_buffer,
index_count,
}
}
IncompleteDrawType::Bitmap {
texture_transform,
is_smoothed,
is_repeating,
texture_view,
} => {
let tex_transforms_ubo = create_buffer_with_data(
device,
bytemuck::cast_slice(&[texture_transform]),
wgpu::BufferUsage::UNIFORM,
create_debug_label!(
"Shape {} draw {} textransforms ubo transfer buffer",
shape_id,
draw_id
),
);
let bind_group_label =
create_debug_label!("Shape {} (bitmap) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &pipelines.bitmap_layout,
entries: &[
wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::Buffer {
buffer: &tex_transforms_ubo,
offset: 0,
size: BufferSize::new(
std::mem::size_of::<TextureTransforms>() as u64
),
},
},
wgpu::BindGroupEntry {
binding: 1,
resource: wgpu::BindingResource::TextureView(&texture_view),
},
],
label: bind_group_label.as_deref(),
});
Draw {
draw_type: DrawType::Bitmap {
texture_transforms: tex_transforms_ubo,
texture_view,
is_smoothed,
is_repeating,
bind_group,
},
vertex_buffer,
index_buffer,
index_count,
}
}
}
}
} }