Commit da791e3e by Geoff Lang Committed by Commit Bot

D3D11: Disable CompositorNativeWindow11 in Chromium builds.

CompositorNativeWindow11's IsValidNativeWindow can only return true or crash. If a user passes in an invalid window handle, ANGLE's D3D11 backend will always crash. Ideally this window type would be exposed through an extension and the user passes in an enum telling ANGLE that the window is an ISpriteVisual instead of ANGLE trying to detect it from a void pointer. Bug: chromium:1176118 Change-Id: Ia7568adcd929dcd9200c7da2d0a991da55e1e89a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2846800Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent 908ead38
......@@ -156,6 +156,11 @@ declare_args() {
(is_debug || dcheck_always_on) && !is_mac &&
(!is_android || ndk_api_level_at_least_26)
# ISpriteVisual windows cannot be validated and can lead to crashes if an invalid window is
# provided to ANGLE. Disable them for non-standalone ANGLE builds. crbug.com/1176118
angle_enable_d3d11_compositor_native_window =
angle_enable_d3d11 && angle_standalone
# Disable overlay by default
angle_enable_overlay = false
......
......@@ -256,8 +256,6 @@ if (angle_enable_d3d11) {
if (angle_is_winuwp) {
_d3d11_backend_sources += [
"d3d11/converged/CompositorNativeWindow11.cpp",
"d3d11/converged/CompositorNativeWindow11.h",
"d3d11/winrt/CoreWindowNativeWindow.cpp",
"d3d11/winrt/CoreWindowNativeWindow.h",
"d3d11/winrt/InspectableNativeWindow.cpp",
......@@ -269,12 +267,16 @@ if (angle_enable_d3d11) {
]
} else {
_d3d11_backend_sources += [
"d3d11/converged/CompositorNativeWindow11.cpp",
"d3d11/converged/CompositorNativeWindow11.h",
"d3d11/win32/NativeWindow11Win32.cpp",
"d3d11/win32/NativeWindow11Win32.h",
]
}
if (angle_enable_d3d11_compositor_native_window) {
_d3d11_backend_sources += [
"d3d11/converged/CompositorNativeWindow11.cpp",
"d3d11/converged/CompositorNativeWindow11.h",
]
}
import("d3d11/d3d11_blit_shaders_autogen.gni")
_d3d11_backend_sources += libangle_d3d11_blit_shaders
......@@ -315,6 +317,9 @@ if (angle_enable_d3d9) {
if (angle_enable_d3d11) {
config("angle_d3d11_backend_config") {
defines = [ "ANGLE_ENABLE_D3D11" ]
if (angle_enable_d3d11_compositor_native_window) {
defines += [ "ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW" ]
}
}
angle_source_set("angle_d3d11_backend") {
......
......@@ -65,13 +65,15 @@
#include "libANGLE/trace.h"
#ifdef ANGLE_ENABLE_WINDOWS_UWP
# include "libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h"
# include "libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h"
#else
# include "libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h"
# include "libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h"
#endif
#ifdef ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
# include "libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h"
#endif
// Enable ANGLE_SKIP_DXGI_1_2_CHECK if there is not a possibility of using cross-process
// HWNDs or the Windows 7 Platform Update (KB2670838) is expected to be installed.
#ifndef ANGLE_SKIP_DXGI_1_2_CHECK
......@@ -1317,11 +1319,13 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions
// All D3D feature levels support robust resource init
outExtensions->robustResourceInitialization = true;
#ifdef ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
// Compositor Native Window capabilies require WinVer >= 1803
if (CompositorNativeWindow11::IsSupportedWinRelease())
{
outExtensions->windowsUIComposition = true;
}
#endif
}
angle::Result Renderer11::flush(Context11 *context11)
......@@ -1376,24 +1380,28 @@ angle::Result Renderer11::finish(Context11 *context11)
bool Renderer11::isValidNativeWindow(EGLNativeWindowType window) const
{
static_assert(sizeof(ABI::Windows::UI::Composition::SpriteVisual *) == sizeof(HWND),
"Pointer size must match Window Handle size");
#if defined(ANGLE_ENABLE_WINDOWS_UWP)
bool winrt = NativeWindow11WinRT::IsValidNativeWindow(window);
if (!winrt)
if (NativeWindow11WinRT::IsValidNativeWindow(window))
{
return CompositorNativeWindow11::IsValidNativeWindow(window);
}
return true;
}
#else
if (NativeWindow11Win32::IsValidNativeWindow(window))
{
return true;
}
#endif
return CompositorNativeWindow11::IsValidNativeWindow(window);
#ifdef ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
static_assert(sizeof(ABI::Windows::UI::Composition::SpriteVisual *) == sizeof(HWND),
"Pointer size must match Window Handle size");
if (CompositorNativeWindow11::IsValidNativeWindow(window))
{
return true;
}
#endif
return false;
}
NativeWindowD3D *Renderer11::createNativeWindow(EGLNativeWindowType window,
......@@ -1401,31 +1409,28 @@ NativeWindowD3D *Renderer11::createNativeWindow(EGLNativeWindowType window,
const egl::AttributeMap &attribs) const
{
#if defined(ANGLE_ENABLE_WINDOWS_UWP)
auto useWinUiComp = window != nullptr && CompositorNativeWindow11::IsValidNativeWindow(window);
if (useWinUiComp)
{
return new CompositorNativeWindow11(window, config->alphaSize > 0);
}
else
if (window == nullptr || NativeWindow11WinRT::IsValidNativeWindow(window))
{
return new NativeWindow11WinRT(window, config->alphaSize > 0);
}
return nullptr;
#else
auto useWinUiComp = window != nullptr && !NativeWindow11Win32::IsValidNativeWindow(window) &&
CompositorNativeWindow11::IsValidNativeWindow(window);
if (useWinUiComp)
{
return new CompositorNativeWindow11(window, config->alphaSize > 0);
}
else
if (window == nullptr || NativeWindow11Win32::IsValidNativeWindow(window))
{
return new NativeWindow11Win32(
window, config->alphaSize > 0,
attribs.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE);
}
#endif
#ifdef ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
if (CompositorNativeWindow11::IsValidNativeWindow(window))
{
return new CompositorNativeWindow11(window, config->alphaSize > 0);
}
#endif
UNREACHABLE();
return nullptr;
}
egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
......
......@@ -7,22 +7,24 @@
// EGLDirectCompositionTest.cpp:
// Tests pertaining to DirectComposition and WindowsUIComposition.
#include <d3d11.h>
#include "test_utils/ANGLETest.h"
#include <DispatcherQueue.h>
#include <VersionHelpers.h>
#include <Windows.Foundation.h>
#include <windows.ui.composition.Desktop.h>
#include <windows.ui.composition.h>
#include <windows.ui.composition.interop.h>
#include <wrl.h>
#include <memory>
#include "libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h"
#include "util/OSWindow.h"
#include "util/com_utils.h"
#include "util/test_utils.h"
#ifdef ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
# include <d3d11.h>
# include "test_utils/ANGLETest.h"
# include <DispatcherQueue.h>
# include <VersionHelpers.h>
# include <Windows.Foundation.h>
# include <windows.ui.composition.Desktop.h>
# include <windows.ui.composition.h>
# include <windows.ui.composition.interop.h>
# include <wrl.h>
# include <memory>
# include "libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h"
# include "util/OSWindow.h"
# include "util/com_utils.h"
# include "util/test_utils.h"
using namespace angle;
using namespace ABI::Windows::System;
......@@ -294,3 +296,5 @@ TEST_P(EGLDirectCompositionTest, RenderSolidColor)
}
ANGLE_INSTANTIATE_TEST(EGLDirectCompositionTest, WithNoFixture(ES2_D3D11()));
#endif // ANGLE_ENABLE_D3D11_COMPOSITOR_NATIVE_WINDOW
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment