From 0d8600bf1ee537bc9534b3380cb76ecfa8719e97 Mon Sep 17 00:00:00 2001 From: Junkui Zhang <364772080@qq.com> Date: Wed, 16 Jul 2025 22:20:38 +0800 Subject: [PATCH] checkpoint msaa --- .../src/platform/windows/directx_renderer.rs | 161 ++++++++++++++---- 1 file changed, 129 insertions(+), 32 deletions(-) diff --git a/crates/gpui/src/platform/windows/directx_renderer.rs b/crates/gpui/src/platform/windows/directx_renderer.rs index 410da3162d4f618035a97f2a2d9d7a95026a30ed..74c1c6828602392a8b8ab53cfe772e48ffbef99b 100644 --- a/crates/gpui/src/platform/windows/directx_renderer.rs +++ b/crates/gpui/src/platform/windows/directx_renderer.rs @@ -18,7 +18,7 @@ use windows::{ use crate::*; -const RENDER_TARGET_FORMAT: DXGI_FORMAT = DXGI_FORMAT_R8G8B8A8_UNORM; +const RENDER_TARGET_FORMAT: DXGI_FORMAT = DXGI_FORMAT_B8G8R8A8_UNORM; const BACK_BUFFER_FORMAT: DXGI_FORMAT = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; pub(crate) struct DirectXRenderer { @@ -41,7 +41,8 @@ pub(crate) struct DirectXDevices { struct DirectXContext { swap_chain: ManuallyDrop, - back_buffer: [Option; 1], + render_target: ManuallyDrop, + render_target_view: [Option; 1], msaa_target: ID3D11Texture2D, msaa_view: ID3D11RenderTargetView, viewport: [D3D11_VIEWPORT; 1], @@ -124,15 +125,48 @@ impl DirectXRenderer { self.atlas.clone() } - pub(crate) fn draw(&mut self, scene: &Scene) -> Result<()> { - pre_draw( + fn pre_draw(&self) -> Result<()> { + update_buffer( &self.devices.device_context, - &self.globals.global_params_buffer, - &self.context.viewport, - &self.context.back_buffer, - [0.0, 0.0, 0.0, 0.0], - &self.globals.blend_state, + self.globals.global_params_buffer[0].as_ref().unwrap(), + &[GlobalParams { + viewport_size: [ + self.context.viewport[0].Width, + self.context.viewport[0].Height, + ], + ..Default::default() + }], )?; + unsafe { + self.devices + .device_context + .ClearRenderTargetView(&self.context.msaa_view, &[0.0; 4]); + self.devices + .device_context + .OMSetRenderTargets(Some(&[Some(self.context.msaa_view.clone())]), None); + self.devices + .device_context + .RSSetViewports(Some(&self.context.viewport)); + self.devices.device_context.OMSetBlendState( + &self.globals.blend_state, + None, + 0xFFFFFFFF, + ); + } + Ok(()) + } + + pub(crate) fn draw(&mut self, scene: &Scene) -> Result<()> { + // pre_draw( + // &self.devices.device_context, + // &self.globals.global_params_buffer, + // &self.context.viewport, + // &self.context.back_buffer, + // [0.0, 0.0, 0.0, 0.0], + // &self.globals.blend_state, + // )?; + println!("Pre-draw: {:?}", self.context.render_target_view); + self.pre_draw()?; for batch in scene.batches() { match batch { PrimitiveBatch::Shadows(shadows) => self.draw_shadows(shadows), @@ -157,28 +191,56 @@ impl DirectXRenderer { scene.polychrome_sprites.len(), scene.surfaces.len(),))?; } - unsafe { self.context.swap_chain.Present(0, DXGI_PRESENT(0)) }.ok()?; + unsafe { + self.devices.device_context.ResolveSubresource( + &*self.context.render_target, + 0, + &self.context.msaa_target, + 0, + BACK_BUFFER_FORMAT, + ); + self.devices + .device_context + .OMSetRenderTargets(Some(&self.context.render_target_view), None); + self.context.swap_chain.Present(0, DXGI_PRESENT(0)).ok()?; + } Ok(()) } pub(crate) fn resize(&mut self, new_size: Size) -> Result<()> { - unsafe { self.devices.device_context.OMSetRenderTargets(None, None) }; - drop(self.context.back_buffer[0].take().unwrap()); + println!("Resize: {:?}", self.context.render_target_view); unsafe { - self.context.swap_chain.ResizeBuffers( - BUFFER_COUNT as u32, - new_size.width.0 as u32, - new_size.height.0 as u32, - RENDER_TARGET_FORMAT, - DXGI_SWAP_CHAIN_FLAG(0), - )?; + self.devices.device_context.OMSetRenderTargets(None, None); + ManuallyDrop::drop(&mut self.context.render_target); + } + drop(self.context.render_target_view[0].take().unwrap()); + unsafe { + self.context + .swap_chain + .ResizeBuffers( + BUFFER_COUNT as u32, + new_size.width.0 as u32, + new_size.height.0 as u32, + RENDER_TARGET_FORMAT, + DXGI_SWAP_CHAIN_FLAG(0), + ) + .unwrap(); + } + // let backbuffer = set_render_target_view( + // &self.context.swap_chain, + // &self.devices.device, + // &self.devices.device_context, + // )?; + let (render_target, render_target_view) = + create_render_target_and_its_view(&self.context.swap_chain, &self.devices.device) + .unwrap(); + self.context.render_target = render_target; + self.context.render_target_view = render_target_view; + unsafe { + self.devices + .device_context + .OMSetRenderTargets(Some(&self.context.render_target_view), None); } - let backbuffer = set_render_target_view( - &self.context.swap_chain, - &self.devices.device, - &self.devices.device_context, - )?; - self.context.back_buffer[0] = Some(backbuffer); let (msaa_target, msaa_view) = create_msaa_target_and_its_view( &self.devices.device, @@ -420,18 +482,26 @@ impl DirectXContext { // let direct_composition = DirectComposition::new(&devices.dxgi_device, hwnd)?; // #[cfg(not(feature = "enable-renderdoc"))] // direct_composition.set_swap_chain(&swap_chain)?; - let back_buffer = [Some(set_render_target_view( - &swap_chain, - &devices.device, - &devices.device_context, - )?)]; + let (render_target, render_target_view) = + create_render_target_and_its_view(&swap_chain, &devices.device)?; + // let back_buffer = [Some(set_render_target_view( + // &swap_chain, + // &devices.device, + // &devices.device_context, + // )?)]; let (msaa_target, msaa_view) = create_msaa_target_and_its_view(&devices.device, 1, 1)?; let viewport = set_viewport(&devices.device_context, 1.0, 1.0); + unsafe { + devices + .device_context + .OMSetRenderTargets(Some(&render_target_view), None); + } set_rasterizer_state(&devices.device, &devices.device_context)?; Ok(Self { swap_chain, - back_buffer, + render_target, + render_target_view, msaa_target, msaa_view, viewport, @@ -893,6 +963,7 @@ struct PathSprite { impl Drop for DirectXContext { fn drop(&mut self) { unsafe { + ManuallyDrop::drop(&mut self.render_target); ManuallyDrop::drop(&mut self.swap_chain); } } @@ -1020,6 +1091,30 @@ fn create_swap_chain_default( Ok(ManuallyDrop::new(swap_chain)) } +#[inline] +fn create_render_target_and_its_view( + swap_chain: &IDXGISwapChain1, + device: &ID3D11Device, +) -> Result<( + ManuallyDrop, + [Option; 1], +)> { + let render_target: ID3D11Texture2D = unsafe { swap_chain.GetBuffer(0) }?; + let desc = D3D11_RENDER_TARGET_VIEW_DESC { + Format: BACK_BUFFER_FORMAT, + ViewDimension: D3D11_RTV_DIMENSION_TEXTURE2D, + ..Default::default() + }; + let mut render_target_view = None; + unsafe { + device.CreateRenderTargetView(&render_target, Some(&desc), Some(&mut render_target_view))? + }; + Ok(( + ManuallyDrop::new(render_target), + [Some(render_target_view.unwrap())], + )) +} + #[inline] fn set_render_target_view( swap_chain: &IDXGISwapChain1, @@ -1043,6 +1138,7 @@ fn set_render_target_view( Ok(back_buffer) } +#[inline] fn create_msaa_target_and_its_view( device: &ID3D11Device, width: u32, @@ -1111,7 +1207,8 @@ fn set_rasterizer_state(device: &ID3D11Device, device_context: &ID3D11DeviceCont SlopeScaledDepthBias: 0.0, DepthClipEnable: true.into(), ScissorEnable: false.into(), - MultisampleEnable: false.into(), + // MultisampleEnable: false.into(), + MultisampleEnable: true.into(), AntialiasedLineEnable: false.into(), }; let rasterizer_state = unsafe {