wip

Junkui Zhang created

Change summary

crates/gpui/src/platform/windows/directx_renderer.rs | 32 ++++++++-----
crates/gpui/src/platform/windows/events.rs           |  4 -
2 files changed, 19 insertions(+), 17 deletions(-)

Detailed changes

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<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(())
     }
 }

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);