diff --git a/examples/compute/main.c b/examples/compute/main.c index ef752ce2ef..831b40b294 100644 --- a/examples/compute/main.c +++ b/examples/compute/main.c @@ -80,7 +80,7 @@ int main( WGPUBindGroupLayoutId bind_group_layout = wgpu_device_create_bind_group_layout(device, &(WGPUBindGroupLayoutDescriptor){ - .bindings = &(WGPUBindGroupLayoutBinding){ + .bindings = &(WGPUBindGroupLayoutEntry){ .binding = 0, .visibility = WGPUShaderStage_COMPUTE, .ty = WGPUBindingType_StorageBuffer}, @@ -95,7 +95,7 @@ int main( WGPUBindGroupId bind_group = wgpu_device_create_bind_group(device, &(WGPUBindGroupDescriptor){.layout = bind_group_layout, - .bindings = &(WGPUBindGroupBinding){ + .bindings = &(WGPUBindGroupEntry){ .binding = 0, .resource = resource}, .bindings_length = BINDINGS_LENGTH}); @@ -135,7 +135,7 @@ int main( wgpu_compute_pass_dispatch(command_pass, numbers_length, 1, 1); wgpu_compute_pass_end_pass(command_pass); - WGPUQueueId queue = wgpu_device_get_queue(device); + WGPUQueueId queue = wgpu_device_get_default_queue(device); WGPUCommandBufferId command_buffer = wgpu_command_encoder_finish(encoder, NULL); diff --git a/examples/triangle/main.c b/examples/triangle/main.c index dd0d8509b7..582fd07f3e 100644 --- a/examples/triangle/main.c +++ b/examples/triangle/main.c @@ -142,8 +142,8 @@ int main() { }, .color_states_length = 1, .depth_stencil_state = NULL, - .vertex_input = - (WGPUVertexInputDescriptor){ + .vertex_state = + (WGPUVertexStateDescriptor){ .index_format = WGPUIndexFormat_Uint16, .vertex_buffers = NULL, .vertex_buffers_length = 0, @@ -260,7 +260,7 @@ int main() { wgpu_render_pass_set_pipeline(rpass, render_pipeline); wgpu_render_pass_set_bind_group(rpass, 0, bind_group, NULL, 0); wgpu_render_pass_draw(rpass, 3, 1, 0, 0); - WGPUQueueId queue = wgpu_device_get_queue(device); + WGPUQueueId queue = wgpu_device_get_default_queue(device); wgpu_render_pass_end_pass(rpass); WGPUCommandBufferId cmd_buf = wgpu_command_encoder_finish(cmd_encoder, NULL); wgpu_queue_submit(queue, &cmd_buf, 1); diff --git a/ffi/wgpu.h b/ffi/wgpu.h index 9f94162f76..905955eae7 100644 --- a/ffi/wgpu.h +++ b/ffi/wgpu.h @@ -42,8 +42,10 @@ typedef enum { WGPUBindingType_StorageBuffer = 1, WGPUBindingType_ReadonlyStorageBuffer = 2, WGPUBindingType_Sampler = 3, - WGPUBindingType_SampledTexture = 4, - WGPUBindingType_StorageTexture = 5, + WGPUBindingType_ComparisonSampler = 4, + WGPUBindingType_SampledTexture = 5, + WGPUBindingType_ReadonlyStorageTexture = 6, + WGPUBindingType_WriteonlyStorageTexture = 7, } WGPUBindingType; typedef enum { @@ -126,8 +128,25 @@ typedef enum { } WGPUPowerPreference; typedef enum { + /** + * The presentation engine does **not** wait for a vertical blanking period and + * the request is presented immediately. This is a low-latency presentation mode, + * but visible tearing may be observed. Will fallback to `Fifo` if unavailable on the + * selected platform and backend. Not optimal for mobile. + */ WGPUPresentMode_Immediate = 0, + /** + * The presentation engine waits for the next vertical blanking period to update + * the current image, but frames may be submitted without delay. This is a low-latency + * presentation mode and visible tearing will **not** be observed. Will fallback to `Fifo` + * if unavailable on the selected platform and backend. Not optimal for mobile. + */ WGPUPresentMode_Mailbox = 1, + /** + * The presentation engine waits for the next vertical blanking period to update + * the current image. The framerate will be capped at the display refresh rate, + * corresponding to the `VSync`. Tearing cannot be observed. Optimal for mobile. + */ WGPUPresentMode_Fifo = 2, } WGPUPresentMode; @@ -172,46 +191,40 @@ typedef enum { WGPUTextureFormat_R8Snorm = 1, WGPUTextureFormat_R8Uint = 2, WGPUTextureFormat_R8Sint = 3, - WGPUTextureFormat_R16Unorm = 4, - WGPUTextureFormat_R16Snorm = 5, - WGPUTextureFormat_R16Uint = 6, - WGPUTextureFormat_R16Sint = 7, - WGPUTextureFormat_R16Float = 8, - WGPUTextureFormat_Rg8Unorm = 9, - WGPUTextureFormat_Rg8Snorm = 10, - WGPUTextureFormat_Rg8Uint = 11, - WGPUTextureFormat_Rg8Sint = 12, - WGPUTextureFormat_R32Uint = 13, - WGPUTextureFormat_R32Sint = 14, - WGPUTextureFormat_R32Float = 15, - WGPUTextureFormat_Rg16Unorm = 16, - WGPUTextureFormat_Rg16Snorm = 17, - WGPUTextureFormat_Rg16Uint = 18, - WGPUTextureFormat_Rg16Sint = 19, - WGPUTextureFormat_Rg16Float = 20, - WGPUTextureFormat_Rgba8Unorm = 21, - WGPUTextureFormat_Rgba8UnormSrgb = 22, - WGPUTextureFormat_Rgba8Snorm = 23, - WGPUTextureFormat_Rgba8Uint = 24, - WGPUTextureFormat_Rgba8Sint = 25, - WGPUTextureFormat_Bgra8Unorm = 26, - WGPUTextureFormat_Bgra8UnormSrgb = 27, - WGPUTextureFormat_Rgb10a2Unorm = 28, - WGPUTextureFormat_Rg11b10Float = 29, - WGPUTextureFormat_Rg32Uint = 30, - WGPUTextureFormat_Rg32Sint = 31, - WGPUTextureFormat_Rg32Float = 32, - WGPUTextureFormat_Rgba16Unorm = 33, - WGPUTextureFormat_Rgba16Snorm = 34, - WGPUTextureFormat_Rgba16Uint = 35, - WGPUTextureFormat_Rgba16Sint = 36, - WGPUTextureFormat_Rgba16Float = 37, - WGPUTextureFormat_Rgba32Uint = 38, - WGPUTextureFormat_Rgba32Sint = 39, - WGPUTextureFormat_Rgba32Float = 40, - WGPUTextureFormat_Depth32Float = 41, - WGPUTextureFormat_Depth24Plus = 42, - WGPUTextureFormat_Depth24PlusStencil8 = 43, + WGPUTextureFormat_R16Uint = 4, + WGPUTextureFormat_R16Sint = 5, + WGPUTextureFormat_R16Float = 6, + WGPUTextureFormat_Rg8Unorm = 7, + WGPUTextureFormat_Rg8Snorm = 8, + WGPUTextureFormat_Rg8Uint = 9, + WGPUTextureFormat_Rg8Sint = 10, + WGPUTextureFormat_R32Uint = 11, + WGPUTextureFormat_R32Sint = 12, + WGPUTextureFormat_R32Float = 13, + WGPUTextureFormat_Rg16Uint = 14, + WGPUTextureFormat_Rg16Sint = 15, + WGPUTextureFormat_Rg16Float = 16, + WGPUTextureFormat_Rgba8Unorm = 17, + WGPUTextureFormat_Rgba8UnormSrgb = 18, + WGPUTextureFormat_Rgba8Snorm = 19, + WGPUTextureFormat_Rgba8Uint = 20, + WGPUTextureFormat_Rgba8Sint = 21, + WGPUTextureFormat_Bgra8Unorm = 22, + WGPUTextureFormat_Bgra8UnormSrgb = 23, + WGPUTextureFormat_Rgb10a2Unorm = 24, + WGPUTextureFormat_Rg11b10Float = 25, + WGPUTextureFormat_Rg32Uint = 26, + WGPUTextureFormat_Rg32Sint = 27, + WGPUTextureFormat_Rg32Float = 28, + WGPUTextureFormat_Rgba16Uint = 29, + WGPUTextureFormat_Rgba16Sint = 30, + WGPUTextureFormat_Rgba16Float = 31, + WGPUTextureFormat_Rgba32Uint = 32, + WGPUTextureFormat_Rgba32Sint = 33, + WGPUTextureFormat_Rgba32Float = 34, + WGPUTextureFormat_Depth32Float = 35, + WGPUTextureFormat_Depth24Plus = 36, + WGPUTextureFormat_Depth24PlusStencil8 = 37, } WGPUTextureFormat; typedef enum { @@ -358,8 +371,8 @@ typedef struct { typedef struct { WGPUBufferId buffer; WGPUBufferAddress offset; - uint32_t row_pitch; - uint32_t image_height; + uint32_t bytes_per_row; + uint32_t rows_per_image; } WGPUBufferCopyView; typedef uint64_t WGPUId_Texture_Dummy; @@ -448,11 +461,11 @@ typedef struct { typedef struct { uint32_t binding; WGPUBindingResource resource; -} WGPUBindGroupBinding; +} WGPUBindGroupEntry; typedef struct { WGPUBindGroupLayoutId layout; - const WGPUBindGroupBinding *bindings; + const WGPUBindGroupEntry *bindings; uintptr_t bindings_length; } WGPUBindGroupDescriptor; @@ -466,13 +479,14 @@ typedef struct { uint32_t binding; WGPUShaderStage visibility; WGPUBindingType ty; - WGPUTextureViewDimension texture_dimension; bool multisampled; - bool dynamic; -} WGPUBindGroupLayoutBinding; + bool has_dynamic_offset; + WGPUTextureViewDimension view_dimension; + WGPUTextureFormat storage_texture_format; +} WGPUBindGroupLayoutEntry; typedef struct { - const WGPUBindGroupLayoutBinding *bindings; + const WGPUBindGroupLayoutEntry *bindings; uintptr_t bindings_length; } WGPUBindGroupLayoutDescriptor; @@ -580,17 +594,17 @@ typedef struct { } WGPUVertexAttributeDescriptor; typedef struct { - WGPUBufferAddress stride; + WGPUBufferAddress array_stride; WGPUInputStepMode step_mode; const WGPUVertexAttributeDescriptor *attributes; uintptr_t attributes_length; -} WGPUVertexBufferDescriptor; +} WGPUVertexBufferLayoutDescriptor; typedef struct { WGPUIndexFormat index_format; - const WGPUVertexBufferDescriptor *vertex_buffers; + const WGPUVertexBufferLayoutDescriptor *vertex_buffers; uintptr_t vertex_buffers_length; -} WGPUVertexInputDescriptor; +} WGPUVertexStateDescriptor; typedef struct { WGPUPipelineLayoutId layout; @@ -601,7 +615,7 @@ typedef struct { const WGPUColorStateDescriptor *color_states; uintptr_t color_states_length; const WGPUDepthStencilStateDescriptor *depth_stencil_state; - WGPUVertexInputDescriptor vertex_input; + WGPUVertexStateDescriptor vertex_state; uint32_t sample_count; uint32_t sample_mask; bool alpha_to_coverage_enabled; @@ -616,7 +630,7 @@ typedef struct { WGPUFilterMode mipmap_filter; float lod_min_clamp; float lod_max_clamp; - WGPUCompareFunction compare_function; + const WGPUCompareFunction *compare; } WGPUSamplerDescriptor; typedef struct { @@ -847,9 +861,9 @@ WGPUTextureId wgpu_device_create_texture(WGPUDeviceId device_id, const WGPUTextu void wgpu_device_destroy(WGPUDeviceId device_id); -void wgpu_device_get_limits(WGPUDeviceId _device_id, WGPULimits *limits); +WGPUQueueId wgpu_device_get_default_queue(WGPUDeviceId device_id); -WGPUQueueId wgpu_device_get_queue(WGPUDeviceId device_id); +void wgpu_device_get_limits(WGPUDeviceId _device_id, WGPULimits *limits); void wgpu_device_poll(WGPUDeviceId device_id, bool force_wait); @@ -923,7 +937,8 @@ void wgpu_render_pass_set_blend_color(WGPURawPass *pass, const WGPUColor *color) void wgpu_render_pass_set_index_buffer(WGPURawPass *pass, WGPUBufferId buffer_id, - WGPUBufferAddress offset); + WGPUBufferAddress offset, + WGPUBufferAddress size); void wgpu_render_pass_set_pipeline(WGPURawPass *pass, WGPURenderPipelineId pipeline_id); @@ -935,17 +950,11 @@ void wgpu_render_pass_set_scissor_rect(WGPURawPass *pass, void wgpu_render_pass_set_stencil_reference(WGPURawPass *pass, uint32_t value); -/** - * # Safety - * - * This function is unsafe as there is no guarantee that the given pointers - * (`buffer_ids` and `offsets`) are valid for `length` elements. - */ -void wgpu_render_pass_set_vertex_buffers(WGPURawPass *pass, - uint32_t start_slot, - const WGPUBufferId *buffer_ids, - const WGPUBufferAddress *offsets, - uintptr_t length); +void wgpu_render_pass_set_vertex_buffer(WGPURawPass *pass, + uint32_t slot, + WGPUBufferId buffer_id, + WGPUBufferAddress offset, + WGPUBufferAddress size); void wgpu_render_pass_set_viewport(WGPURawPass *pass, float x, diff --git a/wgpu-core/src/binding_model.rs b/wgpu-core/src/binding_model.rs index 20faca8d08..55d1ef1fe0 100644 --- a/wgpu-core/src/binding_model.rs +++ b/wgpu-core/src/binding_model.rs @@ -27,33 +27,36 @@ pub enum BindingType { StorageBuffer = 1, ReadonlyStorageBuffer = 2, Sampler = 3, - SampledTexture = 4, - StorageTexture = 5, + ComparisonSampler = 4, + SampledTexture = 5, + ReadonlyStorageTexture = 6, + WriteonlyStorageTexture = 7, } #[repr(C)] #[derive(Clone, Debug, Hash, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate="serde_crate"))] -pub struct BindGroupLayoutBinding { +pub struct BindGroupLayoutEntry { pub binding: u32, pub visibility: wgt::ShaderStage, pub ty: BindingType, - pub texture_dimension: wgt::TextureViewDimension, pub multisampled: bool, - pub dynamic: bool, + pub has_dynamic_offset: bool, + pub view_dimension: wgt::TextureViewDimension, + pub storage_texture_format: wgt::TextureFormat, } #[repr(C)] #[derive(Debug)] pub struct BindGroupLayoutDescriptor { - pub bindings: *const BindGroupLayoutBinding, + pub bindings: *const BindGroupLayoutEntry, pub bindings_length: usize, } #[derive(Debug)] pub struct BindGroupLayout { pub(crate) raw: B::DescriptorSetLayout, - pub(crate) bindings: FastHashMap, + pub(crate) bindings: FastHashMap, pub(crate) desc_ranges: DescriptorRanges, pub(crate) dynamic_count: usize, } @@ -92,7 +95,7 @@ pub enum BindingResource { #[repr(C)] #[derive(Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate="serde_crate"))] -pub struct BindGroupBinding { +pub struct BindGroupEntry { pub binding: u32, pub resource: BindingResource, } @@ -101,7 +104,7 @@ pub struct BindGroupBinding { #[derive(Debug)] pub struct BindGroupDescriptor { pub layout: BindGroupLayoutId, - pub bindings: *const BindGroupBinding, + pub bindings: *const BindGroupEntry, pub bindings_length: usize, } diff --git a/wgpu-core/src/command/render.rs b/wgpu-core/src/command/render.rs index f841d7e05d..301f192747 100644 --- a/wgpu-core/src/command/render.rs +++ b/wgpu-core/src/command/render.rs @@ -116,12 +116,13 @@ enum RenderCommand { SetIndexBuffer { buffer_id: id::BufferId, offset: BufferAddress, + size: BufferAddress, }, - SetVertexBuffers { - start_index: u8, - count: u8, - phantom_buffer_ids: PhantomSlice, - phantom_offsets: PhantomSlice, + SetVertexBuffer { + slot: u32, + buffer_id: id::BufferId, + offset: BufferAddress, + size: BufferAddress, }, SetBlendColor(Color), SetStencilReference(u32), @@ -971,15 +972,15 @@ impl Global { } state.vertex.update_limits(); } - RenderCommand::SetIndexBuffer { buffer_id, offset } => { + RenderCommand::SetIndexBuffer { buffer_id, offset, size } => { let buffer = trackers .buffers .use_extend(&*buffer_guard, buffer_id, (), BufferUsage::INDEX) .unwrap(); assert!(buffer.usage.contains(BufferUsage::INDEX)); - let range = offset .. buffer.size; - state.index.bound_buffer_view = Some((buffer_id, range)); + let end = if size != 0 { offset + size } else { buffer.size }; + state.index.bound_buffer_view = Some((buffer_id, offset .. end)); state.index.update_limit(); let view = hal::buffer::IndexBufferView { @@ -992,31 +993,20 @@ impl Global { raw.bind_index_buffer(view); } } - RenderCommand::SetVertexBuffers { start_index, count, phantom_buffer_ids, phantom_offsets } => { - let (new_peeker, buffer_ids) = unsafe { - phantom_buffer_ids.decode_unaligned(peeker, count as usize, raw_data_end) + RenderCommand::SetVertexBuffer { slot, buffer_id, offset, size } => { + let buffer = trackers + .buffers + .use_extend(&*buffer_guard, buffer_id, (), BufferUsage::VERTEX) + .unwrap(); + assert!(buffer.usage.contains(BufferUsage::VERTEX)); + state.vertex.inputs[slot as usize].total_size = if size != 0 { + size + } else { + buffer.size - offset }; - let (new_peeker, offsets) = unsafe { - phantom_offsets.decode_unaligned(new_peeker, count as usize, raw_data_end) - }; - peeker = new_peeker; - - let pairs = state.vertex.inputs[start_index as usize ..] - .iter_mut() - .zip(buffer_ids.iter().zip(offsets)) - .map(|(vbs, (&id, &offset))| { - let buffer = trackers - .buffers - .use_extend(&*buffer_guard, id, (), BufferUsage::VERTEX) - .unwrap(); - assert!(buffer.usage.contains(BufferUsage::VERTEX)); - - vbs.total_size = buffer.size - offset; - (&buffer.raw, offset) - }); unsafe { - raw.bind_vertex_buffers(start_index as u32, pairs); + raw.bind_vertex_buffers(slot, iter::once((&buffer.raw, offset))); } state.vertex.update_limits(); } @@ -1211,39 +1201,29 @@ pub mod render_ffi { pass: &mut RawPass, buffer_id: id::BufferId, offset: BufferAddress, + size: BufferAddress, ) { pass.encode(&RenderCommand::SetIndexBuffer { buffer_id, offset, + size, }); } - /// # Safety - /// - /// This function is unsafe as there is no guarantee that the given pointers - /// (`buffer_ids` and `offsets`) are valid for `length` elements. - // TODO: There might be other safety issues, such as using the unsafe - // `RawPass::encode` and `RawPass::encode_slice`. #[no_mangle] - pub unsafe extern "C" fn wgpu_render_pass_set_vertex_buffers( + pub unsafe extern "C" fn wgpu_render_pass_set_vertex_buffer( pass: &mut RawPass, - start_slot: u32, - buffer_ids: *const id::BufferId, - offsets: *const BufferAddress, - length: usize, + slot: u32, + buffer_id: id::BufferId, + offset: BufferAddress, + size: BufferAddress, ) { - pass.encode(&RenderCommand::SetVertexBuffers { - start_index: start_slot.try_into().unwrap(), - count: length.try_into().unwrap(), - phantom_buffer_ids: PhantomSlice::new(), - phantom_offsets: PhantomSlice::new(), + pass.encode(&RenderCommand::SetVertexBuffer { + slot, + buffer_id, + offset, + size, }); - pass.encode_slice( - slice::from_raw_parts(buffer_ids, length), - ); - pass.encode_slice( - slice::from_raw_parts(offsets, length), - ); } #[no_mangle] diff --git a/wgpu-core/src/command/transfer.rs b/wgpu-core/src/command/transfer.rs index f616cebdf5..e259d4b935 100644 --- a/wgpu-core/src/command/transfer.rs +++ b/wgpu-core/src/command/transfer.rs @@ -24,8 +24,8 @@ const BITS_PER_BYTE: u32 = 8; pub struct BufferCopyView { pub buffer: BufferId, pub offset: BufferAddress, - pub row_pitch: u32, - pub image_height: u32, + pub bytes_per_row: u32, + pub rows_per_image: u32, } #[repr(C)] @@ -161,12 +161,12 @@ impl Global { .surface_desc() .bits as u32 / BITS_PER_BYTE; - let buffer_width = source.row_pitch / bytes_per_texel; - assert_eq!(source.row_pitch % bytes_per_texel, 0); + let buffer_width = source.bytes_per_row / bytes_per_texel; + assert_eq!(source.bytes_per_row % bytes_per_texel, 0); let region = hal::command::BufferImageCopy { buffer_offset: source.offset, buffer_width, - buffer_height: source.image_height, + buffer_height: source.rows_per_image, image_layers: destination.to_sub_layers(aspects), image_offset: conv::map_origin(destination.origin), image_extent: conv::map_extent(copy_size), @@ -225,12 +225,12 @@ impl Global { .surface_desc() .bits as u32 / BITS_PER_BYTE; - let buffer_width = destination.row_pitch / bytes_per_texel; - assert_eq!(destination.row_pitch % bytes_per_texel, 0); + let buffer_width = destination.bytes_per_row / bytes_per_texel; + assert_eq!(destination.bytes_per_row % bytes_per_texel, 0); let region = hal::command::BufferImageCopy { buffer_offset: destination.offset, buffer_width, - buffer_height: destination.image_height, + buffer_height: destination.rows_per_image, image_layers: source.to_sub_layers(aspects), image_offset: conv::map_origin(source.origin), image_extent: conv::map_extent(copy_size), diff --git a/wgpu-core/src/conv.rs b/wgpu-core/src/conv.rs index dff2325fc1..a6d469cfb6 100644 --- a/wgpu-core/src/conv.rs +++ b/wgpu-core/src/conv.rs @@ -79,28 +79,31 @@ pub fn map_texture_usage( } pub fn map_binding_type( - binding: &binding_model::BindGroupLayoutBinding, + binding: &binding_model::BindGroupLayoutEntry, ) -> hal::pso::DescriptorType { use crate::binding_model::BindingType as Bt; use hal::pso::DescriptorType as H; match binding.ty { Bt::UniformBuffer => { - if binding.dynamic { + if binding.has_dynamic_offset { H::UniformBufferDynamic } else { H::UniformBuffer } } - Bt::StorageBuffer | Bt::ReadonlyStorageBuffer => { - if binding.dynamic { + Bt::StorageBuffer | + Bt::ReadonlyStorageBuffer => { + if binding.has_dynamic_offset { H::StorageBufferDynamic } else { H::StorageBuffer } } - Bt::Sampler => H::Sampler, + Bt::Sampler | + Bt::ComparisonSampler => H::Sampler, Bt::SampledTexture => H::SampledImage, - Bt::StorageTexture => H::StorageImage, + Bt::ReadonlyStorageTexture | + Bt::WriteonlyStorageTexture => H::StorageImage, } } @@ -328,12 +331,9 @@ pub(crate) fn map_texture_format( Tf::R8Sint => H::R8Sint, // Normal 16 bit formats - Tf::R16Unorm => H::R16Unorm, - Tf::R16Snorm => H::R16Snorm, Tf::R16Uint => H::R16Uint, Tf::R16Sint => H::R16Sint, Tf::R16Float => H::R16Sfloat, - Tf::Rg8Unorm => H::Rg8Unorm, Tf::Rg8Snorm => H::Rg8Snorm, Tf::Rg8Uint => H::Rg8Uint, @@ -343,8 +343,6 @@ pub(crate) fn map_texture_format( Tf::R32Uint => H::R32Uint, Tf::R32Sint => H::R32Sint, Tf::R32Float => H::R32Sfloat, - Tf::Rg16Unorm => H::Rg16Unorm, - Tf::Rg16Snorm => H::Rg16Snorm, Tf::Rg16Uint => H::Rg16Uint, Tf::Rg16Sint => H::Rg16Sint, Tf::Rg16Float => H::Rg16Sfloat, @@ -364,8 +362,6 @@ pub(crate) fn map_texture_format( Tf::Rg32Uint => H::Rg32Uint, Tf::Rg32Sint => H::Rg32Sint, Tf::Rg32Float => H::Rg32Sfloat, - Tf::Rgba16Unorm => H::Rgba16Unorm, - Tf::Rgba16Snorm => H::Rgba16Snorm, Tf::Rgba16Uint => H::Rgba16Uint, Tf::Rgba16Sint => H::Rgba16Sint, Tf::Rgba16Float => H::Rgba16Sfloat, diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index da803f8167..c773e60fc4 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -18,7 +18,7 @@ use crate::{ Stored, }; -use wgt::{BufferAddress, CompareFunction, InputStepMode, TextureFormat}; +use wgt::{BufferAddress, InputStepMode, TextureFormat}; use arrayvec::ArrayVec; use copyless::VecHelper as _; use hal::{ @@ -825,11 +825,7 @@ impl> Global { ), lod_bias: hal::image::Lod(0.0), lod_range: hal::image::Lod(desc.lod_min_clamp) .. hal::image::Lod(desc.lod_max_clamp), - comparison: if desc.compare_function == CompareFunction::Always { - None - } else { - Some(conv::map_compare_function(desc.compare_function)) - }, + comparison: desc.compare.cloned().map(conv::map_compare_function), border: hal::image::PackedColor(0), normalized: true, anisotropic: hal::image::Anisotropic::Off, //TODO @@ -924,7 +920,7 @@ impl> Global { raw, bindings: bindings_map, desc_ranges: DescriptorRanges::from_bindings(&raw_bindings), - dynamic_count: bindings.iter().filter(|b| b.dynamic).count(), + dynamic_count: bindings.iter().filter(|b| b.has_dynamic_offset).count(), }; hub.bind_group_layouts @@ -1047,9 +1043,11 @@ impl> Global { binding_model::BindingType::ReadonlyStorageBuffer => { (BIND_BUFFER_ALIGNMENT, wgt::BufferUsage::STORAGE_READ) } - binding_model::BindingType::Sampler - | binding_model::BindingType::SampledTexture - | binding_model::BindingType::StorageTexture => { + binding_model::BindingType::Sampler | + binding_model::BindingType::ComparisonSampler | + binding_model::BindingType::SampledTexture | + binding_model::BindingType::ReadonlyStorageTexture | + binding_model::BindingType::WriteonlyStorageTexture => { panic!("Mismatched buffer binding for {:?}", decl) } }; @@ -1086,7 +1084,11 @@ impl> Global { hal::pso::Descriptor::Buffer(&buffer.raw, range) } binding_model::BindingResource::Sampler(id) => { - assert_eq!(decl.ty, binding_model::BindingType::Sampler); + match decl.ty { + binding_model::BindingType::Sampler | + binding_model::BindingType::ComparisonSampler => {} + _ => panic!("Wrong binding type for a sampler: {:?}", decl.ty), + } let sampler = used .samplers .use_extend(&*sampler_guard, id, (), ()) @@ -1099,7 +1101,8 @@ impl> Global { resource::TextureUsage::SAMPLED, hal::image::Layout::ShaderReadOnlyOptimal, ), - binding_model::BindingType::StorageTexture => { + binding_model::BindingType::ReadonlyStorageTexture | + binding_model::BindingType::WriteonlyStorageTexture => { (resource::TextureUsage::STORAGE, hal::image::Layout::General) } _ => panic!("Mismatched texture binding for {:?}", decl), @@ -1509,8 +1512,8 @@ impl> Global { let desc_vbs = unsafe { slice::from_raw_parts( - desc.vertex_input.vertex_buffers, - desc.vertex_input.vertex_buffers_length, + desc.vertex_state.vertex_buffers, + desc.vertex_state.vertex_buffers_length, ) }; let mut vertex_strides = Vec::with_capacity(desc_vbs.len()); @@ -1519,13 +1522,13 @@ impl> Global { for (i, vb_state) in desc_vbs.iter().enumerate() { vertex_strides .alloc() - .init((vb_state.stride, vb_state.step_mode)); + .init((vb_state.array_stride, vb_state.step_mode)); if vb_state.attributes_length == 0 { continue; } vertex_buffers.alloc().init(hal::pso::VertexBufferDesc { binding: i as u32, - stride: vb_state.stride as u32, + stride: vb_state.array_stride as u32, rate: match vb_state.step_mode { InputStepMode::Vertex => hal::pso::VertexInputRate::Vertex, InputStepMode::Instance => hal::pso::VertexInputRate::Instance(1), @@ -1733,7 +1736,7 @@ impl> Global { layout_id: desc.layout, pass_context, flags, - index_format: desc.vertex_input.index_format, + index_format: desc.vertex_state.index_format, vertex_strides, sample_count: sc, }; diff --git a/wgpu-core/src/pipeline.rs b/wgpu-core/src/pipeline.rs index 7c10f70eff..b641840c59 100644 --- a/wgpu-core/src/pipeline.rs +++ b/wgpu-core/src/pipeline.rs @@ -12,8 +12,8 @@ use wgt::{BufferAddress, ColorStateDescriptor, DepthStencilStateDescriptor, Inde #[repr(C)] #[derive(Debug)] -pub struct VertexBufferDescriptor { - pub stride: BufferAddress, +pub struct VertexBufferLayoutDescriptor { + pub array_stride: BufferAddress, pub step_mode: InputStepMode, pub attributes: *const VertexAttributeDescriptor, pub attributes_length: usize, @@ -21,9 +21,9 @@ pub struct VertexBufferDescriptor { #[repr(C)] #[derive(Debug)] -pub struct VertexInputDescriptor { +pub struct VertexStateDescriptor { pub index_format: IndexFormat, - pub vertex_buffers: *const VertexBufferDescriptor, + pub vertex_buffers: *const VertexBufferLayoutDescriptor, pub vertex_buffers_length: usize, } @@ -64,7 +64,7 @@ pub struct RenderPipelineDescriptor { pub color_states: *const ColorStateDescriptor, pub color_states_length: usize, pub depth_stencil_state: *const DepthStencilStateDescriptor, - pub vertex_input: VertexInputDescriptor, + pub vertex_state: VertexStateDescriptor, pub sample_count: u32, pub sample_mask: u32, pub alpha_to_coverage_enabled: bool, diff --git a/wgpu-core/src/resource.rs b/wgpu-core/src/resource.rs index 2d0e5899e6..4db4b293b2 100644 --- a/wgpu-core/src/resource.rs +++ b/wgpu-core/src/resource.rs @@ -14,8 +14,6 @@ use crate::{ use wgt::{BufferAddress, BufferUsage, CompareFunction, TextureFormat}; use hal; use rendy_memory::MemoryBlock; -#[cfg(feature = "serde")] -use serde_crate::{Deserialize, Serialize}; use std::{borrow::Borrow, fmt}; @@ -250,7 +248,7 @@ impl Default for FilterMode { #[repr(C)] #[derive(Debug)] -pub struct SamplerDescriptor { +pub struct SamplerDescriptor<'a> { pub address_mode_u: AddressMode, pub address_mode_v: AddressMode, pub address_mode_w: AddressMode, @@ -259,7 +257,7 @@ pub struct SamplerDescriptor { pub mipmap_filter: FilterMode, pub lod_min_clamp: f32, pub lod_max_clamp: f32, - pub compare_function: CompareFunction, + pub compare: Option<&'a CompareFunction>, } #[derive(Debug)] diff --git a/wgpu-native/src/device.rs b/wgpu-native/src/device.rs index 7077b0cd6f..6ec723854e 100644 --- a/wgpu-native/src/device.rs +++ b/wgpu-native/src/device.rs @@ -318,7 +318,7 @@ pub extern "C" fn wgpu_command_buffer_destroy(command_buffer_id: id::CommandBuff } #[no_mangle] -pub extern "C" fn wgpu_device_get_queue(device_id: id::DeviceId) -> id::QueueId { +pub extern "C" fn wgpu_device_get_default_queue(device_id: id::DeviceId) -> id::QueueId { device_id } diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index c479aec319..d451ca3554 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -290,6 +290,7 @@ pub struct RasterizationStateDescriptor { #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TextureFormat { // Normal 8 bit formats R8Unorm = 0, @@ -298,57 +299,50 @@ pub enum TextureFormat { R8Sint = 3, // Normal 16 bit formats - R16Unorm = 4, - R16Snorm = 5, - R16Uint = 6, - R16Sint = 7, - R16Float = 8, - - Rg8Unorm = 9, - Rg8Snorm = 10, - Rg8Uint = 11, - Rg8Sint = 12, + R16Uint = 4, + R16Sint = 5, + R16Float = 6, + Rg8Unorm = 7, + Rg8Snorm = 8, + Rg8Uint = 9, + Rg8Sint = 10, // 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, + R32Uint = 11, + R32Sint = 12, + R32Float = 13, + Rg16Uint = 14, + Rg16Sint = 15, + Rg16Float = 16, + Rgba8Unorm = 17, + Rgba8UnormSrgb = 18, + Rgba8Snorm = 19, + Rgba8Uint = 20, + Rgba8Sint = 21, + Bgra8Unorm = 22, + Bgra8UnormSrgb = 23, // Packed 32 bit formats - Rgb10a2Unorm = 28, - Rg11b10Float = 29, + Rgb10a2Unorm = 24, + Rg11b10Float = 25, // Normal 64 bit formats - Rg32Uint = 30, - Rg32Sint = 31, - Rg32Float = 32, - Rgba16Unorm = 33, - Rgba16Snorm = 34, - Rgba16Uint = 35, - Rgba16Sint = 36, - Rgba16Float = 37, + Rg32Uint = 26, + Rg32Sint = 27, + Rg32Float = 28, + Rgba16Uint = 29, + Rgba16Sint = 30, + Rgba16Float = 31, // Normal 128 bit formats - Rgba32Uint = 38, - Rgba32Sint = 39, - Rgba32Float = 40, + Rgba32Uint = 32, + Rgba32Sint = 33, + Rgba32Float = 34, // Depth and stencil formats - Depth32Float = 41, - Depth24Plus = 42, - Depth24PlusStencil8 = 43, + Depth32Float = 35, + Depth24Plus = 36, + Depth24PlusStencil8 = 37, } bitflags::bitflags! {