Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions crates/compositor/src/d3d_windows.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//! Le device D3D11 unique du POC (§2).
//! Un seul `ID3D11Device`, feature level 11_1, flag VIDEO_SUPPORT (décodeur),
//! Un seul `ID3D11Device`, feature level 11_1 ou 11_0, flag VIDEO_SUPPORT (décodeur),
//! et `ID3D10Multithread::SetMultithreadProtected(TRUE)` — parce que le décodeur
//! ffmpeg et notre boucle de rendu toucheront le device depuis des threads distincts.

Expand All @@ -9,6 +9,7 @@ use windows::core::Interface;
use windows::Win32::Foundation::HMODULE;
use windows::Win32::Graphics::Direct3D::{
D3D_DRIVER_TYPE, D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_FEATURE_LEVEL,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_11_1,
};
use windows::Win32::Graphics::Direct3D11::{
Expand Down Expand Up @@ -65,14 +66,14 @@ pub struct Gpu {
pub backend: Backend,
}

/// Une tentative `D3D11CreateDevice` à FL 11_1. Extraite pour que le chemin d'échec
/// puisse re-sonder avec d'autres flags/driver et dire POURQUOI la vraie tentative
/// Une tentative `D3D11CreateDevice` à FL 11_1, puis 11_0 en repli. Extraite pour que le
/// chemin d'échec puisse re-sonder avec d'autres flags/driver et dire POURQUOI la vraie tentative
/// a échoué (voir `diagnose`), au lieu de remonter un HRESULT nu.
fn try_create(
driver: D3D_DRIVER_TYPE,
flags: D3D11_CREATE_DEVICE_FLAG,
) -> windows::core::Result<(ID3D11Device, ID3D11DeviceContext, D3D_FEATURE_LEVEL)> {
let levels = [D3D_FEATURE_LEVEL_11_1];
let levels = [D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0];
let mut device: Option<ID3D11Device> = None;
let mut context: Option<ID3D11DeviceContext> = None;
let mut got = D3D_FEATURE_LEVEL::default();
Expand Down Expand Up @@ -130,9 +131,9 @@ fn diagnose(err: &windows::core::Error) -> String {
);
}
format!(
"no Direct3D 11 feature level 11_1 display adapter ({err}). OpenScreen's compositor \
"no Direct3D 11 feature level 11_0 display adapter ({err}). OpenScreen's compositor \
requires one for both preview and export. Update the display driver, or run on a \
machine with a GPU that reaches feature level 11_1."
machine with a GPU that reaches feature level 11_0."
)
}

Expand Down Expand Up @@ -201,8 +202,8 @@ impl Gpu {
Err(err) => bail!("{}", diagnose(&err)),
};

if got != D3D_FEATURE_LEVEL_11_1 {
bail!("feature level obtenu {:?} != 11_1", got);
if got.0 < D3D_FEATURE_LEVEL_11_0.0 {
Comment thread
My-Denia marked this conversation as resolved.
Resolved
bail!("feature level obtenu {:?} < 11_0", got);
}

// §2 : multithread-protected. Le décodeur ffmpeg soumet depuis son thread,
Expand Down
7 changes: 4 additions & 3 deletions crates/compositor/src/pipeline_windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1971,14 +1971,15 @@ mod tests {
fn raw_hardware_prerequisite() -> windows::core::Result<()> {
use windows::Win32::Foundation::{E_UNEXPECTED, HMODULE};
use windows::Win32::Graphics::Direct3D::{
D3D_DRIVER_TYPE_HARDWARE, D3D_FEATURE_LEVEL, D3D_FEATURE_LEVEL_11_1,
D3D_DRIVER_TYPE_HARDWARE, D3D_FEATURE_LEVEL, D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_11_1,
};
use windows::Win32::Graphics::Direct3D11::{
D3D11CreateDevice, ID3D11Device, ID3D11DeviceContext, D3D11_CREATE_DEVICE_BGRA_SUPPORT,
D3D11_CREATE_DEVICE_VIDEO_SUPPORT, D3D11_SDK_VERSION,
};

let levels = [D3D_FEATURE_LEVEL_11_1];
let levels = [D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0];
let mut device: Option<ID3D11Device> = None;
let mut context: Option<ID3D11DeviceContext> = None;
let mut got = D3D_FEATURE_LEVEL::default();
Expand All @@ -1995,7 +1996,7 @@ mod tests {
Some(&mut context),
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
)?;
}
if device.is_none() || context.is_none() || got != D3D_FEATURE_LEVEL_11_1 {
if device.is_none() || context.is_none() || got.0 < D3D_FEATURE_LEVEL_11_0.0 {
return Err(windows::core::Error::from(E_UNEXPECTED));
}
Ok(())
Expand Down
Loading