start moving away from wgpu types

This commit is contained in:
Carter Anderson 2020-03-10 00:53:07 -07:00
parent 807929f9e3
commit aca17f15b7
25 changed files with 390 additions and 166 deletions

View File

@ -8,6 +8,7 @@ edition = "2018"
# Modified to use std::any::type_name instead of std::any::TypeId # Modified to use std::any::type_name instead of std::any::TypeId
legion = { path = "bevy_legion", features = ["serialize"] } legion = { path = "bevy_legion", features = ["serialize"] }
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "a7b0d5ae5bc0934439ef559ed145e93f0117c39a"} wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "a7b0d5ae5bc0934439ef559ed145e93f0117c39a"}
bitflags = "1.0"
glam = "0.8.6" glam = "0.8.6"
winit = "0.22.0" winit = "0.22.0"
zerocopy = "0.3" zerocopy = "0.3"

View File

@ -1,6 +1,4 @@
use crate::{asset::Asset, math::*, render::Vertex}; use crate::{asset::Asset, math::*, render::Vertex};
use wgpu::{Buffer, Device};
use zerocopy::AsBytes;
pub enum MeshType { pub enum MeshType {
Cube, Cube,
@ -18,26 +16,6 @@ pub enum MeshType {
pub struct Mesh { pub struct Mesh {
pub vertices: Vec<Vertex>, pub vertices: Vec<Vertex>,
pub indices: Vec<u16>, pub indices: Vec<u16>,
// TODO: remove me
pub vertex_buffer: Option<Buffer>,
pub index_buffer: Option<Buffer>,
}
impl Mesh {
pub fn setup_buffers(&mut self, device: &Device) {
if let None = self.vertex_buffer {
self.vertex_buffer = Some(
device.create_buffer_with_data(self.vertices.as_bytes(), wgpu::BufferUsage::VERTEX),
);
}
if let None = self.index_buffer {
self.index_buffer = Some(
device.create_buffer_with_data(self.indices.as_bytes(), wgpu::BufferUsage::INDEX),
);
}
}
} }
impl Asset<MeshType> for Mesh { impl Asset<MeshType> for Mesh {
@ -53,12 +31,7 @@ impl Asset<MeshType> for Mesh {
} => create_quad(north_west, north_east, south_west, south_east), } => create_quad(north_west, north_east, south_west, south_east),
}; };
Mesh { Mesh { vertices, indices }
vertices,
indices,
vertex_buffer: None,
index_buffer: None,
}
} }
} }

View File

@ -5,52 +5,74 @@ use crate::{
render::shader::ShaderDefSuffixProvider, render::shader::ShaderDefSuffixProvider,
}; };
use std::ops::Add; use std::ops::Add;
use zerocopy::AsBytes;
#[derive(Debug, Default, Clone, Copy, PartialEq)] #[repr(C)]
pub struct Color(Vec4); #[derive(Debug, Default, Clone, Copy, PartialEq, AsBytes)]
pub struct Color {
pub r: f32,
pub g: f32,
pub b: f32,
pub a: f32,
}
impl Color { impl Color {
pub fn rgb(r: f32, g: f32, b: f32) -> Color { pub fn rgb(r: f32, g: f32, b: f32) -> Color {
Color(Vec4::new(r, g, b, 1.0)) Color { r, g, b, a: 1.0 }
} }
pub fn rgba(r: f32, g: f32, b: f32, a: f32) -> Color { pub fn rgba(r: f32, g: f32, b: f32, a: f32) -> Color {
Color(Vec4::new(r, g, b, a)) Color { r, g, b, a }
} }
} }
impl Add<Color> for Color { impl Add<Color> for Color {
type Output = Color; type Output = Color;
fn add(self, rhs: Color) -> Self::Output { fn add(self, rhs: Color) -> Self::Output {
Color(self.0 + rhs.0) Color {
r: self.r + rhs.r,
g: self.g + rhs.g,
b: self.b + rhs.b,
a: self.a + rhs.a,
}
} }
} }
impl Add<Vec4> for Color { impl Add<Vec4> for Color {
type Output = Color; type Output = Color;
fn add(self, rhs: Vec4) -> Self::Output { fn add(self, rhs: Vec4) -> Self::Output {
Color(self.0 + rhs) Color {
r: self.r + rhs.x(),
g: self.g + rhs.y(),
b: self.b + rhs.z(),
a: self.a + rhs.w(),
}
} }
} }
impl From<Vec4> for Color { impl From<Vec4> for Color {
fn from(vec4: Vec4) -> Self { fn from(vec4: Vec4) -> Self {
Color(vec4) Color {
r: vec4.x(),
g: vec4.y(),
b: vec4.z(),
a: vec4.w(),
}
} }
} }
impl Into<[f32; 4]> for Color { impl Into<[f32; 4]> for Color {
fn into(self) -> [f32; 4] { fn into(self) -> [f32; 4] {
self.0.into() [self.r, self.g, self.b, self.a]
} }
} }
impl GetBytes for Color { impl GetBytes for Color {
fn get_bytes(&self) -> Vec<u8> { fn get_bytes(&self) -> Vec<u8> {
self.0.get_bytes() self.as_bytes().iter().map(|v| *v).collect::<Vec<u8>>()
} }
fn get_bytes_ref(&self) -> Option<&[u8]> { fn get_bytes_ref(&self) -> Option<&[u8]> {
self.0.get_bytes_ref() Some(self.as_bytes())
} }
} }

View File

