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