This commit is contained in:
Junkui Zhang 2025-07-17 16:34:09 +08:00
parent 8c1d9f75d1
commit eb310bcf7d
2 changed files with 19 additions and 17 deletions

View file

@ -4,7 +4,6 @@ use ::util::ResultExt;
use anyhow::{Context, Result};
// #[cfg(not(feature = "enable-renderdoc"))]
use windows::Win32::Graphics::DirectComposition::*;
use windows::Win32::UI::WindowsAndMessaging::GetWindowRect;
use windows::{
Win32::{
Foundation::{HMODULE, HWND},
@ -50,7 +49,9 @@ struct DirectXResources {
msaa_target: ID3D11Texture2D,
msaa_view: [Option<ID3D11RenderTargetView>; 1],
// Cached viewport
// Cached window size and viewport
width: u32,
height: u32,
viewport: [D3D11_VIEWPORT; 1],
}
@ -111,7 +112,7 @@ impl DirectXRenderer {
devices.device.clone(),
devices.device_context.clone(),
));
let resources = DirectXResources::new(devices, hwnd)?;
let resources = DirectXResources::new(devices)?;
let globals = DirectXGlobalElements::new(&devices.device)?;
let pipelines = DirectXRenderPipelines::new(&devices.device)?;
// #[cfg(not(feature = "enable-renderdoc"))]
@ -211,12 +212,17 @@ impl DirectXRenderer {
}
pub(crate) fn resize(&mut self, new_size: Size<DevicePixels>) -> Result<()> {
let width = new_size.width.0.max(1) as u32;
let height = new_size.height.0.max(1) as u32;
if self.resources.width == width && self.resources.height == height {
return Ok(());
}
unsafe {
let width = new_size.width.0 as u32;
let height = new_size.height.0 as u32;
// Clear the render target before resizing
self.devices.device_context.OMSetRenderTargets(None, None);
ManuallyDrop::drop(&mut self.resources.render_target);
drop(self.resources.render_target_view[0].take().unwrap());
self.resources.swap_chain.ResizeBuffers(
BUFFER_COUNT as u32,
width,
@ -224,6 +230,7 @@ impl DirectXRenderer {
RENDER_TARGET_FORMAT,
DXGI_SWAP_CHAIN_FLAG(0),
)?;
self.resources
.recreate_resources(&self.devices, width, height)?;
self.devices
@ -385,14 +392,9 @@ impl DirectXRenderer {
}
impl DirectXResources {
pub fn new(devices: &DirectXDevices, hwnd: HWND) -> Result<Self> {
let (width, height) = unsafe {
let mut rect = std::mem::zeroed();
GetWindowRect(hwnd, &mut rect)?;
let width = (rect.right - rect.left).max(1) as u32;
let height = (rect.bottom - rect.top).max(1) as u32;
(width, height)
};
pub fn new(devices: &DirectXDevices) -> Result<Self> {
let width = 1;
let height = 1;
// #[cfg(not(feature = "enable-renderdoc"))]
let swap_chain = create_swap_chain(&devices.dxgi_factory, &devices.device, width, height)?;
// #[cfg(feature = "enable-renderdoc")]
@ -413,6 +415,8 @@ impl DirectXResources {
render_target_view,
msaa_target,
msaa_view,
width,
height,
viewport,
})
}
@ -431,6 +435,8 @@ impl DirectXResources {
self.msaa_target = msaa_target;
self.msaa_view = msaa_view;
self.viewport = viewport;
self.width = width;
self.height = height;
Ok(())
}
}

View file

@ -181,12 +181,8 @@ fn handle_size_msg(
let new_size = size(DevicePixels(width), DevicePixels(height));
let scale_factor = lock.scale_factor;
if lock.restore_from_minimized.is_some() {
// lock.renderer
// .update_drawable_size_even_if_unchanged(new_size);
lock.renderer.resize(new_size).log_err();
lock.callbacks.request_frame = lock.restore_from_minimized.take();
} else {
// lock.renderer.update_drawable_size(new_size);
lock.renderer.resize(new_size).log_err();
}
let new_size = new_size.to_pixels(scale_factor);