reenable transparency
This commit is contained in:
parent
ffbb47452d
commit
46fc76fdf8
2 changed files with 64 additions and 34 deletions
|
@ -1,4 +1,4 @@
|
|||
use std::sync::Arc;
|
||||
use std::{mem::ManuallyDrop, sync::Arc};
|
||||
|
||||
use ::util::ResultExt;
|
||||
use anyhow::{Context, Result};
|
||||
|
@ -37,7 +37,7 @@ pub(crate) struct DirectXDevices {
|
|||
}
|
||||
|
||||
struct DirectXContext {
|
||||
swap_chain: IDXGISwapChain1,
|
||||
swap_chain: ManuallyDrop<IDXGISwapChain1>,
|
||||
back_buffer: [Option<ID3D11RenderTargetView>; 1],
|
||||
viewport: [D3D11_VIEWPORT; 1],
|
||||
// #[cfg(not(feature = "enable-renderdoc"))]
|
||||
|
@ -212,13 +212,35 @@ impl DirectXRenderer {
|
|||
&mut self,
|
||||
background_appearance: WindowBackgroundAppearance,
|
||||
) -> Result<()> {
|
||||
if background_appearance != WindowBackgroundAppearance::Opaque {
|
||||
Err(anyhow::anyhow!(
|
||||
"Set transparent background not supported when feature \"enable-renderdoc\" is enabled."
|
||||
))
|
||||
} else {
|
||||
Ok(())
|
||||
let transparent = background_appearance != WindowBackgroundAppearance::Opaque;
|
||||
if self.transparent == transparent {
|
||||
return Ok(());
|
||||
}
|
||||
self.transparent = transparent;
|
||||
// unsafe {
|
||||
// // recreate the swapchain
|
||||
// self.devices.device_context.OMSetRenderTargets(None, None);
|
||||
// drop(self.context.back_buffer[0].take().unwrap());
|
||||
// ManuallyDrop::drop(&mut self.context.swap_chain);
|
||||
// self.context.swap_chain = create_swap_chain_default(
|
||||
// &self.devices.dxgi_factory,
|
||||
// &self.devices.device,
|
||||
// self.hwnd,
|
||||
// transparent,
|
||||
// )?;
|
||||
// self.context.back_buffer = [Some(set_render_target_view(
|
||||
// &self.context.swap_chain,
|
||||
// &self.devices.device,
|
||||
// &self.devices.device_context,
|
||||
// )?)];
|
||||
// self.context.viewport = set_viewport(
|
||||
// &self.devices.device_context,
|
||||
// self.context.viewport[0].Width,
|
||||
// self.context.viewport[0].Height,
|
||||
// );
|
||||
// set_rasterizer_state(&self.devices.device, &self.devices.device_context)?;
|
||||
// }
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn draw_shadows(&mut self, shadows: &[Shadow]) -> Result<()> {
|
||||
|
@ -851,6 +873,14 @@ struct PathSprite {
|
|||
color: Background,
|
||||
}
|
||||
|
||||
impl Drop for DirectXContext {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
ManuallyDrop::drop(&mut self.swap_chain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_dxgi_factory() -> Result<IDXGIFactory6> {
|
||||
#[cfg(debug_assertions)]
|
||||
|
@ -948,7 +978,7 @@ fn create_swap_chain_default(
|
|||
device: &ID3D11Device,
|
||||
hwnd: HWND,
|
||||
_transparent: bool,
|
||||
) -> Result<IDXGISwapChain1> {
|
||||
) -> Result<ManuallyDrop<IDXGISwapChain1>> {
|
||||
use windows::Win32::Graphics::Dxgi::DXGI_MWA_NO_ALT_ENTER;
|
||||
|
||||
let desc = DXGI_SWAP_CHAIN_DESC1 {
|
||||
|
@ -970,7 +1000,7 @@ fn create_swap_chain_default(
|
|||
let swap_chain =
|
||||
unsafe { dxgi_factory.CreateSwapChainForHwnd(device, hwnd, &desc, None, None) }?;
|
||||
unsafe { dxgi_factory.MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER) }?;
|
||||
Ok(swap_chain)
|
||||
Ok(ManuallyDrop::new(swap_chain))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
@ -384,8 +384,7 @@ impl WindowsWindow {
|
|||
(WS_EX_TOOLWINDOW | WS_EX_LAYERED, WINDOW_STYLE(0x0))
|
||||
} else {
|
||||
(
|
||||
// WS_EX_APPWINDOW | WS_EX_LAYERED,
|
||||
WS_EX_APPWINDOW,
|
||||
WS_EX_APPWINDOW | WS_EX_LAYERED,
|
||||
WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX,
|
||||
)
|
||||
};
|
||||
|
@ -403,7 +402,7 @@ impl WindowsWindow {
|
|||
handle,
|
||||
hide_title_bar,
|
||||
display,
|
||||
transparent: true,
|
||||
transparent: false,
|
||||
is_movable: params.is_movable,
|
||||
min_size: params.window_min_size,
|
||||
executor,
|
||||
|
@ -462,7 +461,7 @@ impl WindowsWindow {
|
|||
// window is going to be composited with per-pixel alpha, but the render
|
||||
// pipeline is responsible for effectively calling UpdateLayeredWindow
|
||||
// at the appropriate time.
|
||||
// unsafe { SetLayeredWindowAttributes(hwnd, COLORREF(0), 255, LWA_ALPHA)? };
|
||||
unsafe { SetLayeredWindowAttributes(hwnd, COLORREF(0), 255, LWA_ALPHA)? };
|
||||
|
||||
Ok(Self(state_ptr))
|
||||
}
|
||||
|
@ -707,27 +706,28 @@ impl PlatformWindow for WindowsWindow {
|
|||
}
|
||||
|
||||
fn set_background_appearance(&self, background_appearance: WindowBackgroundAppearance) {
|
||||
// let mut window_state = self.0.state.borrow_mut();
|
||||
// todo(zjk)
|
||||
// window_state
|
||||
// .renderer
|
||||
// .update_transparency(background_appearance != WindowBackgroundAppearance::Opaque);
|
||||
let mut window_state = self.0.state.borrow_mut();
|
||||
window_state
|
||||
.renderer
|
||||
.update_transparency(background_appearance)
|
||||
.context("Updating window transparency")
|
||||
.log_err();
|
||||
|
||||
// match background_appearance {
|
||||
// WindowBackgroundAppearance::Opaque => {
|
||||
// // ACCENT_DISABLED
|
||||
// set_window_composition_attribute(window_state.hwnd, None, 0);
|
||||
// }
|
||||
// WindowBackgroundAppearance::Transparent => {
|
||||
// // Use ACCENT_ENABLE_TRANSPARENTGRADIENT for transparent background
|
||||
// set_window_composition_attribute(window_state.hwnd, None, 2);
|
||||
// }
|
||||
// WindowBackgroundAppearance::Blurred => {
|
||||
// // Enable acrylic blur
|
||||
// // ACCENT_ENABLE_ACRYLICBLURBEHIND
|
||||
// set_window_composition_attribute(window_state.hwnd, Some((0, 0, 0, 0)), 4);
|
||||
// }
|
||||
// }
|
||||
match background_appearance {
|
||||
WindowBackgroundAppearance::Opaque => {
|
||||
// ACCENT_DISABLED
|
||||
set_window_composition_attribute(window_state.hwnd, None, 0);
|
||||
}
|
||||
WindowBackgroundAppearance::Transparent => {
|
||||
// Use ACCENT_ENABLE_TRANSPARENTGRADIENT for transparent background
|
||||
set_window_composition_attribute(window_state.hwnd, None, 2);
|
||||
}
|
||||
WindowBackgroundAppearance::Blurred => {
|
||||
// Enable acrylic blur
|
||||
// ACCENT_ENABLE_ACRYLICBLURBEHIND
|
||||
set_window_composition_attribute(window_state.hwnd, Some((0, 0, 0, 0)), 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn minimize(&self) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue