revert scrap dxgi mode.rs

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-04-17 12:16:16 +08:00
parent 8f7b4b198d
commit 4d6358f1c8

View File

@ -62,7 +62,7 @@ impl Capturer {
let mut desc = unsafe { mem::MaybeUninit::uninit().assume_init() }; let mut desc = unsafe { mem::MaybeUninit::uninit().assume_init() };
let mut gdi_capturer = None; let mut gdi_capturer = None;
let mut res = if display.gdi.is_some() { let mut res = if display.gdi {
wrap_hresult(1) wrap_hresult(1)
} else { } else {
wrap_hresult(unsafe { wrap_hresult(unsafe {
@ -367,60 +367,48 @@ impl Displays {
let mut i: DWORD = 0; let mut i: DWORD = 0;
loop { loop {
#[allow(invalid_value)] #[allow(invalid_value)]
let mut dd: DISPLAY_DEVICEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; let mut d: DISPLAY_DEVICEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
dd.cb = std::mem::size_of::<DISPLAY_DEVICEW>() as _; d.cb = std::mem::size_of::<DISPLAY_DEVICEW>() as _;
let ok = unsafe { EnumDisplayDevicesW(std::ptr::null(), i, &mut dd as _, 0) }; let ok = unsafe { EnumDisplayDevicesW(std::ptr::null(), i, &mut d as _, 0) };
if ok == FALSE { if ok == FALSE {
break; break;
} }
i += 1; i += 1;
if 0 == (dd.StateFlags & DISPLAY_DEVICE_ACTIVE) if 0 == (d.StateFlags & DISPLAY_DEVICE_ACTIVE)
|| (dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) > 0 || (d.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) > 0
{ {
continue; continue;
} }
// let is_primary = (d.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) > 0;
let mut disp = Display { let mut disp = Display {
inner: ComPtr(std::ptr::null_mut()), inner: ComPtr(std::ptr::null_mut()),
adapter: ComPtr(std::ptr::null_mut()), adapter: ComPtr(std::ptr::null_mut()),
desc: unsafe { std::mem::zeroed() }, desc: unsafe { std::mem::zeroed() },
gdi: None, gdi: true,
}; };
disp.desc.DeviceName = dd.DeviceName.clone(); disp.desc.DeviceName = d.DeviceName;
#[allow(invalid_value)] #[allow(invalid_value)]
let mut dm: DEVMODEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; let mut m: DEVMODEW = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
dm.dmSize = std::mem::size_of::<DEVMODEW>() as _; m.dmSize = std::mem::size_of::<DEVMODEW>() as _;
dm.dmDriverExtra = 0; m.dmDriverExtra = 0;
unsafe { let ok = unsafe {
if FALSE EnumDisplaySettingsExW(
== EnumDisplaySettingsExW( disp.desc.DeviceName.as_ptr(),
disp.desc.DeviceName.as_ptr(), ENUM_CURRENT_SETTINGS,
ENUM_CURRENT_SETTINGS, &mut m as _,
&mut dm as _, 0,
0, )
) };
{ if ok == FALSE {
if FALSE continue;
== EnumDisplaySettingsExW(
disp.desc.DeviceName.as_ptr(),
ENUM_REGISTRY_SETTINGS,
&mut dm as _,
0,
)
{
continue;
}
}
} }
disp.desc.DesktopCoordinates.left = unsafe { dm.u1.s2().dmPosition.x }; disp.desc.DesktopCoordinates.left = unsafe { m.u1.s2().dmPosition.x };
disp.desc.DesktopCoordinates.top = unsafe { dm.u1.s2().dmPosition.y }; disp.desc.DesktopCoordinates.top = unsafe { m.u1.s2().dmPosition.y };
disp.desc.DesktopCoordinates.right = disp.desc.DesktopCoordinates.right =
disp.desc.DesktopCoordinates.left + dm.dmPelsWidth as i32; disp.desc.DesktopCoordinates.left + m.dmPelsWidth as i32;
disp.desc.DesktopCoordinates.bottom = disp.desc.DesktopCoordinates.bottom =
disp.desc.DesktopCoordinates.top + dm.dmPelsHeight as i32; disp.desc.DesktopCoordinates.top + m.dmPelsHeight as i32;
disp.desc.AttachedToDesktop = 1; disp.desc.AttachedToDesktop = 1;
let is_primary = (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) > 0;
disp.gdi = Some(GdiDisplayInfo { dd, dm, is_primary });
all.push(disp); all.push(disp);
} }
all all
@ -488,7 +476,7 @@ impl Displays {
inner: ComPtr(inner), inner: ComPtr(inner),
adapter: ComPtr(self.adapter.0), adapter: ComPtr(self.adapter.0),
desc, desc,
gdi: None, gdi: false,
})) }))
} }
} }
@ -524,13 +512,7 @@ pub struct Display {
inner: ComPtr<IDXGIOutput1>, inner: ComPtr<IDXGIOutput1>,
adapter: ComPtr<IDXGIAdapter1>, adapter: ComPtr<IDXGIAdapter1>,
desc: DXGI_OUTPUT_DESC, desc: DXGI_OUTPUT_DESC,
gdi: Option<GdiDisplayInfo>, gdi: bool,
}
pub struct GdiDisplayInfo {
pub dd: DISPLAY_DEVICEW,
pub dm: DEVMODEW,
pub is_primary: bool,
} }
// optimized for updated region // optimized for updated region
@ -555,10 +537,6 @@ impl Display {
self.desc.Rotation self.desc.Rotation
} }
pub fn gdi(&self) -> &Option<GdiDisplayInfo> {
&self.gdi
}
fn create_gdi(&self) -> Option<CapturerGDI> { fn create_gdi(&self) -> Option<CapturerGDI> {
if let Ok(res) = CapturerGDI::new(self.name(), self.width(), self.height()) { if let Ok(res) = CapturerGDI::new(self.name(), self.width(), self.height()) {
Some(res) Some(res)