From 9e3c08db40b8916968b9f30096c7be3f00ce9647 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:44:51 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- gfx/thebes/DeviceManagerDx.h | 217 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 gfx/thebes/DeviceManagerDx.h (limited to 'gfx/thebes/DeviceManagerDx.h') diff --git a/gfx/thebes/DeviceManagerDx.h b/gfx/thebes/DeviceManagerDx.h new file mode 100644 index 0000000000..d6d2259d9a --- /dev/null +++ b/gfx/thebes/DeviceManagerDx.h @@ -0,0 +1,217 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_gfx_thebes_DeviceManagerDx_h +#define mozilla_gfx_thebes_DeviceManagerDx_h + +#include "gfxPlatform.h" +#include "gfxTelemetry.h" +#include "gfxTypes.h" +#include "mozilla/Maybe.h" +#include "mozilla/Mutex.h" +#include "mozilla/RefPtr.h" +#include "mozilla/StaticPtr.h" +#include "mozilla/gfx/GraphicsMessages.h" +#include "nsTArray.h" +#include "nsWindowsHelpers.h" + +#include +#include + +#include +#include +#include + +// This header is available in the June 2010 SDK and in the Win8 SDK +#include +// Win 8.0 SDK types we'll need when building using older sdks. +#if !defined(D3D_FEATURE_LEVEL_11_1) // defined in the 8.0 SDK only +# define D3D_FEATURE_LEVEL_11_1 static_cast(0xb100) +# define D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION 2048 +# define D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION 4096 +#endif + +struct ID3D11Device; +struct IDCompositionDevice2; +struct IDirectDraw7; + +namespace mozilla { +class ScopedGfxFeatureReporter; +namespace layers { +class DeviceAttachmentsD3D11; +} // namespace layers + +namespace gfx { +class FeatureState; + +class DeviceManagerDx final { + public: + static void Init(); + static void Shutdown(); + + DeviceManagerDx(); + ~DeviceManagerDx(); + + static DeviceManagerDx* Get() { return sInstance; } + + RefPtr GetCompositorDevice(); + RefPtr GetContentDevice(); + RefPtr GetCanvasDevice(); + RefPtr GetImageDevice(); + RefPtr GetDirectCompositionDevice(); + RefPtr GetVRDevice(); + RefPtr CreateDecoderDevice(bool aHardwareWebRender); + RefPtr CreateMediaEngineDevice(); + IDirectDraw7* GetDirectDraw(); + + unsigned GetCompositorFeatureLevel() const; + bool TextureSharingWorks(); + bool IsWARP(); + bool CanUseNV12(); + bool CanUseP010(); + bool CanUseP016(); + bool CanUseDComp(); + + // Returns true if we can create a texture with + // D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX and also + // upload texture data during the CreateTexture2D + // call. This crashes on some devices, so we might + // need to avoid it. + bool CanInitializeKeyedMutexTextures(); + + // Intel devices on older windows versions seem to occasionally have + // stability issues when supplying InitData to CreateTexture2D. + bool HasCrashyInitData(); + + // Enumerate and return all outputs on the current adapter. + nsTArray EnumerateOutputs(); + + // find the IDXGIOutput with a description.Monitor matching + // 'monitor'; returns false if not found or some error occurred. + bool GetOutputFromMonitor(HMONITOR monitor, RefPtr* aOutOutput); + + // Check if the current adapter supports hardware stretching + void CheckHardwareStretchingSupport(HwStretchingSupport& aRv); + + bool CreateCompositorDevices(); + void CreateContentDevices(); + void CreateDirectCompositionDevice(); + bool CreateCanvasDevice(); + + static HANDLE CreateDCompSurfaceHandle(); + + void GetCompositorDevices( + RefPtr* aOutDevice, + RefPtr* aOutAttachments); + + void ImportDeviceInfo(const D3D11DeviceStatus& aDeviceStatus); + + // Returns whether the device info was exported. + bool ExportDeviceInfo(D3D11DeviceStatus* aOut); + + void ResetDevices(); + void InitializeDirectDraw(); + + // Reset and reacquire the devices if a reset has happened. + // Returns whether a reset occurred not whether reacquiring + // was successful. + bool MaybeResetAndReacquireDevices(); + + // Test whether we can acquire a DXGI 1.2-compatible adapter. This should + // only be called on startup before devices are initialized. + bool CheckRemotePresentSupport(); + + // Device reset helpers. + bool HasDeviceReset(DeviceResetReason* aOutReason = nullptr); + + // Note: these set the cached device reset reason, which will be picked up + // on the next frame. + void ForceDeviceReset(ForcedDeviceResetReason aReason); + + private: + void ResetDevicesLocked() MOZ_REQUIRES(mDeviceLock); + + // Device reset helpers. + bool HasDeviceResetLocked(DeviceResetReason* aOutReason = nullptr) + MOZ_REQUIRES(mDeviceLock); + + // Pre-load any compositor resources that are expensive, and are needed when + // we attempt to create a compositor. + static void PreloadAttachmentsOnCompositorThread(); + + already_AddRefed GetDXGIAdapter(); + IDXGIAdapter1* GetDXGIAdapterLocked() MOZ_REQUIRES(mDeviceLock); + + void DisableD3D11AfterCrash(); + + bool CreateCompositorDevicesLocked() MOZ_REQUIRES(mDeviceLock); + void CreateContentDevicesLocked() MOZ_REQUIRES(mDeviceLock); + void CreateDirectCompositionDeviceLocked() MOZ_REQUIRES(mDeviceLock); + bool CreateCanvasDeviceLocked() MOZ_REQUIRES(mDeviceLock); + + void CreateCompositorDevice(mozilla::gfx::FeatureState& d3d11) + MOZ_REQUIRES(mDeviceLock); + bool CreateCompositorDeviceHelper(mozilla::gfx::FeatureState& aD3d11, + IDXGIAdapter1* aAdapter, + bool aAttemptVideoSupport, + RefPtr& aOutDevice) + MOZ_REQUIRES(mDeviceLock); + + void CreateWARPCompositorDevice() MOZ_REQUIRES(mDeviceLock); + bool CreateVRDevice() MOZ_REQUIRES(mDeviceLock); + + mozilla::gfx::FeatureStatus CreateContentDevice() MOZ_REQUIRES(mDeviceLock); + + bool CreateDevice(IDXGIAdapter* aAdapter, D3D_DRIVER_TYPE aDriverType, + UINT aFlags, HRESULT& aResOut, + RefPtr& aOutDevice) MOZ_REQUIRES(mDeviceLock); + + bool ContentAdapterIsParentAdapter(ID3D11Device* device) + MOZ_REQUIRES(mDeviceLock); + + bool LoadD3D11(); + bool LoadDcomp(); + void ReleaseD3D11() MOZ_REQUIRES(mDeviceLock); + + // Call GetDeviceRemovedReason on each device until one returns + // a failure. + bool GetAnyDeviceRemovedReason(DeviceResetReason* aOutReason) + MOZ_REQUIRES(mDeviceLock); + + private: + static StaticAutoPtr sInstance; + + // This is assigned during device creation. Afterwards, it is released if + // devices failed, and "forgotten" if devices succeeded (meaning, we leak + // the ref and unassign the module). + nsModuleHandle mD3D11Module; + + nsModuleHandle mDcompModule; + + mutable mozilla::Mutex mDeviceLock; + nsTArray mFeatureLevels MOZ_GUARDED_BY(mDeviceLock); + RefPtr mAdapter MOZ_GUARDED_BY(mDeviceLock); + RefPtr mCompositorDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mContentDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mCanvasDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mImageDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mVRDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mDecoderDevice MOZ_GUARDED_BY(mDeviceLock); + RefPtr mDirectCompositionDevice + MOZ_GUARDED_BY(mDeviceLock); + RefPtr mCompositorAttachments + MOZ_GUARDED_BY(mDeviceLock); + bool mCompositorDeviceSupportsVideo MOZ_GUARDED_BY(mDeviceLock); + Maybe mDeviceStatus MOZ_GUARDED_BY(mDeviceLock); + Maybe mDeviceResetReason MOZ_GUARDED_BY(mDeviceLock); + + nsModuleHandle mDirectDrawDLL; + RefPtr mDirectDraw; +}; + +} // namespace gfx +} // namespace mozilla + +#endif // mozilla_gfx_thebes_DeviceManagerDx_h -- cgit v1.2.3