@ -4,7 +4,7 @@ use crate::{
render::{ render::{
draw_target::DrawTarget, draw_target::DrawTarget,
pipeline::PipelineDescriptor, pipeline::PipelineDescriptor,
render_resource::{resource_name, RenderResource, ResourceInfo}, render_resource::{resource_name, BufferUsage, RenderResource, ResourceInfo},
renderer::{RenderPass, Renderer}, renderer::{RenderPass, Renderer},
}, },
}; };
@ -85,14 +85,15 @@ impl DrawTarget for UiDrawTarget {
{ {
let mesh_storage = resources.get_mut::<AssetStorage<Mesh>>().unwrap(); let mesh_storage = resources.get_mut::<AssetStorage<Mesh>>().unwrap();
if let Some(mesh_asset) = mesh_storage.get_id(*mesh_id) { if let Some(mesh_asset) = mesh_storage.get_id(*mesh_id) {
self.mesh_vertex_buffer = Some(renderer.create_buffer_with_data( self.mesh_vertex_buffer =
Some(renderer.create_buffer_with_data(
mesh_asset.vertices.as_bytes(), mesh_asset.vertices.as_bytes(),
wgpu::BufferUsage::VERTEX, BufferUsage::VERTEX,
));
self.mesh_index_buffer = Some(renderer.create_buffer_with_data(
mesh_asset.indices.as_bytes(),
wgpu::BufferUsage::INDEX,
)); ));
self.mesh_index_buffer = Some(
renderer
.create_buffer_with_data(mesh_asset.indices.as_bytes(), BufferUsage::INDEX),
);
self.mesh_index_length = mesh_asset.indices.len(); self.mesh_index_length = mesh_asset.indices.len();
}; };
} }

View File

@ -1,4 +1,6 @@
mod ops;
mod pass; mod pass;
pub mod passes; pub mod passes;
pub use ops::*;
pub use pass::*; pub use pass::*;

13
src/render/pass/ops.rs Normal file
View File

@ -0,0 +1,13 @@
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum LoadOp {
Clear = 0,
Load = 1,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum StoreOp {
Clear = 0,
Store = 1,
}

View File

@ -1,3 +1,6 @@
use super::{LoadOp, StoreOp};
use crate::prelude::Color;
pub struct RenderPassColorAttachmentDescriptor { pub struct RenderPassColorAttachmentDescriptor {
/// The actual color attachment. /// The actual color attachment.
pub attachment: String, pub attachment: String,
@ -6,22 +9,22 @@ pub struct RenderPassColorAttachmentDescriptor {
pub resolve_target: Option<String>, pub resolve_target: Option<String>,
/// The beginning-of-pass load operation for this color attachment. /// The beginning-of-pass load operation for this color attachment.
pub load_op: wgpu::LoadOp, pub load_op: LoadOp,
/// The end-of-pass store operation for this color attachment. /// The end-of-pass store operation for this color attachment.
pub store_op: wgpu::StoreOp, pub store_op: StoreOp,
/// The color that will be assigned to every pixel of this attachment when cleared. /// The color that will be assigned to every pixel of this attachment when cleared.
pub clear_color: wgpu::Color, pub clear_color: Color,
} }
pub struct RenderPassDepthStencilAttachmentDescriptor { pub struct RenderPassDepthStencilAttachmentDescriptor {
pub attachment: String, pub attachment: String,
pub depth_load_op: wgpu::LoadOp, pub depth_load_op: LoadOp,
pub depth_store_op: wgpu::StoreOp, pub depth_store_op: StoreOp,
pub clear_depth: f32, pub clear_depth: f32,
pub stencil_load_op: wgpu::LoadOp, pub stencil_load_op: LoadOp,
pub stencil_store_op: wgpu::StoreOp, pub stencil_store_op: StoreOp,
pub clear_stencil: u32, pub clear_stencil: u32,
} }

View File

@ -1,11 +1,12 @@
use crate::render::{ use crate::render::{
pass::{ pass::{
PassDescriptor, RenderPassColorAttachmentDescriptor, LoadOp, PassDescriptor, RenderPassColorAttachmentDescriptor,
RenderPassDepthStencilAttachmentDescriptor, RenderPassDepthStencilAttachmentDescriptor, StoreOp,
}, },
render_graph::RenderGraphBuilder, render_graph::RenderGraphBuilder,
render_resource::{resource_name, resource_providers::FrameTextureResourceProvider}, render_resource::{resource_name, resource_providers::FrameTextureResourceProvider},
texture::{TextureDescriptor, TextureDimension}, texture::{TextureDescriptor, TextureDimension},
Color,
}; };
pub trait ForwardPassBuilder { pub trait ForwardPassBuilder {
@ -36,21 +37,16 @@ impl ForwardPassBuilder for RenderGraphBuilder {
color_attachments: vec![RenderPassColorAttachmentDescriptor { color_attachments: vec![RenderPassColorAttachmentDescriptor {
attachment: resource_name::texture::SWAP_CHAIN.to_string(), attachment: resource_name::texture::SWAP_CHAIN.to_string(),
resolve_target: None, resolve_target: None,
load_op: wgpu::LoadOp::Clear, load_op: LoadOp::Clear,
store_op: wgpu::StoreOp::Store, store_op: StoreOp::Store,
clear_color: wgpu::Color { clear_color: Color::rgb(0.3, 0.4, 0.5),
r: 0.3,
g: 0.4,
b: 0.5,
a: 1.0,
},
}], }],
depth_stencil_attachment: Some(RenderPassDepthStencilAttachmentDescriptor { depth_stencil_attachment: Some(RenderPassDepthStencilAttachmentDescriptor {
attachment: resource_name::texture::DEPTH.to_string(), attachment: resource_name::texture::DEPTH.to_string(),
depth_load_op: wgpu::LoadOp::Clear, depth_load_op: LoadOp::Clear,
depth_store_op: wgpu::StoreOp::Store, depth_store_op: StoreOp::Store,
stencil_load_op: wgpu::LoadOp::Clear, stencil_load_op: LoadOp::Clear,
stencil_store_op: wgpu::StoreOp::Store, stencil_store_op: StoreOp::Store,
clear_depth: 1.0, clear_depth: 1.0,
clear_stencil: 0, clear_stencil: 0,
}), }),

View File

@ -3,8 +3,10 @@ mod binding;
mod pipeline; mod pipeline;
mod pipeline_layout; mod pipeline_layout;
pub mod pipelines; pub mod pipelines;
mod vertex_buffer_descriptor;
pub use bind_group::*; pub use bind_group::*;
pub use binding::*; pub use binding::*;
pub use pipeline::*; pub use pipeline::*;
pub use pipeline_layout::*; pub use pipeline_layout::*;
pub use vertex_buffer_descriptor::*;

View File

@ -1,4 +1,4 @@
use super::{BindGroup, PipelineLayout}; use super::{BindGroup, PipelineLayout, VertexBufferDescriptor};
use crate::{ use crate::{
asset::{AssetStorage, Handle}, asset::{AssetStorage, Handle},
render::{ render::{
@ -8,23 +8,6 @@ use crate::{
}, },
}; };
#[derive(Clone, Debug)]
pub struct VertexBufferDescriptor {
pub stride: wgpu::BufferAddress,
pub step_mode: wgpu::InputStepMode,
pub attributes: Vec<wgpu::VertexAttributeDescriptor>,
}
impl<'a> Into<wgpu::VertexBufferDescriptor<'a>> for &'a VertexBufferDescriptor {
fn into(self) -> wgpu::VertexBufferDescriptor<'a> {
wgpu::VertexBufferDescriptor {
step_mode: self.step_mode,
stride: self.stride,
attributes: &self.attributes,
}
}
}
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum PipelineLayoutType { pub enum PipelineLayoutType {
Manual(PipelineLayout), Manual(PipelineLayout),

View File

@ -1,7 +1,10 @@
use crate::{ use crate::{
asset::AssetStorage, asset::AssetStorage,
render::{ render::{
pipeline::{PipelineDescriptor, VertexBufferDescriptor}, pipeline::{
InputStepMode, PipelineDescriptor, VertexAttributeDescriptor, VertexBufferDescriptor,
VertexFormat,
},
render_graph::RenderGraphBuilder, render_graph::RenderGraphBuilder,
render_resource::{resource_name, resource_providers::RectData}, render_resource::{resource_name, resource_providers::RectData},
shader::{Shader, ShaderStage}, shader::{Shader, ShaderStage},
@ -65,25 +68,25 @@ impl UiPipelineBuilder for RenderGraphBuilder {
.add_vertex_buffer_descriptor(Vertex::get_vertex_buffer_descriptor()) .add_vertex_buffer_descriptor(Vertex::get_vertex_buffer_descriptor())
.add_vertex_buffer_descriptor(VertexBufferDescriptor { .add_vertex_buffer_descriptor(VertexBufferDescriptor {
stride: std::mem::size_of::<RectData>() as u64, stride: std::mem::size_of::<RectData>() as u64,
step_mode: wgpu::InputStepMode::Instance, step_mode: InputStepMode::Instance,
attributes: vec![ attributes: vec![
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float2, format: VertexFormat::Float2,
offset: 0, offset: 0,
shader_location: 3, shader_location: 3,
}, },
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float2, format: VertexFormat::Float2,
offset: 2 * 4, offset: 2 * 4,
shader_location: 4, shader_location: 4,
}, },
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float4, format: VertexFormat::Float4,
offset: 4 * 4, offset: 4 * 4,
shader_location: 5, shader_location: 5,
}, },
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float, format: VertexFormat::Float,
offset: 8 * 4, offset: 8 * 4,
shader_location: 6, shader_location: 6,
}, },

View File

@ -0,0 +1,53 @@
#[derive(Clone, Debug)]
pub struct VertexBufferDescriptor {
pub stride: u64,
pub step_mode: InputStepMode,
pub attributes: Vec<VertexAttributeDescriptor>,
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum VertexFormat {
Uchar2 = 1,
Uchar4 = 3,
Char2 = 5,
Char4 = 7,
Uchar2Norm = 9,
Uchar4Norm = 11,
Char2Norm = 14,
Char4Norm = 16,
Ushort2 = 18,
Ushort4 = 20,
Short2 = 22,
Short4 = 24,
Ushort2Norm = 26,
Ushort4Norm = 28,
Short2Norm = 30,
Short4Norm = 32,
Half2 = 34,
Half4 = 36,
Float = 37,
Float2 = 38,
Float3 = 39,
Float4 = 40,
Uint = 41,
Uint2 = 42,
Uint3 = 43,
Uint4 = 44,
Int = 45,
Int2 = 46,
Int3 = 47,
Int4 = 48,
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum InputStepMode {
Vertex = 0,
Instance = 1,
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub struct VertexAttributeDescriptor {
pub offset: u64,
pub format: VertexFormat,
pub shader_location: u32,
}

View File

@ -0,0 +1,27 @@
bitflags::bitflags! {
#[repr(transparent)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BufferUsage: u32 {
const MAP_READ = 1;
const MAP_WRITE = 2;
const COPY_SRC = 4;
const COPY_DST = 8;
const INDEX = 16;
const VERTEX = 32;
const UNIFORM = 64;
const STORAGE = 128;
const INDIRECT = 256;
const STORAGE_READ = 512;
const NONE = 0;
/// The combination of all read-only usages.
const READ_ALL = Self::MAP_READ.bits | Self::COPY_SRC.bits |
Self::INDEX.bits | Self::VERTEX.bits | Self::UNIFORM.bits |
Self::STORAGE_READ.bits | Self::INDIRECT.bits;
/// The combination of all write-only and read-write usages.
const WRITE_ALL = Self::MAP_WRITE.bits | Self::COPY_DST.bits | Self::STORAGE.bits;
/// The combination of all usages that the are guaranteed to be be ordered by the hardware.
/// If a usage is not ordered, then even if it doesn't change between draw calls, there
/// still need to be pipeline barriers inserted for synchronization.
const ORDERED = Self::READ_ALL.bits;
}
}

View File

@ -1,9 +1,11 @@
mod buffer;
mod render_resource; mod render_resource;
mod resource_info; mod resource_info;
pub mod resource_name; pub mod resource_name;
mod resource_provider; mod resource_provider;
pub mod resource_providers; pub mod resource_providers;
pub use buffer::*;
pub use render_resource::*; pub use render_resource::*;
pub use resource_info::*; pub use resource_info::*;
pub use resource_provider::*; pub use resource_provider::*;

View File

@ -1,5 +1,5 @@
use crate::render::{ use crate::render::{
render_resource::{resource_name, RenderResource, ResourceProvider}, render_resource::{resource_name, BufferUsage, RenderResource, ResourceProvider},
renderer::Renderer, renderer::Renderer,
ActiveCamera2d, Camera, ActiveCamera2d, Camera,
}; };
@ -21,7 +21,7 @@ impl ResourceProvider for Camera2dResourceProvider {
) { ) {
let buffer = renderer.create_buffer( let buffer = renderer.create_buffer(
std::mem::size_of::<[[f32; 4]; 4]>() as u64, std::mem::size_of::<[[f32; 4]; 4]>() as u64,
wgpu::BufferUsage::COPY_DST | wgpu::BufferUsage::UNIFORM, BufferUsage::COPY_DST | BufferUsage::UNIFORM,
); );
renderer renderer
@ -51,7 +51,7 @@ impl ResourceProvider for Camera2dResourceProvider {
self.tmp_buffer = Some(renderer.create_buffer_mapped( self.tmp_buffer = Some(renderer.create_buffer_mapped(
matrix_size, matrix_size,
wgpu::BufferUsage::COPY_SRC, BufferUsage::COPY_SRC,
&mut |data| { &mut |data| {
data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes()); data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes());
}, },

View File

@ -1,5 +1,5 @@
use crate::render::{ use crate::render::{
render_resource::{resource_name, RenderResource, ResourceProvider}, render_resource::{resource_name, BufferUsage, RenderResource, ResourceProvider},
renderer::Renderer, renderer::Renderer,
ActiveCamera, Camera, ActiveCamera, Camera,
}; };
@ -22,7 +22,7 @@ impl ResourceProvider for CameraResourceProvider {
) { ) {
let buffer = renderer.create_buffer( let buffer = renderer.create_buffer(
std::mem::size_of::<[[f32; 4]; 4]>() as u64, std::mem::size_of::<[[f32; 4]; 4]>() as u64,
wgpu::BufferUsage::COPY_DST | wgpu::BufferUsage::UNIFORM, BufferUsage::COPY_DST | BufferUsage::UNIFORM,
); );
renderer renderer
@ -55,7 +55,7 @@ impl ResourceProvider for CameraResourceProvider {
self.tmp_buffer = Some(renderer.create_buffer_mapped( self.tmp_buffer = Some(renderer.create_buffer_mapped(
matrix_size, matrix_size,
wgpu::BufferUsage::COPY_SRC, BufferUsage::COPY_SRC,
&mut |data| { &mut |data| {
data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes()); data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes());
}, },

View File

@ -1,5 +1,5 @@
use crate::render::{ use crate::render::{
render_resource::{resource_name, RenderResource, ResourceProvider}, render_resource::{resource_name, BufferUsage, RenderResource, ResourceProvider},
renderer::Renderer, renderer::Renderer,
Light, LightRaw, Light, LightRaw,
}; };
@ -46,7 +46,7 @@ impl ResourceProvider for LightResourceProvider {
let buffer = renderer.create_buffer( let buffer = renderer.create_buffer(
light_uniform_size, light_uniform_size,
wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_SRC | wgpu::BufferUsage::COPY_DST, BufferUsage::UNIFORM | BufferUsage::COPY_SRC | BufferUsage::COPY_DST,
); );
renderer renderer
.get_render_resources_mut() .get_render_resources_mut()
@ -78,7 +78,7 @@ impl ResourceProvider for LightResourceProvider {
self.tmp_light_buffer = Some(renderer.create_buffer_mapped( self.tmp_light_buffer = Some(renderer.create_buffer_mapped(
total_size, total_size,
wgpu::BufferUsage::COPY_SRC, BufferUsage::COPY_SRC,
&mut |data| { &mut |data| {
for ((light, local_to_world, translation), slot) in for ((light, local_to_world, translation), slot) in
light_query.iter(world).zip(data.chunks_exact_mut(size)) light_query.iter(world).zip(data.chunks_exact_mut(size))
@ -91,7 +91,7 @@ impl ResourceProvider for LightResourceProvider {
)); ));
self.tmp_count_buffer = Some(renderer.create_buffer_mapped( self.tmp_count_buffer = Some(renderer.create_buffer_mapped(
light_count_size, light_count_size,
wgpu::BufferUsage::COPY_SRC, BufferUsage::COPY_SRC,
&mut |data| { &mut |data| {
data.copy_from_slice([light_count as u32, 0, 0, 0].as_bytes()); data.copy_from_slice([light_count as u32, 0, 0, 0].as_bytes());
}, },

View File

@ -1,7 +1,10 @@
use crate::{ use crate::{
asset::{AssetStorage, Handle, Mesh}, asset::{AssetStorage, Handle, Mesh},
prelude::Renderable, prelude::Renderable,
render::{render_resource::ResourceProvider, renderer::Renderer}, render::{
render_resource::{BufferUsage, ResourceProvider},
renderer::Renderer,
},
}; };
use legion::{filter::*, prelude::*}; use legion::{filter::*, prelude::*};
use zerocopy::AsBytes; use zerocopy::AsBytes;
@ -51,14 +54,10 @@ impl ResourceProvider for MeshResourceProvider {
.get_mesh_vertices_resource(*mesh_handle) .get_mesh_vertices_resource(*mesh_handle)
{ {
let mesh_asset = mesh_storage.get(&mesh_handle).unwrap(); let mesh_asset = mesh_storage.get(&mesh_handle).unwrap();
let vertex_buffer = renderer.create_buffer_with_data( let vertex_buffer = renderer
mesh_asset.vertices.as_bytes(), .create_buffer_with_data(mesh_asset.vertices.as_bytes(), BufferUsage::VERTEX);
wgpu::BufferUsage::VERTEX, let index_buffer = renderer
); .create_buffer_with_data(mesh_asset.indices.as_bytes(), BufferUsage::INDEX);
let index_buffer = renderer.create_buffer_with_data(
mesh_asset.indices.as_bytes(),
wgpu::BufferUsage::INDEX,
);
let render_resources = renderer.get_render_resources_mut(); let render_resources = renderer.get_render_resources_mut();
render_resources.set_mesh_vertices_resource(*mesh_handle, vertex_buffer); render_resources.set_mesh_vertices_resource(*mesh_handle, vertex_buffer);

View File

@ -3,7 +3,7 @@ use crate::{
ecs, math, ecs, math,
prelude::Node, prelude::Node,
render::{ render::{
render_resource::{resource_name, RenderResource, ResourceProvider}, render_resource::{resource_name, BufferUsage, RenderResource, ResourceProvider},
renderer::Renderer, renderer::Renderer,
}, },
}; };
@ -82,7 +82,7 @@ impl UiResourceProvider {
data.as_bytes(), data.as_bytes(),
size, size,
data.len(), data.len(),
wgpu::BufferUsage::COPY_SRC | wgpu::BufferUsage::VERTEX, BufferUsage::COPY_SRC | BufferUsage::VERTEX,
); );
renderer renderer

View File

@ -2,7 +2,7 @@ use crate::{
asset::{AssetStorage, Texture}, asset::{AssetStorage, Texture},
render::{ render::{
pipeline::BindType, pipeline::BindType,
render_resource::{RenderResource, ResourceProvider}, render_resource::{BufferUsage, RenderResource, ResourceProvider},
renderer::Renderer, renderer::Renderer,
shader::{AsUniforms, DynamicUniformBufferInfo, UniformInfoIter}, shader::{AsUniforms, DynamicUniformBufferInfo, UniformInfoIter},
texture::{SamplerDescriptor, TextureDescriptor}, texture::{SamplerDescriptor, TextureDescriptor},
@ -151,10 +151,8 @@ where
// allocate enough space for twice as many entities as there are currently; // allocate enough space for twice as many entities as there are currently;
let capacity = count * 2; let capacity = count * 2;
let size = wgpu::BIND_BUFFER_ALIGNMENT * capacity; let size = wgpu::BIND_BUFFER_ALIGNMENT * capacity;
let created_resource = renderer.create_buffer( let created_resource =
size, renderer.create_buffer(size, BufferUsage::COPY_DST | BufferUsage::UNIFORM);
wgpu::BufferUsage::COPY_DST | wgpu::BufferUsage::UNIFORM,
);
let mut info = DynamicUniformBufferInfo::new(); let mut info = DynamicUniformBufferInfo::new();
info.count = count; info.count = count;
@ -193,7 +191,7 @@ where
let mapped_buffer_resource = renderer.create_buffer_mapped( let mapped_buffer_resource = renderer.create_buffer_mapped(
size as usize, size as usize,
wgpu::BufferUsage::COPY_SRC, BufferUsage::COPY_SRC,
&mut |mapped| { &mut |mapped| {
let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize; let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize;
let mut offset = 0usize; let mut offset = 0usize;

View File

@ -3,7 +3,7 @@ use crate::{
render::{ render::{
pipeline::PipelineDescriptor, pipeline::PipelineDescriptor,
render_graph::RenderGraph, render_graph::RenderGraph,
render_resource::{RenderResource, RenderResources, ResourceInfo}, render_resource::{BufferUsage, RenderResource, RenderResources, ResourceInfo},
shader::DynamicUniformBufferInfo, shader::DynamicUniformBufferInfo,
texture::{SamplerDescriptor, TextureDescriptor}, texture::{SamplerDescriptor, TextureDescriptor},
}, },
@ -31,12 +31,8 @@ pub trait Renderer {
world: &mut World, world: &mut World,
resources: &mut Resources, resources: &mut Resources,
); );
// TODO: swap out wgpu::BufferUsage for non-wgpu type fn create_buffer_with_data(&mut self, data: &[u8], buffer_usage: BufferUsage)
fn create_buffer_with_data( -> RenderResource;
&mut self,
data: &[u8],
buffer_usage: wgpu::BufferUsage,
) -> RenderResource;
fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource; fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource;
fn create_texture( fn create_texture(
&mut self, &mut self,
@ -57,13 +53,13 @@ pub trait Renderer {
resource: RenderResource, resource: RenderResource,
info: DynamicUniformBufferInfo, info: DynamicUniformBufferInfo,
); );
fn create_buffer(&mut self, size: u64, buffer_usage: wgpu::BufferUsage) -> RenderResource; fn create_buffer(&mut self, size: u64, buffer_usage: BufferUsage) -> RenderResource;
fn create_instance_buffer( fn create_instance_buffer(
&mut self, &mut self,
mesh_id: usize, mesh_id: usize,
size: usize, size: usize,
count: usize, count: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
) -> RenderResource; ) -> RenderResource;
fn create_instance_buffer_with_data( fn create_instance_buffer_with_data(
&mut self, &mut self,
@ -71,12 +67,12 @@ pub trait Renderer {
data: &[u8], data: &[u8],
size: usize, size: usize,
count: usize, count: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
) -> RenderResource; ) -> RenderResource;
fn create_buffer_mapped( fn create_buffer_mapped(
&mut self, &mut self,
size: usize, size: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
func: &mut dyn FnMut(&mut [u8]), func: &mut dyn FnMut(&mut [u8]),
) -> RenderResource; ) -> RenderResource;
fn remove_buffer(&mut self, resource: RenderResource); fn remove_buffer(&mut self, resource: RenderResource);

View File

@ -1,6 +1,7 @@
mod wgpu_render_pass; mod wgpu_render_pass;
mod wgpu_renderer; mod wgpu_renderer;
mod wgpu_resources; mod wgpu_resources;
mod wgpu_type_converter;
pub use wgpu_render_pass::*; pub use wgpu_render_pass::*;
pub use wgpu_renderer::*; pub use wgpu_renderer::*;

View File

@ -1,4 +1,4 @@
use super::{WgpuRenderPass, WgpuResources}; use super::{wgpu_type_converter::OwnedWgpuVertexBufferDescriptor, WgpuRenderPass, WgpuResources};
use crate::{ use crate::{
asset::{AssetStorage, Handle}, asset::{AssetStorage, Handle},
legion::prelude::*, legion::prelude::*,
@ -9,7 +9,9 @@ use crate::{
}, },
pipeline::{BindType, PipelineDescriptor, PipelineLayout, PipelineLayoutType}, pipeline::{BindType, PipelineDescriptor, PipelineLayout, PipelineLayoutType},
render_graph::RenderGraph, render_graph::RenderGraph,
render_resource::{resource_name, RenderResource, RenderResources, ResourceInfo}, render_resource::{
resource_name, BufferUsage, RenderResource, RenderResources, ResourceInfo,
},
renderer::Renderer, renderer::Renderer,
shader::{DynamicUniformBufferInfo, Shader}, shader::{DynamicUniformBufferInfo, Shader},
texture::{SamplerDescriptor, TextureDescriptor}, texture::{SamplerDescriptor, TextureDescriptor},
@ -159,6 +161,12 @@ impl WgpuRenderer {
bind_group_layouts: bind_group_layouts.as_slice(), bind_group_layouts: bind_group_layouts.as_slice(),
}); });
let owned_vertex_buffer_descriptors = pipeline_descriptor
.vertex_buffer_descriptors
.iter()
.map(|v| v.into())
.collect::<Vec<OwnedWgpuVertexBufferDescriptor>>();
let mut render_pipeline_descriptor = wgpu::RenderPipelineDescriptor { let mut render_pipeline_descriptor = wgpu::RenderPipelineDescriptor {
layout: &pipeline_layout, layout: &pipeline_layout,
vertex_stage: wgpu::ProgrammableStageDescriptor { vertex_stage: wgpu::ProgrammableStageDescriptor {
@ -177,8 +185,7 @@ impl WgpuRenderer {
color_states: &pipeline_descriptor.color_states, color_states: &pipeline_descriptor.color_states,
depth_stencil_state: pipeline_descriptor.depth_stencil_state.clone(), depth_stencil_state: pipeline_descriptor.depth_stencil_state.clone(),
index_format: pipeline_descriptor.index_format, index_format: pipeline_descriptor.index_format,
vertex_buffers: &pipeline_descriptor vertex_buffers: &owned_vertex_buffer_descriptors
.vertex_buffer_descriptors
.iter() .iter()
.map(|v| v.into()) .map(|v| v.into())
.collect::<Vec<wgpu::VertexBufferDescriptor>>(), .collect::<Vec<wgpu::VertexBufferDescriptor>>(),
@ -247,9 +254,9 @@ impl WgpuRenderer {
}; };
wgpu::RenderPassColorAttachmentDescriptor { wgpu::RenderPassColorAttachmentDescriptor {
store_op: color_attachment_descriptor.store_op, store_op: color_attachment_descriptor.store_op.into(),
load_op: color_attachment_descriptor.load_op, load_op: color_attachment_descriptor.load_op.into(),
clear_color: color_attachment_descriptor.clear_color, clear_color: color_attachment_descriptor.clear_color.into(),
attachment, attachment,
resolve_target, resolve_target,
} }
@ -280,10 +287,10 @@ impl WgpuRenderer {
attachment, attachment,
clear_depth: depth_stencil_attachment_descriptor.clear_depth, clear_depth: depth_stencil_attachment_descriptor.clear_depth,
clear_stencil: depth_stencil_attachment_descriptor.clear_stencil, clear_stencil: depth_stencil_attachment_descriptor.clear_stencil,
depth_load_op: depth_stencil_attachment_descriptor.depth_load_op, depth_load_op: depth_stencil_attachment_descriptor.depth_load_op.into(),
depth_store_op: depth_stencil_attachment_descriptor.depth_store_op, depth_store_op: depth_stencil_attachment_descriptor.depth_store_op.into(),
stencil_load_op: depth_stencil_attachment_descriptor.stencil_load_op, stencil_load_op: depth_stencil_attachment_descriptor.stencil_load_op.into(),
stencil_store_op: depth_stencil_attachment_descriptor.stencil_store_op, stencil_store_op: depth_stencil_attachment_descriptor.stencil_store_op.into(),
} }
} }
@ -500,15 +507,15 @@ impl Renderer for WgpuRenderer {
fn create_buffer_with_data( fn create_buffer_with_data(
&mut self, &mut self,
data: &[u8], data: &[u8],
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
) -> RenderResource { ) -> RenderResource {
self.wgpu_resources self.wgpu_resources
.create_buffer_with_data(&self.device, data, buffer_usage) .create_buffer_with_data(&self.device, data, buffer_usage.into())
} }
fn create_buffer(&mut self, size: u64, buffer_usage: wgpu::BufferUsage) -> RenderResource { fn create_buffer(&mut self, size: u64, buffer_usage: BufferUsage) -> RenderResource {
self.wgpu_resources self.wgpu_resources
.create_buffer(&self.device, size, buffer_usage) .create_buffer(&self.device, size, buffer_usage.into())
} }
fn create_instance_buffer( fn create_instance_buffer(
@ -516,10 +523,15 @@ impl Renderer for WgpuRenderer {
mesh_id: usize, mesh_id: usize,
size: usize, size: usize,
count: usize, count: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
) -> RenderResource { ) -> RenderResource {
self.wgpu_resources self.wgpu_resources.create_instance_buffer(
.create_instance_buffer(&self.device, mesh_id, size, count, buffer_usage) &self.device,
mesh_id,
size,
count,
buffer_usage.into(),
)
} }
fn create_instance_buffer_with_data( fn create_instance_buffer_with_data(
@ -528,7 +540,7 @@ impl Renderer for WgpuRenderer {
data: &[u8], data: &[u8],
size: usize, size: usize,
count: usize, count: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
) -> RenderResource { ) -> RenderResource {
self.wgpu_resources.create_instance_buffer_with_data( self.wgpu_resources.create_instance_buffer_with_data(
&self.device, &self.device,
@ -536,7 +548,7 @@ impl Renderer for WgpuRenderer {
data, data,
size, size,
count, count,
buffer_usage, buffer_usage.into(),
) )
} }
@ -551,11 +563,15 @@ impl Renderer for WgpuRenderer {
fn create_buffer_mapped( fn create_buffer_mapped(
&mut self, &mut self,
size: usize, size: usize,
buffer_usage: wgpu::BufferUsage, buffer_usage: BufferUsage,
setup_data: &mut dyn FnMut(&mut [u8]), setup_data: &mut dyn FnMut(&mut [u8]),
) -> RenderResource { ) -> RenderResource {
self.wgpu_resources self.wgpu_resources.create_buffer_mapped(
.create_buffer_mapped(&self.device, size, buffer_usage, setup_data) &self.device,
size,
buffer_usage.into(),
setup_data,
)
} }
fn copy_buffer_to_buffer( fn copy_buffer_to_buffer(

View File

@ -0,0 +1,133 @@
use crate::{
prelude::Color,
render::{
pass::{LoadOp, StoreOp},
pipeline::{
InputStepMode, VertexAttributeDescriptor, VertexBufferDescriptor, VertexFormat,
},
render_resource::BufferUsage,
},
};
impl From<VertexFormat> for wgpu::VertexFormat {
fn from(val: VertexFormat) -> Self {
match val {
VertexFormat::Uchar2 => wgpu::VertexFormat::Uchar2,
VertexFormat::Uchar4 => wgpu::VertexFormat::Uchar4,
VertexFormat::Char2 => wgpu::VertexFormat::Char2,
VertexFormat::Char4 => wgpu::VertexFormat::Char4,
VertexFormat::Uchar2Norm => wgpu::VertexFormat::Uchar2Norm,
VertexFormat::Uchar4Norm => wgpu::VertexFormat::Uchar4Norm,
VertexFormat::Char2Norm => wgpu::VertexFormat::Char2Norm,
VertexFormat::Char4Norm => wgpu::VertexFormat::Char4Norm,
VertexFormat::Ushort2 => wgpu::VertexFormat::Ushort2,
VertexFormat::Ushort4 => wgpu::VertexFormat::Ushort4,
VertexFormat::Short2 => wgpu::VertexFormat::Short2,
VertexFormat::Short4 => wgpu::VertexFormat::Short4,
VertexFormat::Ushort2Norm => wgpu::VertexFormat::Ushort2Norm,
VertexFormat::Ushort4Norm => wgpu::VertexFormat::Ushort4Norm,
VertexFormat::Short2Norm => wgpu::VertexFormat::Short2Norm,
VertexFormat::Short4Norm => wgpu::VertexFormat::Short4Norm,
VertexFormat::Half2 => wgpu::VertexFormat::Half2,
VertexFormat::Half4 => wgpu::VertexFormat::Half4,
VertexFormat::Float => wgpu::VertexFormat::Float,
VertexFormat::Float2 => wgpu::VertexFormat::Float2,
VertexFormat::Float3 => wgpu::VertexFormat::Float3,
VertexFormat::Float4 => wgpu::VertexFormat::Float4,
VertexFormat::Uint => wgpu::VertexFormat::Uint,
VertexFormat::Uint2 => wgpu::VertexFormat::Uint2,
VertexFormat::Uint3 => wgpu::VertexFormat::Uint3,
VertexFormat::Uint4 => wgpu::VertexFormat::Uint4,
VertexFormat::Int => wgpu::VertexFormat::Int,
VertexFormat::Int2 => wgpu::VertexFormat::Int2,
VertexFormat::Int3 => wgpu::VertexFormat::Int3,
VertexFormat::Int4 => wgpu::VertexFormat::Int4,
}
}
}
impl From<&VertexAttributeDescriptor> for wgpu::VertexAttributeDescriptor {
fn from(val: &VertexAttributeDescriptor) -> Self {
wgpu::VertexAttributeDescriptor {
format: val.format.into(),
offset: val.offset,
shader_location: val.shader_location,
}
}
}
impl From<InputStepMode> for wgpu::InputStepMode {
fn from(val: InputStepMode) -> Self {
match val {
InputStepMode::Vertex => wgpu::InputStepMode::Vertex,
InputStepMode::Instance => wgpu::InputStepMode::Instance,
}
}
}
#[derive(Clone, Debug)]
pub struct OwnedWgpuVertexBufferDescriptor {
pub stride: wgpu::BufferAddress,
pub step_mode: wgpu::InputStepMode,
pub attributes: Vec<wgpu::VertexAttributeDescriptor>,
}
impl From<&VertexBufferDescriptor> for OwnedWgpuVertexBufferDescriptor {
fn from(val: &VertexBufferDescriptor) -> OwnedWgpuVertexBufferDescriptor {
let attributes = val
.attributes
.iter()
.map(|a| a.into())
.collect::<Vec<wgpu::VertexAttributeDescriptor>>();
OwnedWgpuVertexBufferDescriptor {
step_mode: val.step_mode.into(),
stride: val.stride,
attributes,
}
}
}
impl<'a> From<&'a OwnedWgpuVertexBufferDescriptor> for wgpu::VertexBufferDescriptor<'a> {
fn from(val: &'a OwnedWgpuVertexBufferDescriptor) -> Self {
wgpu::VertexBufferDescriptor {
attributes: &val.attributes,
step_mode: val.step_mode,
stride: val.stride,
}
}
}
impl From<Color> for wgpu::Color {
fn from(color: Color) -> Self {
wgpu::Color {
r: color.r as f64,
g: color.g as f64,
b: color.b as f64,
a: color.a as f64,
}
}
}
impl From<BufferUsage> for wgpu::BufferUsage {
fn from(val: BufferUsage) -> Self {
wgpu::BufferUsage::from_bits(val.bits()).unwrap()
}
}
impl From<LoadOp> for wgpu::LoadOp {
fn from(val: LoadOp) -> Self {
match val {
LoadOp::Clear => wgpu::LoadOp::Clear,
LoadOp::Load => wgpu::LoadOp::Load,
}
}
}
impl From<StoreOp> for wgpu::StoreOp {
fn from(val: StoreOp) -> Self {
match val {
StoreOp::Clear => wgpu::StoreOp::Clear,
StoreOp::Store => wgpu::StoreOp::Store,
}
}
}

View File

@ -1,4 +1,5 @@
use super::pipeline::VertexBufferDescriptor; use super::pipeline::{InputStepMode, VertexBufferDescriptor, VertexFormat};
use crate::render::pipeline::VertexAttributeDescriptor;
use std::convert::From; use std::convert::From;
use zerocopy::{AsBytes, FromBytes}; use zerocopy::{AsBytes, FromBytes};
@ -11,24 +12,23 @@ pub struct Vertex {
} }
impl Vertex { impl Vertex {
// TODO: generate from macro
pub fn get_vertex_buffer_descriptor() -> VertexBufferDescriptor { pub fn get_vertex_buffer_descriptor() -> VertexBufferDescriptor {
VertexBufferDescriptor { VertexBufferDescriptor {
stride: std::mem::size_of::<Vertex>() as u64, stride: std::mem::size_of::<Vertex>() as u64,
step_mode: wgpu::InputStepMode::Vertex, step_mode: InputStepMode::Vertex,
attributes: vec![ attributes: vec![
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float4, format: VertexFormat::Float4,
offset: 0, offset: 0,
shader_location: 0, shader_location: 0,
}, },
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float4, format: VertexFormat::Float4,
offset: 4 * 4, offset: 4 * 4,
shader_location: 1, shader_location: 1,
}, },
wgpu::VertexAttributeDescriptor { VertexAttributeDescriptor {
format: wgpu::VertexFormat::Float2, format: VertexFormat::Float2,
offset: 8 * 4, offset: 8 * 4,
shader_location: 2, shader_location: 2,
}, },