Move some types into shared wgpu-types crate

This commit is contained in:
Joshua Groves 2020-03-10 22:36:23 -02:30
parent 40889df58f
commit 9940aef599
28 changed files with 735 additions and 633 deletions

11
Cargo.lock generated
View File

@ -710,6 +710,7 @@ dependencies = [
"serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"wgpu-types 0.1.0",
] ]
[[package]] [[package]]
@ -723,6 +724,7 @@ dependencies = [
"parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"raw-window-handle 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "raw-window-handle 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"wgpu-core 0.1.0", "wgpu-core 0.1.0",
"wgpu-types 0.1.0",
] ]
[[package]] [[package]]
@ -732,6 +734,15 @@ dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"wgpu-core 0.1.0", "wgpu-core 0.1.0",
"wgpu-types 0.1.0",
]
[[package]]
name = "wgpu-types"
version = "0.1.0"
dependencies = [
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]

View File

@ -3,4 +3,5 @@ members = [
"wgpu-core", "wgpu-core",
"wgpu-native", "wgpu-native",
"wgpu-remote", "wgpu-remote",
"wgpu-types",
] ]

View File

@ -17,6 +17,7 @@ license = "MPL-2.0"
[features] [features]
default = [] default = []
metal-auto-capture = ["gfx-backend-metal/auto-capture"] metal-auto-capture = ["gfx-backend-metal/auto-capture"]
serde1 = ["wgt/serde"]
#NOTE: glutin feature is not stable, use at your own risk #NOTE: glutin feature is not stable, use at your own risk
#glutin = ["gfx-backend-gl/glutin"] #glutin = ["gfx-backend-gl/glutin"]
@ -36,6 +37,11 @@ serde = { version = "1.0", features = ["serde_derive"], optional = true }
smallvec = "1.0" smallvec = "1.0"
vec_map = "0.8" vec_map = "0.8"
[dependencies.wgt]
path = "../wgpu-types"
package = "wgpu-types"
version = "0.1"
[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies] [target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
gfx-backend-metal = { version = "0.4" } gfx-backend-metal = { version = "0.4" }
gfx-backend-vulkan = { version = "0.4", optional = true } gfx-backend-vulkan = { version = "0.4", optional = true }

View File

@ -4,15 +4,14 @@
use crate::{ use crate::{
id::{BindGroupLayoutId, BufferId, DeviceId, SamplerId, TextureViewId}, id::{BindGroupLayoutId, BufferId, DeviceId, SamplerId, TextureViewId},
resource::TextureViewDimension,
track::{DUMMY_SELECTOR, TrackerSet}, track::{DUMMY_SELECTOR, TrackerSet},
BufferAddress,
FastHashMap, FastHashMap,
LifeGuard, LifeGuard,
RefCount, RefCount,
Stored, Stored,
}; };
use wgt::BufferAddress;
use arrayvec::ArrayVec; use arrayvec::ArrayVec;
use rendy_descriptor::{DescriptorRanges, DescriptorSet}; use rendy_descriptor::{DescriptorRanges, DescriptorSet};
@ -20,19 +19,6 @@ use rendy_descriptor::{DescriptorRanges, DescriptorSet};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::borrow::Borrow; use std::borrow::Borrow;
pub const MAX_BIND_GROUPS: usize = 4;
bitflags::bitflags! {
#[repr(transparent)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ShaderStage: u32 {
const NONE = 0;
const VERTEX = 1;
const FRAGMENT = 2;
const COMPUTE = 4;
}
}
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@ -50,9 +36,9 @@ pub enum BindingType {
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BindGroupLayoutBinding { pub struct BindGroupLayoutBinding {
pub binding: u32, pub binding: u32,
pub visibility: ShaderStage, pub visibility: wgt::ShaderStage,
pub ty: BindingType, pub ty: BindingType,
pub texture_dimension: TextureViewDimension, pub texture_dimension: wgt::TextureViewDimension,
pub multisampled: bool, pub multisampled: bool,
pub dynamic: bool, pub dynamic: bool,
} }
@ -82,7 +68,7 @@ pub struct PipelineLayoutDescriptor {
#[derive(Debug)] #[derive(Debug)]
pub struct PipelineLayout<B: hal::Backend> { pub struct PipelineLayout<B: hal::Backend> {
pub(crate) raw: B::PipelineLayout, pub(crate) raw: B::PipelineLayout,
pub(crate) bind_group_layout_ids: ArrayVec<[BindGroupLayoutId; MAX_BIND_GROUPS]>, pub(crate) bind_group_layout_ids: ArrayVec<[BindGroupLayoutId; wgt::MAX_BIND_GROUPS]>,
} }
#[repr(C)] #[repr(C)]

View File

@ -11,11 +11,10 @@ use crate::{
device::{all_buffer_stages, BIND_BUFFER_ALIGNMENT}, device::{all_buffer_stages, BIND_BUFFER_ALIGNMENT},
hub::{GfxBackend, Global, Token}, hub::{GfxBackend, Global, Token},
id, id,
resource::BufferUsage,
BufferAddress,
DynamicOffset, DynamicOffset,
}; };
use wgt::{BufferAddress, BufferUsage};
use hal::command::CommandBuffer as _; use hal::command::CommandBuffer as _;
use peek_poke::{Peek, PeekCopy, Poke}; use peek_poke::{Peek, PeekCopy, Poke};
@ -222,10 +221,10 @@ pub mod compute_ffi {
}; };
use crate::{ use crate::{
id, id,
BufferAddress,
DynamicOffset, DynamicOffset,
RawString, RawString,
}; };
use wgt::BufferAddress;
use std::{convert::TryInto, slice}; use std::{convert::TryInto, slice};
/// # Safety /// # Safety

View File

@ -20,15 +20,15 @@ use crate::{
}, },
hub::{GfxBackend, Global, Token}, hub::{GfxBackend, Global, Token},
id, id,
pipeline::{IndexFormat, InputStepMode, PipelineFlags}, pipeline::PipelineFlags,
resource::{BufferUsage, TextureUsage, TextureViewInner}, resource::{TextureUsage, TextureViewInner},
track::TrackerSet, track::TrackerSet,
BufferAddress,
Color, Color,
DynamicOffset, DynamicOffset,
Stored, Stored,
}; };
use wgt::{BufferAddress, BufferUsage, IndexFormat, InputStepMode};
use arrayvec::ArrayVec; use arrayvec::ArrayVec;
use hal::command::CommandBuffer as _; use hal::command::CommandBuffer as _;
use peek_poke::{Peek, PeekCopy, Poke}; use peek_poke::{Peek, PeekCopy, Poke};
@ -1166,11 +1166,11 @@ pub mod render_ffi {
}; };
use crate::{ use crate::{
id, id,
BufferAddress,
Color, Color,
DynamicOffset, DynamicOffset,
RawString, RawString,
}; };
use wgt::BufferAddress;
use std::{convert::TryInto, slice}; use std::{convert::TryInto, slice};
/// # Safety /// # Safety

View File

@ -7,12 +7,12 @@ use crate::{
device::{all_buffer_stages, all_image_stages}, device::{all_buffer_stages, all_image_stages},
hub::{GfxBackend, Global, Token}, hub::{GfxBackend, Global, Token},
id::{BufferId, CommandEncoderId, TextureId}, id::{BufferId, CommandEncoderId, TextureId},
resource::{BufferUsage, TextureUsage}, resource::TextureUsage,
BufferAddress,
Extent3d, Extent3d,
Origin3d, Origin3d,
}; };
use wgt::{BufferAddress, BufferUsage};
use hal::command::CommandBuffer as _; use hal::command::CommandBuffer as _;
use std::iter; use std::iter;

View File

