From eb310bcf7dc51b6ca660ac6c6125423198ac82da Mon Sep 17 00:00:00 2001 From: Junkui Zhang <364772080@qq.com> Date: Thu, 17 Jul 2025 16:34:09 +0800 Subject: [PATCH] wip --- .../src/platform/windows/directx_renderer.rs | 32 +++++++++++-------- crates/gpui/src/platform/windows/events.rs | 4 --- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/crates/gpui/src/platform/windows/directx_renderer.rs b/crates/gpui/src/platform/windows/directx_renderer.rs index 87c98512b99857921c57bed1145e81dadc267b88..d6d5d442af01a52e2050793112a77561ae525dd1 100644 --- a/crates/gpui/src/platform/windows/directx_renderer.rs +++ b/crates/gpui/src/platform/windows/directx_renderer.rs @@ -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; 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) -> 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 { - 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 { + 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(()) } } diff --git a/crates/gpui/src/platform/windows/events.rs b/crates/gpui/src/platform/windows/events.rs index 461aae5e25e5b1ccbbf3d9e174bf5c6cadd0e7b3..6fd899cbef864a5ff019e4496d3768345208dad5 100644 --- a/crates/gpui/src/platform/windows/events.rs +++ b/crates/gpui/src/platform/windows/events.rs @@ -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);