Files
UnrealEngine/Engine/Source/Runtime/Windows/D3D11RHI/Public/D3D11Viewport.h
2025-05-18 13:04:45 +08:00

172 lines
5.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
D3D11Viewport.h: D3D viewport RHI definitions.
=============================================================================*/
#pragma once
#include "D3D11Resources.h"
#include "RenderResource.h"
#include "RenderUtils.h"
#include "RHIResources.h"
#include "Windows/D3D11ThirdParty.h"
#include "DXGIUtilities.h"
/** A D3D event query resource. */
class FD3D11EventQuery
{
public:
/** Initialization constructor. */
D3D11RHI_API FD3D11EventQuery(class FD3D11DynamicRHI* InD3DRHI);
/** Issues an event for the query to poll. */
D3D11RHI_API void IssueEvent();
/** Waits for the event query to finish. */
D3D11RHI_API void WaitForCompletion();
private:
FD3D11DynamicRHI* D3DRHI;
TRefCountPtr<ID3D11Query> Query;
};
class FD3D11Viewport : public FRHIViewport
{
public:
enum ED3DViewportValidFlags : uint32
{
VIEWPORT_INVALID = 0x1,
VIEWPORT_FULLSCREEN_LOST = 0x2,
};
FD3D11Viewport(class FD3D11DynamicRHI* InD3DRHI) : D3DRHI(InD3DRHI), PresentFailCount(0), ValidState (0), FrameSyncEvent(InD3DRHI) {}
D3D11RHI_API FD3D11Viewport(class FD3D11DynamicRHI* InD3DRHI, HWND InWindowHandle, uint32 InSizeX, uint32 InSizeY, bool bInIsFullscreen, EPixelFormat InPreferredPixelFormat);
D3D11RHI_API ~FD3D11Viewport();
D3D11RHI_API virtual void Resize(uint32 InSizeX, uint32 InSizeY, bool bInIsFullscreen, EPixelFormat PreferredPixelFormat);
/**
* If the swap chain has been invalidated by DXGI, resets the swap chain to the expected state; otherwise, does nothing.
* Called once/frame by the game thread on all viewports.
* @param bIgnoreFocus - Whether the reset should happen regardless of whether the window is focused.
*/
D3D11RHI_API void ConditionalResetSwapChain(bool bIgnoreFocus);
/**
* Called whenever the Viewport is moved to see if it has moved between HDR or LDR monitors
*/
D3D11RHI_API void CheckHDRMonitorStatus();
/** Presents the swap chain.
* Returns true if Present was done by Engine.
*/
D3D11RHI_API bool Present(IRHICommandContext& RHICmdContext, bool bLockToVsync);
// Accessors.
FIntPoint GetSizeXY() const { return FIntPoint(SizeX, SizeY); }
FD3D11Texture* GetBackBuffer() const { return BackBuffer; }
virtual void WaitForFrameEventCompletion() override
{
FrameSyncEvent.WaitForCompletion();
}
virtual void IssueFrameEvent() override
{
FrameSyncEvent.IssueEvent();
}
IDXGISwapChain* GetSwapChain() const { return SwapChain; }
virtual void* GetNativeSwapChain() const override;
virtual void* GetNativeBackBufferTexture() const override;
virtual void* GetNativeBackBufferRT() const override;
virtual void SetCustomPresent(FRHICustomPresent* InCustomPresent) override
{
CustomPresent = InCustomPresent;
}
virtual FRHICustomPresent* GetCustomPresent() const { return CustomPresent; }
virtual void* GetNativeWindow(void** AddParam = nullptr) const override { return (void*)WindowHandle; }
static D3D11RHI_API FD3D11Texture* GetSwapChainSurface(FD3D11DynamicRHI* D3DRHI, EPixelFormat PixelFormat, uint32 SizeX, uint32 SizeY, IDXGISwapChain* SwapChain);
static DXGI_FORMAT GetRenderTargetFormat(EPixelFormat PixelFormat)
{
return UE::DXGIUtilities::GetSwapChainFormat(PixelFormat);
}
protected:
D3D11RHI_API void ResetSwapChainInternal(bool bIgnoreFocus);
/** Gets the swap chain flags */
D3D11RHI_API uint32 GetSwapChainFlags();
/** Presents the frame synchronizing with DWM. */
D3D11RHI_API void PresentWithVsyncDWM(IRHICommandContext& RHICmdContext);
/**
* Presents the swap chain checking the return result.
* Returns true if Present was done by Engine.
*/
D3D11RHI_API bool PresentChecked(IRHICommandContext& RHICmdContext, int32 SyncInterval);
/** Enable HDR meta data transmission and set the necessary color space. */
void EnableHDR();
/** Disable HDR meta data transmission and set the necessary color space. */
void ShutdownHDR();
FD3D11DynamicRHI* D3DRHI;
uint64 LastFlipTime;
uint64 LastFrameComplete;
uint64 LastCompleteTime;
int32 SyncCounter;
bool bSyncedLastFrame;
HWND WindowHandle;
uint32 MaximumFrameLatency;
uint32 SizeX;
uint32 SizeY;
uint32 BackBufferCount;
uint32 PresentFailCount;
TAtomic<uint32> ValidState;
EPixelFormat PixelFormat;
EDisplayColorGamut DisplayColorGamut;
EDisplayOutputFormat DisplayOutputFormat;
bool bIsFullscreen;
bool bAllowTearing;
static D3D11RHI_API uint32 GSwapChainFlags;
TRefCountPtr<IDXGISwapChain> SwapChain;
TRefCountPtr<FD3D11Texture> BackBuffer;
// Support for selecting non-default output for display in fullscreen exclusive
TRefCountPtr<IDXGIOutput> ForcedFullscreenOutput;
bool bForcedFullscreenDisplay;
// Whether to create swap chain and use swap chain's back buffer surface,
// or don't create swap chain and create an off-screen back buffer surface.
// Currently used for pixel streaming plugin "windowless" mode to run in the cloud without on screen display.
bool bNeedSwapChain;
/** An event used to track the GPU's progress. */
FD3D11EventQuery FrameSyncEvent;
FCustomPresentRHIRef CustomPresent;
D3D11RHI_API DXGI_MODE_DESC SetupDXGI_MODE_DESC() const;
};
template<>
struct TD3D11ResourceTraits<FRHIViewport>
{
typedef FD3D11Viewport TConcreteType;
};