@ -2,12 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use crate::{binding_model, command, pipeline, resource, Color, Extent3d, Features, Origin3d}; use crate::{binding_model, command, resource, Color, Extent3d, Features, Origin3d};
use wgt::{BlendDescriptor, BlendFactor, ColorStateDescriptor, ColorWrite, CompareFunction, CullMode, DepthStencilStateDescriptor, FrontFace, IndexFormat, PrimitiveTopology, StencilOperation, StencilStateFaceDescriptor, TextureFormat, RasterizationStateDescriptor, VertexFormat};
pub fn map_buffer_usage( pub fn map_buffer_usage(
usage: resource::BufferUsage, usage: wgt::BufferUsage,
) -> (hal::buffer::Usage, hal::memory::Properties) { ) -> (hal::buffer::Usage, hal::memory::Properties) {
use crate::resource::BufferUsage as W; use wgt::BufferUsage as W;
use hal::buffer::Usage as U; use hal::buffer::Usage as U;
use hal::memory::Properties as P; use hal::memory::Properties as P;
@ -104,9 +105,9 @@ pub fn map_binding_type(
} }
pub fn map_shader_stage_flags( pub fn map_shader_stage_flags(
shader_stage_flags: binding_model::ShaderStage, shader_stage_flags: wgt::ShaderStage,
) -> hal::pso::ShaderStageFlags { ) -> hal::pso::ShaderStageFlags {
use crate::binding_model::ShaderStage as Ss; use wgt::ShaderStage as Ss;
use hal::pso::ShaderStageFlags as H; use hal::pso::ShaderStageFlags as H;
let mut value = H::empty(); let mut value = H::empty();
@ -139,9 +140,9 @@ pub fn map_extent(extent: Extent3d) -> hal::image::Extent {
} }
pub fn map_primitive_topology( pub fn map_primitive_topology(
primitive_topology: pipeline::PrimitiveTopology, primitive_topology: PrimitiveTopology,
) -> hal::pso::Primitive { ) -> hal::pso::Primitive {
use crate::pipeline::PrimitiveTopology as Pt; use wgt::PrimitiveTopology as Pt;
use hal::pso::Primitive as H; use hal::pso::Primitive as H;
match primitive_topology { match primitive_topology {
Pt::PointList => H::PointList, Pt::PointList => H::PointList,
@ -153,11 +154,11 @@ pub fn map_primitive_topology(
} }
pub fn map_color_state_descriptor( pub fn map_color_state_descriptor(
desc: &pipeline::ColorStateDescriptor, desc: &ColorStateDescriptor,
) -> hal::pso::ColorBlendDesc { ) -> hal::pso::ColorBlendDesc {
let color_mask = desc.write_mask; let color_mask = desc.write_mask;
let blend_state = if desc.color_blend != pipeline::BlendDescriptor::REPLACE let blend_state = if desc.color_blend != BlendDescriptor::REPLACE
|| desc.alpha_blend != pipeline::BlendDescriptor::REPLACE || desc.alpha_blend != BlendDescriptor::REPLACE
{ {
Some(hal::pso::BlendState { Some(hal::pso::BlendState {
color: map_blend_descriptor(&desc.color_blend), color: map_blend_descriptor(&desc.color_blend),
@ -172,8 +173,8 @@ pub fn map_color_state_descriptor(
} }
} }
fn map_color_write_flags(flags: pipeline::ColorWrite) -> hal::pso::ColorMask { fn map_color_write_flags(flags: ColorWrite) -> hal::pso::ColorMask {
use crate::pipeline::ColorWrite as Cw; use wgt::ColorWrite as Cw;
use hal::pso::ColorMask as H; use hal::pso::ColorMask as H;
let mut value = H::empty(); let mut value = H::empty();
@ -192,8 +193,8 @@ fn map_color_write_flags(flags: pipeline::ColorWrite) -> hal::pso::ColorMask {
value value
} }
fn map_blend_descriptor(blend_desc: &pipeline::BlendDescriptor) -> hal::pso::BlendOp { fn map_blend_descriptor(blend_desc: &BlendDescriptor) -> hal::pso::BlendOp {
use crate::pipeline::BlendOperation as Bo; use wgt::BlendOperation as Bo;
use hal::pso::BlendOp as H; use hal::pso::BlendOp as H;
match blend_desc.operation { match blend_desc.operation {
Bo::Add => H::Add { Bo::Add => H::Add {
@ -213,8 +214,8 @@ fn map_blend_descriptor(blend_desc: &pipeline::BlendDescriptor) -> hal::pso::Ble
} }
} }
fn map_blend_factor(blend_factor: pipeline::BlendFactor) -> hal::pso::Factor { fn map_blend_factor(blend_factor: BlendFactor) -> hal::pso::Factor {
use crate::pipeline::BlendFactor as Bf; use wgt::BlendFactor as Bf;
use hal::pso::Factor as H; use hal::pso::Factor as H;
match blend_factor { match blend_factor {
Bf::Zero => H::Zero, Bf::Zero => H::Zero,
@ -234,11 +235,11 @@ fn map_blend_factor(blend_factor: pipeline::BlendFactor) -> hal::pso::Factor {
} }
pub fn map_depth_stencil_state_descriptor( pub fn map_depth_stencil_state_descriptor(
desc: &pipeline::DepthStencilStateDescriptor, desc: &DepthStencilStateDescriptor,
) -> hal::pso::DepthStencilDesc { ) -> hal::pso::DepthStencilDesc {
hal::pso::DepthStencilDesc { hal::pso::DepthStencilDesc {
depth: if desc.depth_write_enabled depth: if desc.depth_write_enabled
|| desc.depth_compare != resource::CompareFunction::Always || desc.depth_compare != CompareFunction::Always
{ {
Some(hal::pso::DepthTest { Some(hal::pso::DepthTest {
fun: map_compare_function(desc.depth_compare), fun: map_compare_function(desc.depth_compare),
@ -250,8 +251,8 @@ pub fn map_depth_stencil_state_descriptor(
depth_bounds: false, // TODO depth_bounds: false, // TODO
stencil: if desc.stencil_read_mask != !0 stencil: if desc.stencil_read_mask != !0
|| desc.stencil_write_mask != !0 || desc.stencil_write_mask != !0
|| desc.stencil_front != pipeline::StencilStateFaceDescriptor::IGNORE || desc.stencil_front != StencilStateFaceDescriptor::IGNORE
|| desc.stencil_back != pipeline::StencilStateFaceDescriptor::IGNORE || desc.stencil_back != StencilStateFaceDescriptor::IGNORE
{ {
Some(hal::pso::StencilTest { Some(hal::pso::StencilTest {
faces: hal::pso::Sided { faces: hal::pso::Sided {
@ -273,7 +274,7 @@ pub fn map_depth_stencil_state_descriptor(
} }
fn map_stencil_face( fn map_stencil_face(
stencil_state_face_desc: &pipeline::StencilStateFaceDescriptor, stencil_state_face_desc: &StencilStateFaceDescriptor,
) -> hal::pso::StencilFace { ) -> hal::pso::StencilFace {
hal::pso::StencilFace { hal::pso::StencilFace {
fun: map_compare_function(stencil_state_face_desc.compare), fun: map_compare_function(stencil_state_face_desc.compare),
@ -283,8 +284,8 @@ fn map_stencil_face(
} }
} }
pub fn map_compare_function(compare_function: resource::CompareFunction) -> hal::pso::Comparison { pub fn map_compare_function(compare_function: CompareFunction) -> hal::pso::Comparison {
use crate::resource::CompareFunction as Cf; use wgt::CompareFunction as Cf;
use hal::pso::Comparison as H; use hal::pso::Comparison as H;
match compare_function { match compare_function {
Cf::Never => H::Never, Cf::Never => H::Never,
@ -298,8 +299,8 @@ pub fn map_compare_function(compare_function: resource::CompareFunction) -> hal:
} }
} }
fn map_stencil_operation(stencil_operation: pipeline::StencilOperation) -> hal::pso::StencilOp { fn map_stencil_operation(stencil_operation: StencilOperation) -> hal::pso::StencilOp {
use crate::pipeline::StencilOperation as So; use wgt::StencilOperation as So;
use hal::pso::StencilOp as H; use hal::pso::StencilOp as H;
match stencil_operation { match stencil_operation {
So::Keep => H::Keep, So::Keep => H::Keep,
@ -314,10 +315,10 @@ fn map_stencil_operation(stencil_operation: pipeline::StencilOperation) -> hal::
} }
pub(crate) fn map_texture_format( pub(crate) fn map_texture_format(
texture_format: resource::TextureFormat, texture_format: TextureFormat,
features: Features, features: Features,
) -> hal::format::Format { ) -> hal::format::Format {
use crate::resource::TextureFormat as Tf; use wgt::TextureFormat as Tf;
use hal::format::Format as H; use hal::format::Format as H;
match texture_format { match texture_format {
// Normal 8 bit formats // Normal 8 bit formats
@ -393,8 +394,8 @@ pub(crate) fn map_texture_format(
} }
} }
pub fn map_vertex_format(vertex_format: pipeline::VertexFormat) -> hal::format::Format { pub fn map_vertex_format(vertex_format: VertexFormat) -> hal::format::Format {
use crate::pipeline::VertexFormat as Vf; use wgt::VertexFormat as Vf;
use hal::format::Format as H; use hal::format::Format as H;
match vertex_format { match vertex_format {
Vf::Uchar2 => H::Rg8Uint, Vf::Uchar2 => H::Rg8Uint,
@ -482,9 +483,9 @@ pub fn map_texture_dimension_size(
} }
pub fn map_texture_view_dimension( pub fn map_texture_view_dimension(
dimension: resource::TextureViewDimension, dimension: wgt::TextureViewDimension,
) -> hal::image::ViewKind { ) -> hal::image::ViewKind {
use crate::resource::TextureViewDimension::*; use wgt::TextureViewDimension::*;
use hal::image::ViewKind as H; use hal::image::ViewKind as H;
match dimension { match dimension {
D1 => H::D1, D1 => H::D1,
@ -496,8 +497,8 @@ pub fn map_texture_view_dimension(
} }
} }
pub fn map_buffer_state(usage: resource::BufferUsage) -> hal::buffer::State { pub fn map_buffer_state(usage: wgt::BufferUsage) -> hal::buffer::State {
use crate::resource::BufferUsage as W; use wgt::BufferUsage as W;
use hal::buffer::Access as A; use hal::buffer::Access as A;
let mut access = A::empty(); let mut access = A::empty();
@ -628,19 +629,19 @@ pub fn map_wrap(address: resource::AddressMode) -> hal::image::WrapMode {
} }
pub fn map_rasterization_state_descriptor( pub fn map_rasterization_state_descriptor(
desc: &pipeline::RasterizationStateDescriptor, desc: &RasterizationStateDescriptor,
) -> hal::pso::Rasterizer { ) -> hal::pso::Rasterizer {
hal::pso::Rasterizer { hal::pso::Rasterizer {
depth_clamping: false, depth_clamping: false,
polygon_mode: hal::pso::PolygonMode::Fill, polygon_mode: hal::pso::PolygonMode::Fill,
cull_face: match desc.cull_mode { cull_face: match desc.cull_mode {
pipeline::CullMode::None => hal::pso::Face::empty(), CullMode::None => hal::pso::Face::empty(),
pipeline::CullMode::Front => hal::pso::Face::FRONT, CullMode::Front => hal::pso::Face::FRONT,
pipeline::CullMode::Back => hal::pso::Face::BACK, CullMode::Back => hal::pso::Face::BACK,
}, },
front_face: match desc.front_face { front_face: match desc.front_face {
pipeline::FrontFace::Ccw => hal::pso::FrontFace::CounterClockwise, FrontFace::Ccw => hal::pso::FrontFace::CounterClockwise,
pipeline::FrontFace::Cw => hal::pso::FrontFace::Clockwise, FrontFace::Cw => hal::pso::FrontFace::Clockwise,
}, },
depth_bias: if desc.depth_bias != 0 depth_bias: if desc.depth_bias != 0
|| desc.depth_bias_slope_scale != 0.0 || desc.depth_bias_slope_scale != 0.0
@ -658,9 +659,9 @@ pub fn map_rasterization_state_descriptor(
} }
} }
pub fn map_index_format(index_format: pipeline::IndexFormat) -> hal::IndexType { pub fn map_index_format(index_format: IndexFormat) -> hal::IndexType {
match index_format { match index_format {
pipeline::IndexFormat::Uint16 => hal::IndexType::U16, IndexFormat::Uint16 => hal::IndexType::U16,
pipeline::IndexFormat::Uint32 => hal::IndexType::U32, IndexFormat::Uint32 => hal::IndexType::U32,
} }
} }

View File

@ -12,13 +12,13 @@ use crate::{
resource, resource,
swap_chain, swap_chain,
track::{BufferState, TextureState, TrackerSet}, track::{BufferState, TextureState, TrackerSet},
BufferAddress,
FastHashMap, FastHashMap,
Features, Features,
LifeGuard, LifeGuard,
Stored, Stored,
}; };
use wgt::{BufferAddress, CompareFunction, InputStepMode, TextureFormat};
use arrayvec::ArrayVec; use arrayvec::ArrayVec;
use copyless::VecHelper as _; use copyless::VecHelper as _;
use hal::{ use hal::{
@ -105,7 +105,7 @@ impl RenderPassContext {
pub(crate) type RenderPassKey = AttachmentData<hal::pass::Attachment>; pub(crate) type RenderPassKey = AttachmentData<hal::pass::Attachment>;
pub(crate) type FramebufferKey = AttachmentData<id::TextureViewId>; pub(crate) type FramebufferKey = AttachmentData<id::TextureViewId>;
pub(crate) type RenderPassContext = AttachmentData<resource::TextureFormat>; pub(crate) type RenderPassContext = AttachmentData<TextureFormat>;
type BufferMapResult = Result<*mut u8, hal::device::MapError>; type BufferMapResult = Result<*mut u8, hal::device::MapError>;
type BufferMapPendingCallback = (resource::BufferMapOperation, BufferMapResult); type BufferMapPendingCallback = (resource::BufferMapOperation, BufferMapResult);
@ -300,14 +300,14 @@ impl<B: GfxBackend> Device<B> {
fn create_buffer( fn create_buffer(
&self, &self,
self_id: id::DeviceId, self_id: id::DeviceId,
desc: &resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
) -> resource::Buffer<B> { ) -> resource::Buffer<B> {
debug_assert_eq!(self_id.backend(), B::VARIANT); debug_assert_eq!(self_id.backend(), B::VARIANT);
let (usage, _memory_properties) = conv::map_buffer_usage(desc.usage); let (usage, _memory_properties) = conv::map_buffer_usage(desc.usage);
let rendy_usage = { let rendy_usage = {
use rendy_memory::MemoryUsageValue as Muv; use rendy_memory::MemoryUsageValue as Muv;
use resource::BufferUsage as Bu; use wgt::BufferUsage as Bu;
if !desc.usage.intersects(Bu::MAP_READ | Bu::MAP_WRITE) { if !desc.usage.intersects(Bu::MAP_READ | Bu::MAP_WRITE) {
Muv::Data Muv::Data
@ -365,7 +365,7 @@ impl<B: GfxBackend> Device<B> {
// Ensure `D24Plus` textures cannot be copied // Ensure `D24Plus` textures cannot be copied
match desc.format { match desc.format {
resource::TextureFormat::Depth24Plus | resource::TextureFormat::Depth24PlusStencil8 => { TextureFormat::Depth24Plus | TextureFormat::Depth24PlusStencil8 => {
assert!(!desc.usage.intersects( assert!(!desc.usage.intersects(
resource::TextureUsage::COPY_SRC | resource::TextureUsage::COPY_DST resource::TextureUsage::COPY_SRC | resource::TextureUsage::COPY_DST
)); ));
@ -493,7 +493,7 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
pub fn device_create_buffer<B: GfxBackend>( pub fn device_create_buffer<B: GfxBackend>(
&self, &self,
device_id: id::DeviceId, device_id: id::DeviceId,
desc: &resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
id_in: F::Input, id_in: F::Input,
) -> id::BufferId { ) -> id::BufferId {
let hub = B::hub(self); let hub = B::hub(self);
@ -514,7 +514,7 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
.init( .init(
id, id,
ref_count, ref_count,
BufferState::with_usage(resource::BufferUsage::empty()), BufferState::with_usage(wgt::BufferUsage::empty()),
) )
.unwrap(); .unwrap();
id id
@ -523,13 +523,13 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
pub fn device_create_buffer_mapped<B: GfxBackend>( pub fn device_create_buffer_mapped<B: GfxBackend>(
&self, &self,
device_id: id::DeviceId, device_id: id::DeviceId,
desc: &resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
id_in: F::Input, id_in: F::Input,
) -> (id::BufferId, *mut u8) { ) -> (id::BufferId, *mut u8) {
let hub = B::hub(self); let hub = B::hub(self);
let mut token = Token::root(); let mut token = Token::root();
let mut desc = desc.clone(); let mut desc = desc.clone();
desc.usage |= resource::BufferUsage::MAP_WRITE; desc.usage |= wgt::BufferUsage::MAP_WRITE;
let (device_guard, mut token) = hub.devices.read(&mut token); let (device_guard, mut token) = hub.devices.read(&mut token);
let device = &device_guard[device_id]; let device = &device_guard[device_id];
@ -550,7 +550,7 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
.buffers.init( .buffers.init(
id, id,
ref_count, ref_count,
BufferState::with_usage(resource::BufferUsage::MAP_WRITE), BufferState::with_usage(wgt::BufferUsage::MAP_WRITE),
) )
.unwrap(); .unwrap();
@ -571,7 +571,7 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
let (mut buffer_guard, _) = hub.buffers.write(&mut token); let (mut buffer_guard, _) = hub.buffers.write(&mut token);
let device = &device_guard[device_id]; let device = &device_guard[device_id];
let mut buffer = &mut buffer_guard[buffer_id]; let mut buffer = &mut buffer_guard[buffer_id];
assert!(buffer.usage.contains(resource::BufferUsage::MAP_WRITE)); assert!(buffer.usage.contains(wgt::BufferUsage::MAP_WRITE));
//assert!(buffer isn't used by the GPU); //assert!(buffer isn't used by the GPU);
match map_buffer( match map_buffer(
@ -606,7 +606,7 @@ impl<F: IdentityFilter<id::BufferId>> Global<F> {
let (mut buffer_guard, _) = hub.buffers.write(&mut token); let (mut buffer_guard, _) = hub.buffers.write(&mut token);
let device = &device_guard[device_id]; let device = &device_guard[device_id];
let mut buffer = &mut buffer_guard[buffer_id]; let mut buffer = &mut buffer_guard[buffer_id];
assert!(buffer.usage.contains(resource::BufferUsage::MAP_READ)); assert!(buffer.usage.contains(wgt::BufferUsage::MAP_READ));
//assert!(buffer isn't used by the GPU); //assert!(buffer isn't used by the GPU);
match map_buffer( match map_buffer(
@ -825,7 +825,7 @@ impl<F: IdentityFilter<id::SamplerId>> Global<F> {
), ),
lod_bias: hal::image::Lod(0.0), lod_bias: hal::image::Lod(0.0),
lod_range: hal::image::Lod(desc.lod_min_clamp) .. hal::image::Lod(desc.lod_max_clamp), lod_range: hal::image::Lod(desc.lod_min_clamp) .. hal::image::Lod(desc.lod_max_clamp),
comparison: if desc.compare_function == resource::CompareFunction::Always { comparison: if desc.compare_function == CompareFunction::Always {
None None
} else { } else {
Some(conv::map_compare_function(desc.compare_function)) Some(conv::map_compare_function(desc.compare_function))
@ -1039,13 +1039,13 @@ impl<F: IdentityFilter<id::BindGroupId>> Global<F> {
binding_model::BindingResource::Buffer(ref bb) => { binding_model::BindingResource::Buffer(ref bb) => {
let (alignment, usage) = match decl.ty { let (alignment, usage) = match decl.ty {
binding_model::BindingType::UniformBuffer => { binding_model::BindingType::UniformBuffer => {
(BIND_BUFFER_ALIGNMENT, resource::BufferUsage::UNIFORM) (BIND_BUFFER_ALIGNMENT, wgt::BufferUsage::UNIFORM)
} }
binding_model::BindingType::StorageBuffer => { binding_model::BindingType::StorageBuffer => {
(BIND_BUFFER_ALIGNMENT, resource::BufferUsage::STORAGE) (BIND_BUFFER_ALIGNMENT, wgt::BufferUsage::STORAGE)
} }
binding_model::BindingType::ReadonlyStorageBuffer => { binding_model::BindingType::ReadonlyStorageBuffer => {
(BIND_BUFFER_ALIGNMENT, resource::BufferUsage::STORAGE_READ) (BIND_BUFFER_ALIGNMENT, wgt::BufferUsage::STORAGE_READ)
} }
binding_model::BindingType::Sampler binding_model::BindingType::Sampler
| binding_model::BindingType::SampledTexture | binding_model::BindingType::SampledTexture
@ -1527,8 +1527,8 @@ impl<F: IdentityFilter<id::RenderPipelineId>> Global<F> {
binding: i as u32, binding: i as u32,
stride: vb_state.stride as u32, stride: vb_state.stride as u32,
rate: match vb_state.step_mode { rate: match vb_state.step_mode {
pipeline::InputStepMode::Vertex => hal::pso::VertexInputRate::Vertex, InputStepMode::Vertex => hal::pso::VertexInputRate::Vertex,
pipeline::InputStepMode::Instance => hal::pso::VertexInputRate::Instance(1), InputStepMode::Instance => hal::pso::VertexInputRate::Instance(1),
}, },
}); });
let desc_atts = let desc_atts =
@ -1969,7 +1969,7 @@ impl<F> Global<F> {
pub fn buffer_map_async<B: GfxBackend>( pub fn buffer_map_async<B: GfxBackend>(
&self, &self,
buffer_id: id::BufferId, buffer_id: id::BufferId,
usage: resource::BufferUsage, usage: wgt::BufferUsage,
range: std::ops::Range<BufferAddress>, range: std::ops::Range<BufferAddress>,
operation: resource::BufferMapOperation, operation: resource::BufferMapOperation,
) { ) {
@ -1981,12 +1981,12 @@ impl<F> Global<F> {
let (mut buffer_guard, _) = hub.buffers.write(&mut token); let (mut buffer_guard, _) = hub.buffers.write(&mut token);
let buffer = &mut buffer_guard[buffer_id]; let buffer = &mut buffer_guard[buffer_id];
if usage.contains(resource::BufferUsage::MAP_READ) { if usage.contains(wgt::BufferUsage::MAP_READ) {
assert!(buffer.usage.contains(resource::BufferUsage::MAP_READ)); assert!(buffer.usage.contains(wgt::BufferUsage::MAP_READ));
} }
if usage.contains(resource::BufferUsage::MAP_WRITE) { if usage.contains(wgt::BufferUsage::MAP_WRITE) {
assert!(buffer.usage.contains(resource::BufferUsage::MAP_WRITE)); assert!(buffer.usage.contains(wgt::BufferUsage::MAP_WRITE));
} }
if buffer.pending_mapping.is_some() { if buffer.pending_mapping.is_some() {

View File

@ -29,11 +29,11 @@ use crate::{
pipeline::{ComputePipeline, RenderPipeline}, pipeline::{ComputePipeline, RenderPipeline},
resource::{Buffer, Sampler, Texture, TextureView}, resource::{Buffer, Sampler, Texture, TextureView},
swap_chain::SwapChain, swap_chain::SwapChain,
Backend,
Epoch, Epoch,
Index, Index,
}; };
use wgt::Backend;
use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard}; use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
use vec_map::VecMap; use vec_map::VecMap;

View File

@ -2,9 +2,10 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use crate::{Backend, Epoch, Index}; use crate::{Epoch, Index};
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use wgt::Backend;
use std::{fmt, marker::PhantomData, mem}; use std::{fmt, marker::PhantomData, mem};
const BACKEND_BITS: usize = 3; const BACKEND_BITS: usize = 3;

View File

@ -4,14 +4,14 @@
use crate::{ use crate::{
backend, backend,
binding_model::MAX_BIND_GROUPS,
device::{Device, BIND_BUFFER_ALIGNMENT}, device::{Device, BIND_BUFFER_ALIGNMENT},
hub::{GfxBackend, Global, IdentityFilter, Token}, hub::{GfxBackend, Global, IdentityFilter, Token},
id::{AdapterId, DeviceId}, id::{AdapterId, DeviceId},
power, power,
Backend,
}; };
use wgt::{Backend, BackendBit, DeviceDescriptor, PowerPreference, RequestAdapterOptions};
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -101,82 +101,6 @@ pub struct Adapter<B: hal::Backend> {
pub(crate) raw: hal::adapter::Adapter<B>, pub(crate) raw: hal::adapter::Adapter<B>,
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PowerPreference {
Default = 0,
LowPower = 1,
HighPerformance = 2,
}
#[repr(C)]
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RequestAdapterOptions {
pub power_preference: PowerPreference,
}
impl Default for RequestAdapterOptions {
fn default() -> Self {
RequestAdapterOptions {
power_preference: PowerPreference::Default,
}
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Extensions {
pub anisotropic_filtering: bool,
}
#[repr(C)]
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Limits {
pub max_bind_groups: u32,
}
impl Default for Limits {
fn default() -> Self {
Limits {
max_bind_groups: MAX_BIND_GROUPS as u32,
}
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct DeviceDescriptor {
pub extensions: Extensions,
pub limits: Limits,
}
bitflags::bitflags! {
#[repr(transparent)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BackendBit: u32 {
const VULKAN = 1 << Backend::Vulkan as u32;
const GL = 1 << Backend::Gl as u32;
const METAL = 1 << Backend::Metal as u32;
const DX12 = 1 << Backend::Dx12 as u32;
const DX11 = 1 << Backend::Dx11 as u32;
/// Vulkan + METAL + DX12
const PRIMARY = Self::VULKAN.bits | Self::METAL.bits | Self::DX12.bits;
/// OpenGL + DX11
const SECONDARY = Self::GL.bits | Self::DX11.bits;
}
}
impl From<Backend> for BackendBit {
fn from(backend: Backend) -> Self {
BackendBit::from_bits(1 << backend as u32).unwrap()
}
}
/// Metadata about a backend adapter. /// Metadata about a backend adapter.
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

View File

@ -30,9 +30,6 @@ pub mod resource;
pub mod swap_chain; pub mod swap_chain;
pub mod track; pub mod track;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub use hal::pso::read_spirv; pub use hal::pso::read_spirv;
use peek_poke::{PeekCopy, Poke}; use peek_poke::{PeekCopy, Poke};
@ -46,19 +43,6 @@ type SubmissionIndex = usize;
type Index = u32; type Index = u32;
type Epoch = u32; type Epoch = u32;
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Backend {
Empty = 0,
Vulkan = 1,
Metal = 2,
Dx12 = 3,
Dx11 = 4,
Gl = 5,
}
pub type BufferAddress = u64;
pub type DynamicOffset = u32; pub type DynamicOffset = u32;
pub type RawString = *const c_char; pub type RawString = *const c_char;
@ -222,13 +206,13 @@ macro_rules! gfx_select {
($id:expr => $global:ident.$method:ident( $($param:expr),+ )) => { ($id:expr => $global:ident.$method:ident( $($param:expr),+ )) => {
match $id.backend() { match $id.backend() {
#[cfg(any(not(any(target_os = "ios", target_os = "macos")), feature = "gfx-backend-vulkan"))] #[cfg(any(not(any(target_os = "ios", target_os = "macos")), feature = "gfx-backend-vulkan"))]
$crate::Backend::Vulkan => $global.$method::<$crate::backend::Vulkan>( $($param),+ ), wgt::Backend::Vulkan => $global.$method::<$crate::backend::Vulkan>( $($param),+ ),
#[cfg(any(target_os = "ios", target_os = "macos"))] #[cfg(any(target_os = "ios", target_os = "macos"))]
$crate::Backend::Metal => $global.$method::<$crate::backend::Metal>( $($param),+ ), wgt::Backend::Metal => $global.$method::<$crate::backend::Metal>( $($param),+ ),
#[cfg(windows)] #[cfg(windows)]
$crate::Backend::Dx12 => $global.$method::<$crate::backend::Dx12>( $($param),+ ), wgt::Backend::Dx12 => $global.$method::<$crate::backend::Dx12>( $($param),+ ),
#[cfg(windows)] #[cfg(windows)]
$crate::Backend::Dx11 => $global.$method::<$crate::backend::Dx11>( $($param),+ ), wgt::Backend::Dx11 => $global.$method::<$crate::backend::Dx11>( $($param),+ ),
_ => unreachable!() _ => unreachable!()
} }
}; };

View File

@ -5,224 +5,10 @@
use crate::{ use crate::{
device::RenderPassContext, device::RenderPassContext,
id::{PipelineLayoutId, ShaderModuleId}, id::{PipelineLayoutId, ShaderModuleId},
resource,
BufferAddress,
RawString, RawString,
U32Array, U32Array
}; };
use wgt::{BufferAddress, ColorStateDescriptor, DepthStencilStateDescriptor, IndexFormat, InputStepMode, PrimitiveTopology, RasterizationStateDescriptor, VertexAttributeDescriptor};
pub type ShaderLocation = u32;
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum BlendFactor {
Zero = 0,
One = 1,
SrcColor = 2,
OneMinusSrcColor = 3,
SrcAlpha = 4,
OneMinusSrcAlpha = 5,
DstColor = 6,
OneMinusDstColor = 7,
DstAlpha = 8,
OneMinusDstAlpha = 9,
SrcAlphaSaturated = 10,
BlendColor = 11,
OneMinusBlendColor = 12,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum BlendOperation {
Add = 0,
Subtract = 1,
ReverseSubtract = 2,
Min = 3,
Max = 4,
}
impl Default for BlendOperation {
fn default() -> Self {
BlendOperation::Add
}
}
bitflags::bitflags! {
#[repr(transparent)]
pub struct ColorWrite: u32 {
const RED = 1;
const GREEN = 2;
const BLUE = 4;
const ALPHA = 8;
const COLOR = 7;
const ALL = 15;
}
}
impl Default for ColorWrite {
fn default() -> Self {
ColorWrite::ALL
}
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq)]
pub struct BlendDescriptor {
pub src_factor: BlendFactor,
pub dst_factor: BlendFactor,
pub operation: BlendOperation,
}
impl BlendDescriptor {
pub const REPLACE: Self = BlendDescriptor {
src_factor: BlendFactor::One,
dst_factor: BlendFactor::Zero,
operation: BlendOperation::Add,
};
pub fn uses_color(&self) -> bool {
match (self.src_factor, self.dst_factor) {
(BlendFactor::BlendColor, _)
| (BlendFactor::OneMinusBlendColor, _)
| (_, BlendFactor::BlendColor)
| (_, BlendFactor::OneMinusBlendColor) => true,
(_, _) => false,
}
}
}
impl Default for BlendDescriptor {
fn default() -> Self {
BlendDescriptor::REPLACE
}
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct ColorStateDescriptor {
pub format: resource::TextureFormat,
pub alpha_blend: BlendDescriptor,
pub color_blend: BlendDescriptor,
pub write_mask: ColorWrite,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum StencilOperation {
Keep = 0,
Zero = 1,
Replace = 2,
Invert = 3,
IncrementClamp = 4,
DecrementClamp = 5,
IncrementWrap = 6,
DecrementWrap = 7,
}
impl Default for StencilOperation {
fn default() -> Self {
StencilOperation::Keep
}
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq)]
pub struct StencilStateFaceDescriptor {
pub compare: resource::CompareFunction,
pub fail_op: StencilOperation,
pub depth_fail_op: StencilOperation,
pub pass_op: StencilOperation,
}
impl StencilStateFaceDescriptor {
pub const IGNORE: Self = StencilStateFaceDescriptor {
compare: resource::CompareFunction::Always,
fail_op: StencilOperation::Keep,
depth_fail_op: StencilOperation::Keep,
pass_op: StencilOperation::Keep,
};
}
impl Default for StencilStateFaceDescriptor {
fn default() -> Self {
StencilStateFaceDescriptor::IGNORE
}
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct DepthStencilStateDescriptor {
pub format: resource::TextureFormat,
pub depth_write_enabled: bool,
pub depth_compare: resource::CompareFunction,
pub stencil_front: StencilStateFaceDescriptor,
pub stencil_back: StencilStateFaceDescriptor,
pub stencil_read_mask: u32,
pub stencil_write_mask: u32,
}
impl DepthStencilStateDescriptor {
pub fn needs_stencil_reference(&self) -> bool {
!self.stencil_front.compare.is_trivial() || !self.stencil_back.compare.is_trivial()
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum IndexFormat {
Uint16 = 0,
Uint32 = 1,
}
#[repr(C)]
#[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,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum InputStepMode {
Vertex = 0,
Instance = 1,
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct VertexAttributeDescriptor {
pub offset: BufferAddress,
pub format: VertexFormat,
pub shader_location: ShaderLocation,
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
@ -267,53 +53,6 @@ pub struct ComputePipeline<B: hal::Backend> {
pub(crate) layout_id: PipelineLayoutId, pub(crate) layout_id: PipelineLayoutId,
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum PrimitiveTopology {
PointList = 0,
LineList = 1,
LineStrip = 2,
TriangleList = 3,
TriangleStrip = 4,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum FrontFace {
Ccw = 0,
Cw = 1,
}
impl Default for FrontFace {
fn default() -> Self {
FrontFace::Ccw
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum CullMode {
None = 0,
Front = 1,
Back = 2,
}
impl Default for CullMode {
fn default() -> Self {
CullMode::None
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
pub struct RasterizationStateDescriptor {
pub front_face: FrontFace,
pub cull_mode: CullMode,
pub depth_bias: i32,
pub depth_bias_slope_scale: f32,
pub depth_bias_clamp: f32,
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
pub struct RenderPipelineDescriptor { pub struct RenderPipelineDescriptor {

View File

@ -5,13 +5,13 @@
use crate::{ use crate::{
id::{DeviceId, SwapChainId, TextureId}, id::{DeviceId, SwapChainId, TextureId},
track::DUMMY_SELECTOR, track::DUMMY_SELECTOR,
BufferAddress,
Extent3d, Extent3d,
LifeGuard, LifeGuard,
RefCount, RefCount,
Stored, Stored,
}; };
use wgt::{BufferAddress, BufferUsage, CompareFunction, TextureFormat};
use hal; use hal;
use rendy_memory::MemoryBlock; use rendy_memory::MemoryBlock;
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
@ -19,42 +19,6 @@ use serde::{Deserialize, Serialize};
use std::{borrow::Borrow, fmt}; use std::{borrow::Borrow, fmt};
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;
}
}
#[repr(C)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct BufferDescriptor {
pub size: BufferAddress,
pub usage: BufferUsage,
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
pub enum BufferMapAsyncStatus { pub enum BufferMapAsyncStatus {
@ -139,69 +103,6 @@ pub enum TextureDimension {
D3, D3,
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum TextureFormat {
// Normal 8 bit formats
R8Unorm = 0,
R8Snorm = 1,
R8Uint = 2,
R8Sint = 3,
// Normal 16 bit formats
R16Unorm = 4,
R16Snorm = 5,
R16Uint = 6,
R16Sint = 7,
R16Float = 8,
Rg8Unorm = 9,
Rg8Snorm = 10,
Rg8Uint = 11,
Rg8Sint = 12,
// Normal 32 bit formats
R32Uint = 13,
R32Sint = 14,
R32Float = 15,
Rg16Unorm = 16,
Rg16Snorm = 17,
Rg16Uint = 18,
Rg16Sint = 19,
Rg16Float = 20,
Rgba8Unorm = 21,
Rgba8UnormSrgb = 22,
Rgba8Snorm = 23,
Rgba8Uint = 24,
Rgba8Sint = 25,
Bgra8Unorm = 26,
Bgra8UnormSrgb = 27,
// Packed 32 bit formats
Rgb10a2Unorm = 28,
Rg11b10Float = 29,
// Normal 64 bit formats
Rg32Uint = 30,
Rg32Sint = 31,
Rg32Float = 32,
Rgba16Unorm = 33,
Rgba16Snorm = 34,
Rgba16Uint = 35,
Rgba16Sint = 36,
Rgba16Float = 37,
// Normal 128 bit formats
Rgba32Uint = 38,
Rgba32Sint = 39,
Rgba32Float = 40,
// Depth and stencil formats
Depth32Float = 41,
Depth24Plus = 42,
Depth24PlusStencil8 = 43,
}
bitflags::bitflags! { bitflags::bitflags! {
#[repr(transparent)] #[repr(transparent)]
pub struct TextureUsage: u32 { pub struct TextureUsage: u32 {
@ -273,23 +174,11 @@ impl Default for TextureAspect {
} }
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum TextureViewDimension {
D1,
D2,
D2Array,
Cube,
CubeArray,
D3,
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
pub struct TextureViewDescriptor { pub struct TextureViewDescriptor {
pub format: TextureFormat, pub format: TextureFormat,
pub dimension: TextureViewDimension, pub dimension: wgt::TextureViewDimension,
pub aspect: TextureAspect, pub aspect: TextureAspect,
pub base_mip_level: u32, pub base_mip_level: u32,
pub level_count: u32, pub level_count: u32,
@ -359,28 +248,6 @@ impl Default for FilterMode {
} }
} }
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum CompareFunction {
Never = 0,
Less = 1,
Equal = 2,
LessEqual = 3,
Greater = 4,
NotEqual = 5,
GreaterEqual = 6,
Always = 7,
}
impl CompareFunction {
pub fn is_trivial(self) -> bool {
match self {
CompareFunction::Never | CompareFunction::Always => true,
_ => false,
}
}
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
pub struct SamplerDescriptor { pub struct SamplerDescriptor {

View File

@ -43,6 +43,7 @@ use crate::{
Stored, Stored,
}; };
use wgt::TextureFormat;
use hal::{self, device::Device as _, queue::CommandQueue as _, window::PresentationSurface as _}; use hal::{self, device::Device as _, queue::CommandQueue as _, window::PresentationSurface as _};
@ -71,7 +72,7 @@ pub enum PresentMode {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct SwapChainDescriptor { pub struct SwapChainDescriptor {
pub usage: resource::TextureUsage, pub usage: resource::TextureUsage,
pub format: resource::TextureFormat, pub format: TextureFormat,
pub width: u32, pub width: u32,
pub height: u32, pub height: u32,
pub present_mode: PresentMode, pub present_mode: PresentMode,

View File

@ -3,7 +3,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use super::{PendingTransition, ResourceState, Unit}; use super::{PendingTransition, ResourceState, Unit};
use crate::{id::BufferId, resource::BufferUsage}; use crate::id::BufferId;
use wgt::BufferUsage;
//TODO: store `hal::buffer::State` here to avoid extra conversions //TODO: store `hal::buffer::State` here to avoid extra conversions
pub type BufferState = Unit<BufferUsage>; pub type BufferState = Unit<BufferUsage>;
@ -112,7 +114,7 @@ impl ResourceState for BufferState {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use crate::{id::TypedId, Backend}; use crate::{id::TypedId};
#[test] #[test]
fn change() { fn change() {
@ -120,7 +122,7 @@ mod test {
first: Some(BufferUsage::INDEX), first: Some(BufferUsage::INDEX),
last: BufferUsage::STORAGE, last: BufferUsage::STORAGE,
}; };
let id = TypedId::zip(0, 0, Backend::Empty); let id = TypedId::zip(0, 0, wgt::Backend::Empty);
assert!(bs.change(id, (), BufferUsage::VERTEX, None).is_err()); assert!(bs.change(id, (), BufferUsage::VERTEX, None).is_err());
bs.change(id, (), BufferUsage::VERTEX, Some(&mut Vec::new())) bs.change(id, (), BufferUsage::VERTEX, Some(&mut Vec::new()))
.unwrap(); .unwrap();

View File

@ -11,7 +11,6 @@ use crate::{
hub::Storage, hub::Storage,
id::{BindGroupId, SamplerId, TextureViewId, TypedId}, id::{BindGroupId, SamplerId, TextureViewId, TypedId},
resource, resource,
Backend,
Epoch, Epoch,
FastHashMap, FastHashMap,
Index, Index,
@ -173,7 +172,7 @@ pub struct ResourceTracker<S: ResourceState> {
/// Temporary storage for collecting transitions. /// Temporary storage for collecting transitions.
temp: Vec<PendingTransition<S>>, temp: Vec<PendingTransition<S>>,
/// The backend variant for all the tracked resources. /// The backend variant for all the tracked resources.
backend: Backend, backend: wgt::Backend,
} }
impl<S: ResourceState + fmt::Debug> fmt::Debug for ResourceTracker<S> { impl<S: ResourceState + fmt::Debug> fmt::Debug for ResourceTracker<S> {
@ -190,7 +189,7 @@ impl<S: ResourceState + fmt::Debug> fmt::Debug for ResourceTracker<S> {
impl<S: ResourceState> ResourceTracker<S> { impl<S: ResourceState> ResourceTracker<S> {
/// Create a new empty tracker. /// Create a new empty tracker.
pub fn new(backend: Backend) -> Self { pub fn new(backend: wgt::Backend) -> Self {
ResourceTracker { ResourceTracker {
map: FastHashMap::default(), map: FastHashMap::default(),
temp: Vec::new(), temp: Vec::new(),
@ -295,7 +294,7 @@ impl<S: ResourceState> ResourceTracker<S> {
/// Make sure that a resource is tracked, and return a mutable /// Make sure that a resource is tracked, and return a mutable
/// reference to it. /// reference to it.
fn get_or_insert<'a>( fn get_or_insert<'a>(
self_backend: Backend, self_backend: wgt::Backend,
map: &'a mut FastHashMap<Index, Resource<S>>, map: &'a mut FastHashMap<Index, Resource<S>>,
id: S::Id, id: S::Id,
ref_count: &RefCount, ref_count: &RefCount,
@ -472,7 +471,7 @@ pub struct TrackerSet {
impl TrackerSet { impl TrackerSet {
/// Create an empty set. /// Create an empty set.
pub fn new(backend: Backend) -> Self { pub fn new(backend: wgt::Backend) -> Self {
TrackerSet { TrackerSet {
buffers: ResourceTracker::new(backend), buffers: ResourceTracker::new(backend),
textures: ResourceTracker::new(backend), textures: ResourceTracker::new(backend),
@ -510,7 +509,7 @@ impl TrackerSet {
self.samplers.merge_extend(&other.samplers).unwrap(); self.samplers.merge_extend(&other.samplers).unwrap();
} }
pub fn backend(&self) -> Backend { pub fn backend(&self) -> wgt::Backend {
self.buffers.backend self.buffers.backend
} }
} }

View File

@ -25,6 +25,11 @@ path = "../wgpu-core"
package = "wgpu-core" package = "wgpu-core"
version = "0.1" version = "0.1"
[dependencies.wgt]
path = "../wgpu-types"
package = "wgpu-types"
version = "0.1"
[dependencies] [dependencies]
arrayvec = "0.5" arrayvec = "0.5"
lazy_static = "1.1" lazy_static = "1.1"

View File

@ -23,9 +23,9 @@ exclude = ["BufferMapResult"]
[parse] [parse]
parse_deps = true parse_deps = true
include = ["wgpu-core"] include = ["wgpu-core", "wgpu-types"]
extra_bindings = ["wgpu-core"] extra_bindings = ["wgpu-core", "wgpu-types"]
[fn] [fn]

View File

@ -25,10 +25,10 @@ pub extern "C" fn wgpu_command_encoder_finish(
pub extern "C" fn wgpu_command_encoder_copy_buffer_to_buffer( pub extern "C" fn wgpu_command_encoder_copy_buffer_to_buffer(
command_encoder_id: id::CommandEncoderId, command_encoder_id: id::CommandEncoderId,
source: id::BufferId, source: id::BufferId,
source_offset: core::BufferAddress, source_offset: wgt::BufferAddress,
destination: id::BufferId, destination: id::BufferId,
destination_offset: core::BufferAddress, destination_offset: wgt::BufferAddress,
size: core::BufferAddress, size: wgt::BufferAddress,
) { ) {
gfx_select!(command_encoder_id => GLOBAL.command_encoder_copy_buffer_to_buffer( gfx_select!(command_encoder_id => GLOBAL.command_encoder_copy_buffer_to_buffer(
command_encoder_id, command_encoder_id,

View File

@ -4,6 +4,7 @@
use crate::GLOBAL; use crate::GLOBAL;
use wgt::{BackendBit, DeviceDescriptor, Limits, RequestAdapterOptions};
use core::{gfx_select, hub::Token, id}; use core::{gfx_select, hub::Token, id};
use std::{marker::PhantomData, slice}; use std::{marker::PhantomData, slice};
@ -143,7 +144,7 @@ pub extern "C" fn wgpu_create_surface_from_windows_hwnd(
)) ))
} }
pub fn wgpu_enumerate_adapters(mask: core::instance::BackendBit) -> Vec<id::AdapterId> { pub fn wgpu_enumerate_adapters(mask: BackendBit) -> Vec<id::AdapterId> {
GLOBAL.enumerate_adapters(core::instance::AdapterInputs::Mask(mask, || PhantomData)) GLOBAL.enumerate_adapters(core::instance::AdapterInputs::Mask(mask, || PhantomData))
} }
@ -152,8 +153,8 @@ pub fn wgpu_enumerate_adapters(mask: core::instance::BackendBit) -> Vec<id::Adap
/// This function is unsafe as it calls an unsafe extern callback. /// This function is unsafe as it calls an unsafe extern callback.
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn wgpu_request_adapter_async( pub unsafe extern "C" fn wgpu_request_adapter_async(
desc: Option<&core::instance::RequestAdapterOptions>, desc: Option<&RequestAdapterOptions>,
mask: core::instance::BackendBit, mask: BackendBit,
callback: RequestAdapterCallback, callback: RequestAdapterCallback,
userdata: *mut std::ffi::c_void, userdata: *mut std::ffi::c_void,
) { ) {
@ -170,7 +171,7 @@ pub unsafe extern "C" fn wgpu_request_adapter_async(
#[no_mangle] #[no_mangle]
pub extern "C" fn wgpu_adapter_request_device( pub extern "C" fn wgpu_adapter_request_device(
adapter_id: id::AdapterId, adapter_id: id::AdapterId,
desc: Option<&core::instance::DeviceDescriptor>, desc: Option<&DeviceDescriptor>,
) -> id::DeviceId { ) -> id::DeviceId {
let desc = &desc.cloned().unwrap_or_default(); let desc = &desc.cloned().unwrap_or_default();
gfx_select!(adapter_id => GLOBAL.adapter_request_device(adapter_id, desc, PhantomData)) gfx_select!(adapter_id => GLOBAL.adapter_request_device(adapter_id, desc, PhantomData))
@ -188,15 +189,15 @@ pub extern "C" fn wgpu_adapter_destroy(adapter_id: id::AdapterId) {
#[no_mangle] #[no_mangle]
pub extern "C" fn wgpu_device_get_limits( pub extern "C" fn wgpu_device_get_limits(
_device_id: id::DeviceId, _device_id: id::DeviceId,
limits: &mut core::instance::Limits, limits: &mut Limits,
) { ) {
*limits = core::instance::Limits::default(); // TODO *limits = Limits::default(); // TODO
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn wgpu_device_create_buffer( pub extern "C" fn wgpu_device_create_buffer(
device_id: id::DeviceId, device_id: id::DeviceId,
desc: &core::resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
) -> id::BufferId { ) -> id::BufferId {
gfx_select!(device_id => GLOBAL.device_create_buffer(device_id, desc, PhantomData)) gfx_select!(device_id => GLOBAL.device_create_buffer(device_id, desc, PhantomData))
} }
@ -208,7 +209,7 @@ pub extern "C" fn wgpu_device_create_buffer(
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn wgpu_device_create_buffer_mapped( pub unsafe extern "C" fn wgpu_device_create_buffer_mapped(
device_id: id::DeviceId, device_id: id::DeviceId,
desc: &core::resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
mapped_ptr_out: *mut *mut u8, mapped_ptr_out: *mut *mut u8,
) -> id::BufferId { ) -> id::BufferId {
let (id, ptr) = gfx_select!(device_id => GLOBAL.device_create_buffer_mapped(device_id, desc, PhantomData)); let (id, ptr) = gfx_select!(device_id => GLOBAL.device_create_buffer_mapped(device_id, desc, PhantomData));
@ -374,8 +375,8 @@ pub extern "C" fn wgpu_device_destroy(device_id: id::DeviceId) {
#[no_mangle] #[no_mangle]
pub extern "C" fn wgpu_buffer_map_read_async( pub extern "C" fn wgpu_buffer_map_read_async(
buffer_id: id::BufferId, buffer_id: id::BufferId,
start: core::BufferAddress, start: wgt::BufferAddress,
size: core::BufferAddress, size: wgt::BufferAddress,
callback: core::device::BufferMapReadCallback, callback: core::device::BufferMapReadCallback,
userdata: *mut u8, userdata: *mut u8,
) { ) {
@ -384,14 +385,14 @@ pub extern "C" fn wgpu_buffer_map_read_async(
callback(status, data, userdata) callback(status, data, userdata)
}), }),
); );
gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, core::resource::BufferUsage::MAP_READ, start .. start + size, operation)) gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, wgt::BufferUsage::MAP_READ, start .. start + size, operation))
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn wgpu_buffer_map_write_async( pub extern "C" fn wgpu_buffer_map_write_async(
buffer_id: id::BufferId, buffer_id: id::BufferId,
start: core::BufferAddress, start: wgt::BufferAddress,
size: core::BufferAddress, size: wgt::BufferAddress,
callback: core::device::BufferMapWriteCallback, callback: core::device::BufferMapWriteCallback,
userdata: *mut u8, userdata: *mut u8,
) { ) {
@ -400,7 +401,7 @@ pub extern "C" fn wgpu_buffer_map_write_async(
callback(status, data, userdata) callback(status, data, userdata)
}), }),
); );
gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, core::resource::BufferUsage::MAP_WRITE, start .. start + size, operation)) gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, wgt::BufferUsage::MAP_WRITE, start .. start + size, operation))
} }
#[no_mangle] #[no_mangle]

View File

@ -19,6 +19,13 @@ default = []
path = "../wgpu-core" path = "../wgpu-core"
package = "wgpu-core" package = "wgpu-core"
version = "0.1" version = "0.1"
features = ["serde1"]
[dependencies.wgt]
path = "../wgpu-types"
package = "wgpu-types"
version = "0.1"
features = ["serde"]
[dependencies] [dependencies]
log = "0.4" log = "0.4"

View File

@ -24,9 +24,9 @@ exclude = ["BufferMapResult"]
[parse] [parse]
parse_deps = true parse_deps = true
include = ["wgpu-core"] include = ["wgpu-core", "wgpu-types"]
extra_bindings = ["wgpu-core"] extra_bindings = ["wgpu-core", "wgpu-types"]
[fn] [fn]
prefix = "WGPU_INLINE" prefix = "WGPU_INLINE"

View File

@ -5,9 +5,10 @@
use core::{ use core::{
hub::IdentityManager, hub::IdentityManager,
id, id,
Backend,
}; };
use wgt::Backend;
pub use core::command::{ pub use core::command::{
compute_ffi::*, compute_ffi::*,
render_ffi::*, render_ffi::*,

View File

@ -43,7 +43,7 @@ pub extern "C" fn wgpu_server_poll_all_devices(global: &Global, force_wait: bool
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn wgpu_server_instance_request_adapter( pub unsafe extern "C" fn wgpu_server_instance_request_adapter(
global: &Global, global: &Global,
desc: &core::instance::RequestAdapterOptions, desc: &wgt::RequestAdapterOptions,
ids: *const id::AdapterId, ids: *const id::AdapterId,
id_length: usize, id_length: usize,
) -> i8 { ) -> i8 {
@ -61,7 +61,7 @@ pub unsafe extern "C" fn wgpu_server_instance_request_adapter(
pub extern "C" fn wgpu_server_adapter_request_device( pub extern "C" fn wgpu_server_adapter_request_device(
global: &Global, global: &Global,
self_id: id::AdapterId, self_id: id::AdapterId,
desc: &core::instance::DeviceDescriptor, desc: &wgt::DeviceDescriptor,
new_id: id::DeviceId, new_id: id::DeviceId,
) { ) {
gfx_select!(self_id => global.adapter_request_device(self_id, desc, new_id)); gfx_select!(self_id => global.adapter_request_device(self_id, desc, new_id));
@ -84,7 +84,7 @@ pub extern "C" fn wgpu_server_device_destroy(global: &Global, self_id: id::Devic
pub extern "C" fn wgpu_server_device_create_buffer( pub extern "C" fn wgpu_server_device_create_buffer(
global: &Global, global: &Global,
self_id: id::DeviceId, self_id: id::DeviceId,
desc: &core::resource::BufferDescriptor, desc: &wgt::BufferDescriptor,
new_id: id::BufferId, new_id: id::BufferId,
) { ) {
gfx_select!(self_id => global.device_create_buffer(self_id, desc, new_id)); gfx_select!(self_id => global.device_create_buffer(self_id, desc, new_id));
@ -99,9 +99,9 @@ pub unsafe extern "C" fn wgpu_server_device_set_buffer_sub_data(
global: &Global, global: &Global,
self_id: id::DeviceId, self_id: id::DeviceId,
buffer_id: id::BufferId, buffer_id: id::BufferId,
offset: core::BufferAddress, offset: wgt::BufferAddress,
data: *const u8, data: *const u8,
size: core::BufferAddress, size: wgt::BufferAddress,
) { ) {
let slice = slice::from_raw_parts(data, size as usize); let slice = slice::from_raw_parts(data, size as usize);
gfx_select!(self_id => global.device_set_buffer_sub_data(self_id, buffer_id, offset, slice)); gfx_select!(self_id => global.device_set_buffer_sub_data(self_id, buffer_id, offset, slice));
@ -115,8 +115,8 @@ pub unsafe extern "C" fn wgpu_server_device_set_buffer_sub_data(
pub extern "C" fn wgpu_server_buffer_map_read( pub extern "C" fn wgpu_server_buffer_map_read(
global: &Global, global: &Global,
buffer_id: id::BufferId, buffer_id: id::BufferId,
start: core::BufferAddress, start: wgt::BufferAddress,
size: core::BufferAddress, size: wgt::BufferAddress,
callback: core::device::BufferMapReadCallback, callback: core::device::BufferMapReadCallback,
userdata: *mut u8, userdata: *mut u8,
) { ) {
@ -127,7 +127,7 @@ pub extern "C" fn wgpu_server_buffer_map_read(
); );
gfx_select!(buffer_id => global.buffer_map_async( gfx_select!(buffer_id => global.buffer_map_async(
buffer_id, buffer_id,
core::resource::BufferUsage::MAP_READ, wgt::BufferUsage::MAP_READ,
start .. start + size, start .. start + size,
operation operation
)); ));
@ -182,10 +182,10 @@ pub unsafe extern "C" fn wgpu_server_encoder_copy_buffer_to_buffer(
global: &Global, global: &Global,
self_id: id::CommandEncoderId, self_id: id::CommandEncoderId,
source_id: id::BufferId, source_id: id::BufferId,
source_offset: core::BufferAddress, source_offset: wgt::BufferAddress,
destination_id: id::BufferId, destination_id: id::BufferId,
destination_offset: core::BufferAddress, destination_offset: wgt::BufferAddress,
size: core::BufferAddress, size: wgt::BufferAddress,
) { ) {
gfx_select!(self_id => global.command_encoder_copy_buffer_to_buffer(self_id, source_id, source_offset, destination_id, destination_offset, size)); gfx_select!(self_id => global.command_encoder_copy_buffer_to_buffer(self_id, source_id, source_offset, destination_id, destination_offset, size));
} }

19
wgpu-types/Cargo.toml Normal file
View File

@ -0,0 +1,19 @@
[package]
name = "wgpu-types"
version = "0.1.0"
authors = [
"Dzmitry Malyshau <kvark@mozilla.com>",
"Joshua Groves <josh@joshgroves.com>",
]
edition = "2018"
description = "WebGPU types"
homepage = "https://github.com/gfx-rs/wgpu"
repository = "https://github.com/gfx-rs/wgpu"
keywords = ["graphics"]
license = "MPL-2.0"
[lib]
[dependencies]
bitflags = "1.0"
serde = { version = "1.0", features = ["serde_derive"], optional = true }

548
wgpu-types/src/lib.rs Normal file
View File

@ -0,0 +1,548 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::{io, slice};
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Backend {
Empty = 0,
Vulkan = 1,
Metal = 2,
Dx12 = 3,
Dx11 = 4,
Gl = 5,
BrowserWebGpu = 6,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PowerPreference {
Default = 0,
LowPower = 1,
HighPerformance = 2,
}
#[repr(C)]
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RequestAdapterOptions {
pub power_preference: PowerPreference,
}
impl Default for RequestAdapterOptions {
fn default() -> Self {
RequestAdapterOptions {
power_preference: PowerPreference::Default,
}
}
}
bitflags::bitflags! {
#[repr(transparent)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BackendBit: u32 {
const VULKAN = 1 << Backend::Vulkan as u32;
const GL = 1 << Backend::Gl as u32;
const METAL = 1 << Backend::Metal as u32;
const DX12 = 1 << Backend::Dx12 as u32;
const DX11 = 1 << Backend::Dx11 as u32;
const BROWSER_WEBGPU = 1 << Backend::BrowserWebGpu as u32;
/// Vulkan + Metal + DX12 + Browser WebGPU
const PRIMARY = Self::VULKAN.bits
| Self::METAL.bits
| Self::DX12.bits
| Self::BROWSER_WEBGPU.bits;
/// OpenGL + DX11
const SECONDARY = Self::GL.bits | Self::DX11.bits;
}
}
impl From<Backend> for BackendBit {
fn from(backend: Backend) -> Self {
BackendBit::from_bits(1 << backend as u32).unwrap()
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Extensions {
pub anisotropic_filtering: bool,
}
#[repr(C)]
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Limits {
pub max_bind_groups: u32,
}
pub const MAX_BIND_GROUPS: usize = 4;
impl Default for Limits {
fn default() -> Self {
Limits {
max_bind_groups: MAX_BIND_GROUPS as u32,
}
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct DeviceDescriptor {
pub extensions: Extensions,
pub limits: Limits,
}
// TODO: This is copy/pasted from gfx-hal, so we need to find a new place to put
// this function
pub fn read_spirv<R: io::Read + io::Seek>(mut x: R) -> io::Result<Vec<u32>> {
let size = x.seek(io::SeekFrom::End(0))?;
if size % 4 != 0 {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"input length not divisible by 4",
));
}
if size > usize::max_value() as u64 {
return Err(io::Error::new(io::ErrorKind::InvalidData, "input too long"));
}
let words = (size / 4) as usize;
let mut result = Vec::<u32>::with_capacity(words);
x.seek(io::SeekFrom::Start(0))?;
unsafe {
// Writing all bytes through a pointer with less strict alignment when our type has no
// invalid bitpatterns is safe.
x.read_exact(slice::from_raw_parts_mut(
result.as_mut_ptr() as *mut u8,
words * 4,
))?;
result.set_len(words);
}
const MAGIC_NUMBER: u32 = 0x07230203;
if result.len() > 0 && result[0] == MAGIC_NUMBER.swap_bytes() {
for word in &mut result {
*word = word.swap_bytes();
}
}
if result.len() == 0 || result[0] != MAGIC_NUMBER {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"input missing SPIR-V magic number",
));
}
Ok(result)
}
bitflags::bitflags! {
#[repr(transparent)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ShaderStage: u32 {
const NONE = 0;
const VERTEX = 1;
const FRAGMENT = 2;
const COMPUTE = 4;
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum TextureViewDimension {
D1,
D2,
D2Array,
Cube,
CubeArray,
D3,
}
pub type BufferAddress = u64;
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum BlendFactor {
Zero = 0,
One = 1,
SrcColor = 2,
OneMinusSrcColor = 3,
SrcAlpha = 4,
OneMinusSrcAlpha = 5,
DstColor = 6,
OneMinusDstColor = 7,
DstAlpha = 8,
OneMinusDstAlpha = 9,
SrcAlphaSaturated = 10,
BlendColor = 11,
OneMinusBlendColor = 12,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum BlendOperation {
Add = 0,
Subtract = 1,
ReverseSubtract = 2,
Min = 3,
Max = 4,
}
impl Default for BlendOperation {
fn default() -> Self {
BlendOperation::Add
}
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq)]
pub struct BlendDescriptor {
pub src_factor: BlendFactor,
pub dst_factor: BlendFactor,
pub operation: BlendOperation,
}
impl BlendDescriptor {
pub const REPLACE: Self = BlendDescriptor {
src_factor: BlendFactor::One,
dst_factor: BlendFactor::Zero,
operation: BlendOperation::Add,
};
pub fn uses_color(&self) -> bool {
match (self.src_factor, self.dst_factor) {
(BlendFactor::BlendColor, _)
| (BlendFactor::OneMinusBlendColor, _)
| (_, BlendFactor::BlendColor)
| (_, BlendFactor::OneMinusBlendColor) => true,
(_, _) => false,
}
}
}
impl Default for BlendDescriptor {
fn default() -> Self {
BlendDescriptor::REPLACE
}
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct ColorStateDescriptor {
pub format: TextureFormat,
pub alpha_blend: BlendDescriptor,
pub color_blend: BlendDescriptor,
pub write_mask: ColorWrite,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum PrimitiveTopology {
PointList = 0,
LineList = 1,
LineStrip = 2,
TriangleList = 3,
TriangleStrip = 4,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum FrontFace {
Ccw = 0,
Cw = 1,
}
impl Default for FrontFace {
fn default() -> Self {
FrontFace::Ccw
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum CullMode {
None = 0,
Front = 1,
Back = 2,
}
impl Default for CullMode {
fn default() -> Self {
CullMode::None
}
}
#[repr(C)]
#[derive(Clone, Debug, Default)]
pub struct RasterizationStateDescriptor {
pub front_face: FrontFace,
pub cull_mode: CullMode,
pub depth_bias: i32,
pub depth_bias_slope_scale: f32,
pub depth_bias_clamp: f32,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum TextureFormat {
// Normal 8 bit formats
R8Unorm = 0,
R8Snorm = 1,
R8Uint = 2,
R8Sint = 3,
// Normal 16 bit formats
R16Unorm = 4,
R16Snorm = 5,
R16Uint = 6,
R16Sint = 7,
R16Float = 8,
Rg8Unorm = 9,
Rg8Snorm = 10,
Rg8Uint = 11,
Rg8Sint = 12,
// Normal 32 bit formats
R32Uint = 13,
R32Sint = 14,
R32Float = 15,
Rg16Unorm = 16,
Rg16Snorm = 17,
Rg16Uint = 18,
Rg16Sint = 19,
Rg16Float = 20,
Rgba8Unorm = 21,
Rgba8UnormSrgb = 22,
Rgba8Snorm = 23,
Rgba8Uint = 24,
Rgba8Sint = 25,
Bgra8Unorm = 26,
Bgra8UnormSrgb = 27,
// Packed 32 bit formats
Rgb10a2Unorm = 28,
Rg11b10Float = 29,
// Normal 64 bit formats
Rg32Uint = 30,
Rg32Sint = 31,
Rg32Float = 32,
Rgba16Unorm = 33,
Rgba16Snorm = 34,
Rgba16Uint = 35,
Rgba16Sint = 36,
Rgba16Float = 37,
// Normal 128 bit formats
Rgba32Uint = 38,
Rgba32Sint = 39,
Rgba32Float = 40,
// Depth and stencil formats
Depth32Float = 41,
Depth24Plus = 42,
Depth24PlusStencil8 = 43,
}
bitflags::bitflags! {
#[repr(transparent)]
pub struct ColorWrite: u32 {
const RED = 1;
const GREEN = 2;
const BLUE = 4;
const ALPHA = 8;
const COLOR = 7;
const ALL = 15;
}
}
impl Default for ColorWrite {
fn default() -> Self {
ColorWrite::ALL
}
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct DepthStencilStateDescriptor {
pub format: TextureFormat,
pub depth_write_enabled: bool,
pub depth_compare: CompareFunction,
pub stencil_front: StencilStateFaceDescriptor,
pub stencil_back: StencilStateFaceDescriptor,
pub stencil_read_mask: u32,
pub stencil_write_mask: u32,
}
impl DepthStencilStateDescriptor {
pub fn needs_stencil_reference(&self) -> bool {
!self.stencil_front.compare.is_trivial() || !self.stencil_back.compare.is_trivial()
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum IndexFormat {
Uint16 = 0,
Uint32 = 1,
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum StencilOperation {
Keep = 0,
Zero = 1,
Replace = 2,
Invert = 3,
IncrementClamp = 4,
DecrementClamp = 5,
IncrementWrap = 6,
DecrementWrap = 7,
}
impl Default for StencilOperation {
fn default() -> Self {
StencilOperation::Keep
}
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq)]
pub struct StencilStateFaceDescriptor {
pub compare: CompareFunction,
pub fail_op: StencilOperation,
pub depth_fail_op: StencilOperation,
pub pass_op: StencilOperation,
}
impl StencilStateFaceDescriptor {
pub const IGNORE: Self = StencilStateFaceDescriptor {
compare: CompareFunction::Always,
fail_op: StencilOperation::Keep,
depth_fail_op: StencilOperation::Keep,
pass_op: StencilOperation::Keep,
};
}
impl Default for StencilStateFaceDescriptor {
fn default() -> Self {
StencilStateFaceDescriptor::IGNORE
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum CompareFunction {
Never = 0,
Less = 1,
Equal = 2,
LessEqual = 3,
Greater = 4,
NotEqual = 5,
GreaterEqual = 6,
Always = 7,
}
impl CompareFunction {
pub fn is_trivial(self) -> bool {
match self {
CompareFunction::Never | CompareFunction::Always => true,
_ => false,
}
}
}
pub type ShaderLocation = u32;
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum InputStepMode {
Vertex = 0,
Instance = 1,
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct VertexAttributeDescriptor {
pub offset: BufferAddress,
pub format: VertexFormat,
pub shader_location: ShaderLocation,
}
#[repr(C)]
#[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,
}
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;
}
}
#[repr(C)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct BufferDescriptor {
pub size: BufferAddress,
pub usage: BufferUsage,
}