Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
befecc46 by Fatih Uzunoglu at 2025-01-09T15:29:39+00:00
qt: enable Windows 11 22H2 native acrylic backdrop effect if
`WS_EX_NOREDIRECTIONBITMAP` is used
- - - - -
874925c0 by Fatih Uzunoglu at 2025-01-09T15:29:39+00:00
qt: use `WS_EX_NOREDIRECTIONBITMAP` for the main window in
CompositorDirectComposition
- This fixes the window flashing white when opened, which is really annoying
when
the interface is dark.
- This fixes the white background getting exposed until the scene covers the new
area when the window is resized.
- This increases performance due to not having to copy buffers (within GPU, or
inter
GPU-CPU unlike WS_EX_LAYERED).
- This makes it possible to use the native acrylic backdrop effect that Windows
11
22H2 provides.
- - - - -
2 changed files:
- modules/gui/qt/maininterface/compositor_dcomp.cpp
- modules/gui/qt/maininterface/win32windoweffects_module.cpp
Changes:
=====================================
modules/gui/qt/maininterface/compositor_dcomp.cpp
=====================================
@@ -253,7 +253,37 @@ bool
CompositorDirectComposition::makeMainInterface(MainCtx* mainCtx)
&CompositorDirectComposition::setup,
Qt::SingleShotConnection);
- m_quickView->create();
+ {
+ // Express the desire to use WS_EX_NOREDIRECTIONBITMAP, it has the
following advantages:
+ // - Increased performance due to not having to copy buffers (within
GPU, or inter GPU-CPU unlike WS_EX_LAYERED).
+ // - Win32 window background brush is invalidated, so window does not
flash white when opened.
+ // - No more resize artifact until the opaque scene covers the new
area when the window is resized.
+ // - Make it possible to use the Windows 11 22H2 native acrylic
backdrop effect, because the white background does not remain as an artifact.
+ // When the window has a frame (currently it is the case for both
SSD and CSD), clear color does not clear that background, which means
+ // that the window should not be exposed (transparent UI). Currently
there is either the acrylic simulation visual in the background which is
+ // completely opaque or the video visual or the UI visual does not
get transparent, so we don't suffer from this issue. With
`WS_EX_NOREDIRECTIONBITMAP`,
+ // the background does not paint a rectangle with
`WNDCLASSEX::hbrBackground`, even if `WS_EX_LAYERED` is not used, so we are
fine. The scene graph
+ // does not have anything in the window to clear, so clear color can
be transparent which means that the UI can be transparent and expose the window
+ // for the window to provide the (native) backdrop acrylic effect.
+
+ // WS_EX_NOREDIRECTIONBITMAP is only compatible with the flip
swapchain model and D3D backend.
+ // In CompositorDirectComposition::init(), we already ensure that D3D
is used (no OpenGL or Vulkan).
+ // Flip model is supported since Windows 8 and Qt does not use it only
if the following environment
+ // variable is set. Since it targets Windows 10+, it does *not* check
if flip model is supported and
+ // use the legacy swapchain model. For D3D12, flip model is always
used.
+ const bool legacySwapchainModelIsExplicitlyWanted =
qEnvironmentVariableIntValue("QT_D3D_NO_FLIP");
+
+ const char* const envDisableRedirectionSurface =
"QT_QPA_DISABLE_REDIRECTION_SURFACE";
+ const bool redirectionSurfaceIsExplicitlyWanted =
!qEnvironmentVariableIsEmpty(envDisableRedirectionSurface) &&
!qEnvironmentVariableIntValue(envDisableRedirectionSurface);
+
+ if (!legacySwapchainModelIsExplicitlyWanted &&
!redirectionSurfaceIsExplicitlyWanted)
+ qputenv(envDisableRedirectionSurface, "1"); // TODO: Other
QQuickWindow (toolbar editor, independent popups)
+
+ m_quickView->create();
+
+ if (!legacySwapchainModelIsExplicitlyWanted &&
!redirectionSurfaceIsExplicitlyWanted)
+ qunsetenv(envDisableRedirectionSurface); // NOTE: We need to
disable it, otherwise regular QWidget windows would have issues
+ }
const bool ret = commonGUICreate(quickViewPtr, quickViewPtr,
CompositorVideo::CAN_SHOW_PIP | CompositorVideo::HAS_ACRYLIC);
=====================================
modules/gui/qt/maininterface/win32windoweffects_module.cpp
=====================================
@@ -24,6 +24,7 @@
#include <cassert>
#include <dwmapi.h>
+#include <winuser.h>
static bool isEffectAvailable(const QWindow* window, const
WindowEffectsModule::Effect effect)
{
@@ -50,8 +51,13 @@ static bool isEffectAvailable(const QWindow* window, const
WindowEffectsModule::
// the custom solution has more chance to cause issues.
if (!window->flags().testFlag(Qt::FramelessWindowHint))
{
- qDebug("Target window is not frameless, window can not be
translucent for the Windows 11 22H2 native acrylic backdrop effect.");
- return false;
+ const auto extendedStyle = GetWindowLong((HWND)window->winId(),
GWL_EXSTYLE);
+ if (!(extendedStyle & 0x00200000L /* WS_EX_NOREDIRECTIONBITMAP */))
+ {
+ qDebug("Target window is not frameless and does not use
WS_EX_NOREDIRECTIONBITMAP, " \
+ "window can not be translucent for the Windows 11 22H2
native acrylic backdrop effect.");
+ return false;
+ }
}
return true;
default:
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/1ba2a2db89c832be6b553f155f4cff445b703e2c...874925c0fbcabf7490c938fdcaefe03e3cb6337c
--
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/1ba2a2db89c832be6b553f155f4cff445b703e2c...874925c0fbcabf7490c938fdcaefe03e3cb6337c
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits