mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-22 06:44:14 +00:00
Move some types into shared wgpu-types crate
This commit is contained in:
parent
40889df58f
commit
9940aef599
11
Cargo.lock
generated
11
Cargo.lock
generated
@ -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]]
|
||||||
|
@ -3,4 +3,5 @@ members = [
|
|||||||
"wgpu-core",
|
"wgpu-core",
|
||||||
"wgpu-native",
|
"wgpu-native",
|
||||||
"wgpu-remote",
|
"wgpu-remote",
|
||||||
|
"wgpu-types",
|
||||||
]
|
]
|
||||||
|
@ -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 }
|
||||||
|
@ -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)]
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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))]
|
||||||
|
@ -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!()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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]
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
|
@ -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::*,
|
||||||
|
@ -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
19
wgpu-types/Cargo.toml
Normal 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
548
wgpu-types/src/lib.rs
Normal 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,
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user