From 3908d2b5a1bc1dd246e7527dfa867e475651411d Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Tue, 19 Nov 2019 10:59:24 -0500 Subject: [PATCH] Cleanup exports --- examples/compute/main.c | 5 ++--- examples/triangle/main.c | 5 ++--- ffi/wgpu.h | 2 +- wgpu-core/src/device.rs | 13 ++++--------- wgpu-core/src/instance.rs | 3 --- wgpu-core/src/resource.rs | 27 ++++++++++++++++++--------- wgpu-native/src/device.rs | 38 +++++++++++++++++++++++++++----------- wgpu-native/src/lib.rs | 7 +++++-- 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/examples/compute/main.c b/examples/compute/main.c index 031e5209e..ef752ce2e 100644 --- a/examples/compute/main.c +++ b/examples/compute/main.c @@ -16,9 +16,8 @@ #define BINDINGS_LENGTH (1) #define BIND_GROUP_LAYOUTS_LENGTH (1) -void request_adapter_callback(WGPUAdapterId const *received, void *userdata) { - WGPUAdapterId *id = (WGPUAdapterId*) userdata; - *id = *received; +void request_adapter_callback(WGPUAdapterId received, void *userdata) { + *(WGPUAdapterId*)userdata = received; } void read_buffer_map( diff --git a/examples/triangle/main.c b/examples/triangle/main.c index 379232059..e8c624f9a 100644 --- a/examples/triangle/main.c +++ b/examples/triangle/main.c @@ -36,9 +36,8 @@ #define RENDER_PASS_ATTACHMENTS_LENGTH (1) #define BIND_GROUP_LAYOUTS_LENGTH (1) -void request_adapter_callback(WGPUAdapterId const *received, void *userdata) { - WGPUAdapterId *id = (WGPUAdapterId*) userdata; - *id = *received; +void request_adapter_callback(WGPUAdapterId received, void *userdata) { + *(WGPUAdapterId*)userdata = received; } int main() { diff --git a/ffi/wgpu.h b/ffi/wgpu.h index 9ded93989..c1dca8491 100644 --- a/ffi/wgpu.h +++ b/ffi/wgpu.h @@ -649,7 +649,7 @@ typedef struct { typedef uint32_t WGPUBackendBit; -typedef void (*WGPURequestAdapterCallback)(const WGPUAdapterId *adapter, void *userdata); +typedef void (*WGPURequestAdapterCallback)(WGPUAdapterId id, void *userdata); typedef struct { WGPUTextureViewId view_id; diff --git a/wgpu-core/src/device.rs b/wgpu-core/src/device.rs index d33daaacb..b49e96cd6 100644 --- a/wgpu-core/src/device.rs +++ b/wgpu-core/src/device.rs @@ -600,11 +600,11 @@ impl Device { } }; match operation { - resource::BufferMapOperation::Read(_, on_read, userdata) => { - on_read(status, ptr, userdata) + resource::BufferMapOperation::Read(_, on_read) => { + on_read(status, ptr) } - resource::BufferMapOperation::Write(_, on_write, userdata) => { - on_write(status, ptr, userdata) + resource::BufferMapOperation::Write(_, on_write) => { + on_write(status, ptr) } } } @@ -2000,11 +2000,6 @@ impl> Global { } } -pub type BufferMapReadCallback = - extern "C" fn(status: resource::BufferMapAsyncStatus, data: *const u8, userdata: *mut u8); -pub type BufferMapWriteCallback = - extern "C" fn(status: resource::BufferMapAsyncStatus, data: *mut u8, userdata: *mut u8); - impl Global { pub fn buffer_map_async( &self, diff --git a/wgpu-core/src/instance.rs b/wgpu-core/src/instance.rs index a8686aeb5..fa92f4848 100644 --- a/wgpu-core/src/instance.rs +++ b/wgpu-core/src/instance.rs @@ -17,7 +17,6 @@ use serde::{Deserialize, Serialize}; pub use hal::adapter::AdapterInfo; use hal::{self, adapter::PhysicalDevice as _, queue::QueueFamily as _, Instance as _}; -use std::ffi::c_void; #[derive(Debug)] pub struct Instance { @@ -153,8 +152,6 @@ pub struct DeviceDescriptor { pub limits: Limits, } -pub type RequestAdapterCallback = extern "C" fn(adapter: *const AdapterId, userdata: *mut c_void); - bitflags::bitflags! { #[repr(transparent)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/wgpu-core/src/resource.rs b/wgpu-core/src/resource.rs index bb69ed498..16475ea74 100644 --- a/wgpu-core/src/resource.rs +++ b/wgpu-core/src/resource.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use crate::{ - device::{BufferMapReadCallback, BufferMapWriteCallback}, id::{DeviceId, SwapChainId, TextureId}, track::DUMMY_SELECTOR, BufferAddress, @@ -17,7 +16,7 @@ use hal; use rendy_memory::MemoryBlock; use smallvec::SmallVec; -use std::borrow::Borrow; +use std::{borrow::Borrow, fmt}; bitflags::bitflags! { #[repr(transparent)] @@ -62,25 +61,35 @@ pub enum BufferMapAsyncStatus { ContextLost, } -#[derive(Clone, Debug)] pub enum BufferMapOperation { - Read(std::ops::Range, BufferMapReadCallback, *mut u8), - Write(std::ops::Range, BufferMapWriteCallback, *mut u8), + Read(std::ops::Range, Box), + Write(std::ops::Range, Box), } +//TODO: clarify if/why this is needed here unsafe impl Send for BufferMapOperation {} unsafe impl Sync for BufferMapOperation {} +impl fmt::Debug for BufferMapOperation { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let (op, range) = match *self { + BufferMapOperation::Read(ref range, _) => ("read", range), + BufferMapOperation::Write(ref range, _) => ("write", range), + }; + write!(fmt, "BufferMapOperation <{}> of range {:?}", op, range) + } +} + impl BufferMapOperation { pub(crate) fn call_error(self) { match self { - BufferMapOperation::Read(_, callback, userdata) => { + BufferMapOperation::Read(_, callback) => { log::error!("wgpu_buffer_map_read_async failed: buffer mapping is pending"); - callback(BufferMapAsyncStatus::Error, std::ptr::null_mut(), userdata); + callback(BufferMapAsyncStatus::Error, std::ptr::null()); } - BufferMapOperation::Write(_, callback, userdata) => { + BufferMapOperation::Write(_, callback) => { log::error!("wgpu_buffer_map_write_async failed: buffer mapping is pending"); - callback(BufferMapAsyncStatus::Error, std::ptr::null_mut(), userdata); + callback(BufferMapAsyncStatus::Error, std::ptr::null_mut()); } } } diff --git a/wgpu-native/src/device.rs b/wgpu-native/src/device.rs index 917e23af2..4b7ccaced 100644 --- a/wgpu-native/src/device.rs +++ b/wgpu-native/src/device.rs @@ -4,6 +4,12 @@ use core::{gfx_select, hub::Token, id}; use std::{marker::PhantomData, slice}; +pub type RequestAdapterCallback = + unsafe extern "C" fn(id: id::AdapterId, userdata: *mut std::ffi::c_void); +pub type BufferMapReadCallback = + unsafe extern "C" fn(status: core::resource::BufferMapAsyncStatus, data: *const u8, userdata: *mut u8); +pub type BufferMapWriteCallback = + unsafe extern "C" fn(status: core::resource::BufferMapAsyncStatus, data: *mut u8, userdata: *mut u8); pub fn wgpu_create_surface(raw_handle: raw_window_handle::RawWindowHandle) -> id::SurfaceId { use raw_window_handle::RawWindowHandle as Rwh; @@ -116,17 +122,19 @@ pub extern "C" fn wgpu_create_surface_from_windows_hwnd( pub extern "C" fn wgpu_request_adapter_async( desc: Option<&core::instance::RequestAdapterOptions>, mask: core::instance::BackendBit, - callback: core::instance::RequestAdapterCallback, + callback: RequestAdapterCallback, userdata: *mut std::ffi::c_void, ) { let id = GLOBAL.pick_adapter( &desc.cloned().unwrap_or_default(), core::instance::AdapterInputs::Mask(mask, || PhantomData), ); - callback( - id.as_ref().map_or(&id::AdapterId::ERROR, |x| x as *const _), - userdata, - ); + unsafe { + callback( + id.unwrap_or(id::AdapterId::ERROR), + userdata, + ) + }; } #[no_mangle] @@ -313,11 +321,15 @@ pub extern "C" fn wgpu_buffer_map_read_async( buffer_id: id::BufferId, start: core::BufferAddress, size: core::BufferAddress, - callback: core::device::BufferMapReadCallback, + callback: BufferMapReadCallback, userdata: *mut u8, ) { - let operation = - core::resource::BufferMapOperation::Read(start .. start + size, callback, userdata); + let operation = core::resource::BufferMapOperation::Read( + start .. start + size, + Box::new(move |status, data| unsafe { + callback(status, data, userdata) + }), + ); gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, core::resource::BufferUsage::MAP_READ, operation)) } @@ -326,11 +338,15 @@ pub extern "C" fn wgpu_buffer_map_write_async( buffer_id: id::BufferId, start: core::BufferAddress, size: core::BufferAddress, - callback: core::device::BufferMapWriteCallback, + callback: BufferMapWriteCallback, userdata: *mut u8, ) { - let operation = - core::resource::BufferMapOperation::Write(start .. start + size, callback, userdata); + let operation = core::resource::BufferMapOperation::Write( + start .. start + size, + Box::new(move |status, data| unsafe { + callback(status, data, userdata) + }), + ); gfx_select!(buffer_id => GLOBAL.buffer_map_async(buffer_id, core::resource::BufferUsage::MAP_WRITE, operation)) } diff --git a/wgpu-native/src/lib.rs b/wgpu-native/src/lib.rs index 4260ec83a..ff6c1565e 100644 --- a/wgpu-native/src/lib.rs +++ b/wgpu-native/src/lib.rs @@ -1,7 +1,10 @@ use std::sync::Arc; -pub mod command; -pub mod device; +mod command; +mod device; + +pub use self::command::*; +pub use self::device::*; type Global = core::hub::Global>;