From 78fd0a9141df2f1961d76aad2b1f0a5e3600bb54 Mon Sep 17 00:00:00 2001 From: msiglreith Date: Wed, 30 May 2018 20:00:27 +0200 Subject: [PATCH 1/2] Add support for renderdoc capturing (dx12 only) --- libportability-gfx/src/impls.rs | 34 ++++++++++++++++++++++++++++++--- libportability-gfx/src/lib.rs | 6 ++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/libportability-gfx/src/impls.rs b/libportability-gfx/src/impls.rs index 9358b4f..75e2da4 100644 --- a/libportability-gfx/src/impls.rs +++ b/libportability-gfx/src/impls.rs @@ -10,7 +10,8 @@ use hal::command::RawCommandBuffer; use hal::queue::RawCommandQueue; use std::ffi::{CStr, CString}; -use std::mem; +use std::{mem, ptr}; +use std::os::raw::c_void; use super::*; @@ -537,6 +538,12 @@ pub extern "C" fn gfxCreateDevice( }) .collect::>(); + #[cfg(feature = "renderdoc")] + let mut renderdoc = { + use renderdoc::RenderDoc; + RenderDoc::new().expect("Failed to init renderdoc") + }; + let gpu = adapter.physical_device.open(&request_infos); match gpu { @@ -555,14 +562,28 @@ pub extern "C" fn gfxCreateDevice( }) .collect(); + #[cfg(feature = "renderdoc")] + let rd_device = { + use renderdoc::api::RenderDocV100; + + let rd_device = unsafe { gpu.device.as_raw() }; + renderdoc.start_frame_capture(rd_device, ::std::ptr::null()); + rd_device + }; + let gpu = Gpu { device: gpu.device, queues, + #[cfg(feature = "renderdoc")] + renderdoc, + #[cfg(feature = "renderdoc")] + capturing: rd_device as *mut _, }; unsafe { *pDevice = DispatchHandle::new(gpu); } + VkResult::VK_SUCCESS } Err(err) => conv::map_err_device_creation(err), @@ -570,9 +591,16 @@ pub extern "C" fn gfxCreateDevice( } #[inline] -pub extern "C" fn gfxDestroyDevice(gpu: VkDevice, _pAllocator: *const VkAllocationCallbacks) { +pub extern "C" fn gfxDestroyDevice(mut gpu: VkDevice, _pAllocator: *const VkAllocationCallbacks) { // release all the owned command queues if let Some(d) = gpu.unbox() { + #[cfg(feature = "renderdoc")] + { + use renderdoc::api::RenderDocV100; + let device = gpu.capturing as *mut c_void; + gpu.renderdoc.end_frame_capture(device as *mut _, ptr::null()); + } + for (_, family) in d.queues { for queue in family { let _ = queue.unbox(); @@ -1736,7 +1764,7 @@ pub extern "C" fn gfxCreateGraphicsPipelines( } else { vp_state .and_then(|vp| unsafe { vp.pScissors.as_ref() }) - .map(conv::map_rect) + .map(conv::map_rect) }, blend_color: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_BLEND_CONSTANTS) { None diff --git a/libportability-gfx/src/lib.rs b/libportability-gfx/src/lib.rs index 2df62f8..782895f 100644 --- a/libportability-gfx/src/lib.rs +++ b/libportability-gfx/src/lib.rs @@ -18,6 +18,8 @@ extern crate lazy_static; extern crate log; #[cfg(feature = "env_logger")] extern crate env_logger; +#[cfg(feature = "renderdoc")] +extern crate renderdoc; mod conv; mod handle; @@ -66,6 +68,10 @@ pub struct RawInstance { pub struct Gpu { device: B::Device, queues: HashMap>, + #[cfg(feature = "renderdoc")] + renderdoc: renderdoc::RenderDoc, + #[cfg(feature = "renderdoc")] + capturing: *mut (), } pub enum Pipeline { From 2b2c33eb51e5be621c34b56983d31c835ce4f00b Mon Sep 17 00:00:00 2001 From: msiglreith Date: Thu, 31 May 2018 23:29:07 +0200 Subject: [PATCH 2/2] Update dependencies and add CI test for renderdoc --- Cargo.lock | 55 ++++++++++++++++++++++++++++++++--- appveyor.yml | 1 + libportability-gfx/Cargo.toml | 4 +++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5f87b7..3cf493a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -252,7 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "gfx-backend-dx12" version = "0.1.0" -source = "git+https://github.com/gfx-rs/gfx#e791f711a8e27b22907cd62c91b0848cb6d561d7" +source = "git+https://github.com/gfx-rs/gfx#85f76137ebf3de5b287559544209432277d66a66" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "derivative 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -268,7 +268,7 @@ dependencies = [ [[package]] name = "gfx-backend-metal" version = "0.1.0" -source = "git+https://github.com/gfx-rs/gfx#e791f711a8e27b22907cd62c91b0848cb6d561d7" +source = "git+https://github.com/gfx-rs/gfx#85f76137ebf3de5b287559544209432277d66a66" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -289,7 +289,7 @@ dependencies = [ [[package]] name = "gfx-backend-vulkan" version = "0.1.0" -source = "git+https://github.com/gfx-rs/gfx#e791f711a8e27b22907cd62c91b0848cb6d561d7" +source = "git+https://github.com/gfx-rs/gfx#85f76137ebf3de5b287559544209432277d66a66" dependencies = [ "ash 0.24.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -307,7 +307,7 @@ dependencies = [ [[package]] name = "gfx-hal" version = "0.1.0" -source = "git+https://github.com/gfx-rs/gfx#e791f711a8e27b22907cd62c91b0848cb6d561d7" +source = "git+https://github.com/gfx-rs/gfx#85f76137ebf3de5b287559544209432277d66a66" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -340,6 +340,28 @@ dependencies = [ "gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "glutin" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cgl 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cocoa 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-graphics 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "shared_library 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "wayland-client 0.12.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winit 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "x11-dl 2.17.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "humantime" version = "1.1.1" @@ -494,6 +516,14 @@ dependencies = [ "objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "shared_library 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "percent-encoding" version = "1.0.1" @@ -522,6 +552,7 @@ dependencies = [ "gfx-hal 0.1.0 (git+https://github.com/gfx-rs/gfx)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "renderdoc 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -592,6 +623,19 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "renderdoc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "glutin 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "shared_library 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wio 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustc-demangle" version = "0.1.8" @@ -929,6 +973,7 @@ dependencies = [ "checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a" "checksum gleam 0.4.34 (registry+https://github.com/rust-lang/crates.io-index)" = "b4e5e2cdcadecdf3886e7808b6a38eae0a48dfe98c5c12b776fc861b80edf4a2" "checksum gleam 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "12b793fcf40a23dd372f184c228ab3eb96f88c50bb4fba8319c483aa025a4e45" +"checksum glutin 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9caee44b73388b2b4452ab783b13a1af80edb363bfc6e5292bdb2dd990a3171" "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e" "checksum io-surface 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd46b8bb9528ad2b433e4be99f949ab7bce7bc46fbe6c54cd556d3d18b5930af" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" @@ -948,6 +993,7 @@ dependencies = [ "checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" "checksum objc_exception 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "098cd29a2fa3c230d3463ae069cecccc3fdfd64c0d2496ab5b96f82dab6a00dc" "checksum objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4730aa1c64d722db45f7ccc4113a3e2c465d018de6db4d3e7dfe031e8c8a297" +"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" @@ -958,6 +1004,7 @@ dependencies = [ "checksum regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75ecf88252dce580404a22444fc7d626c01815debba56a7f4f536772a5ff19d3" "checksum regex-syntax 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1ac0f60d675cc6cf13a20ec076568254472551051ad5dd050364d70671bf6b" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" +"checksum renderdoc 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3aee9badfb4078c375d2d0479ed29c9c057b51ade78f94792ba2dcb11f343e7e" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" "checksum shared_library 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8254bf098ce4d8d7cc7cc6de438c5488adc5297e5b7ffef88816c0a91bd289c1" "checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" diff --git a/appveyor.yml b/appveyor.yml index da2a8ab..4507e09 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,3 +20,4 @@ build: false test_script: - cargo build --manifest-path libportability/Cargo.toml --features vulkan - cargo build --manifest-path libportability/Cargo.toml --features dx12 + - cargo build --manifest-path libportability-gfx/Cargo.toml --features "gfx-backend-dx12 renderdoc" diff --git a/libportability-gfx/Cargo.toml b/libportability-gfx/Cargo.toml index b884c65..17bbe79 100644 --- a/libportability-gfx/Cargo.toml +++ b/libportability-gfx/Cargo.toml @@ -23,6 +23,10 @@ log = "0.4" version = "0.5" optional = true +[dependencies.renderdoc] +version = "0.3" +optional = true + [dependencies.gfx-hal] git = "https://github.com/gfx-rs/gfx" #path = "../../gfx/src/hal"