mirror of
https://github.com/italicsjenga/portability.git
synced 2024-11-26 17:01:31 +11:00
Merge #87
87: Add support for renderdoc capturing (dx12 only) r=kvark a=msiglreith Blocked on a new renderdoc-rs release (and merging gfx-rs PR). Automatically creates a capture when enabling the `portability-gfx/renderdoc` feature. Works only if no swapchain is attached and dx12 only atm. Primary use case are CTS tests. Co-authored-by: msiglreith <m.siglreith@gmail.com>
This commit is contained in:
commit
1af668650f
55
Cargo.lock
generated
55
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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::<Vec<_>>();
|
||||
|
||||
#[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
|
||||
|
|
|
@ -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<B: hal::Backend> {
|
||||
device: B::Device,
|
||||
queues: HashMap<QueueFamilyIndex, Vec<VkQueue>>,
|
||||
#[cfg(feature = "renderdoc")]
|
||||
renderdoc: renderdoc::RenderDoc<renderdoc::V110>,
|
||||
#[cfg(feature = "renderdoc")]
|
||||
capturing: *mut (),
|
||||
}
|
||||
|
||||
pub enum Pipeline<B: hal::Backend> {
|
||||
|
|
Loading…
Reference in a new issue