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;
}
let vbo = create_buffer_with_data(
let vertex_buffer = create_buffer_with_data(
device,
bytemuck::cast_slice(&lyon_mesh.vertices),
wgpu::BufferUsage::VERTEX,
create_debug_label!("Shape {} ({}) vbo", shape_id, draw.name()),
);
let ibo = create_buffer_with_data(
let index_buffer = create_buffer_with_data(
device,
bytemuck::cast_slice(&lyon_mesh.indices),
wgpu::BufferUsage::INDEX,
create_debug_label!("Shape {} ({}) ibo", shape_id, draw.name()),
);
let index_count = lyon_mesh.indices.len() as u32;
let draw_id = draws.len();
draws.push(draw.build(
draws.push(match draw {
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,
vbo,
ibo,
lyon_mesh.indices.len() as u32,
pipelines,
bytemuck::cast_slice(&[texture_transform]),
wgpu::BufferUsage::UNIFORM,
create_debug_label!(
"Shape {} draw {} textransforms ubo transfer buffer",
shape_id,
draw_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();
}

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 ruffle_core::backend::audio::swf::CharacterId;
use wgpu::BufferSize;
#[repr(C)]
#[derive(Copy, Clone, Debug, Pod, Zeroable)]
@ -72,144 +68,4 @@ impl IncompleteDrawType {
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,
}
}
}
}
}