Files
FlaxEngine/Source/Engine/GraphicsDevice/DirectX/DX12/GPUSwapChainDX12.h
2023-01-10 15:29:37 +01:00

120 lines
2.8 KiB
C++

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#pragma once
#include "GPUDeviceDX12.h"
#include "Engine/Graphics/GPUSwapChain.h"
#include "../IncludeDirectXHeaders.h"
#include "ResourceOwnerDX12.h"
#include "GPUTextureDX12.h"
#if GRAPHICS_API_DIRECTX12
class GPUSwapChainDX12;
/// <summary>
/// Represents a DirectX 12 swap chain back buffer wrapper object.
/// </summary>
class BackBufferDX12 : public ResourceOwnerDX12
{
public:
/// <summary>
/// The render target surface handle.
/// </summary>
GPUTextureViewDX12 Handle;
public:
/// <summary>
/// Setup backbuffer wrapper
/// </summary>
/// <param name="window">Parent window</param>
/// <param name="backbuffer">Back buffer DirectX 12 resource</param>
void Setup(GPUSwapChainDX12* window, ID3D12Resource* backbuffer);
/// <summary>
/// Release references to the backbuffer
/// </summary>
void Release();
public:
// [ResourceOwnerDX12]
GPUResource* AsGPUResource() const override
{
return nullptr;
}
};
/// <summary>
/// Graphics Device rendering output for DirectX 12 backend.
/// </summary>
class GPUSwapChainDX12 : public GPUResourceDX12<GPUSwapChain>
{
friend class WindowsWindow;
friend class GPUContextDX12;
friend GPUDeviceDX12;
private:
bool _allowTearing, _isFullscreen;
HWND _windowHandle;
IDXGISwapChain3* _swapChain;
int32 _currentFrameIndex;
#if PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE
D3D12XBOX_FRAME_PIPELINE_TOKEN _framePipelineToken;
#endif
Array<BackBufferDX12, FixedAllocation<4>> _backBuffers;
public:
GPUSwapChainDX12(GPUDeviceDX12* device, Window* window);
public:
/// <summary>
/// Gets current backbuffer resource.
/// </summary>
/// <returns>The backbuffer resource.</returns>
ID3D12Resource* GetBackBuffer() const
{
return _backBuffers[_currentFrameIndex].GetResource();
}
/// <summary>
/// Gets render target handle for DirectX 12 backend.
/// </summary>
/// <returns>The render target handle.</returns>
const GPUTextureViewDX12* GetBackBufferHandleDX12() const
{
return &_backBuffers[_currentFrameIndex].Handle;
}
private:
void getBackBuffer();
void releaseBackBuffer();
public:
// [GPUSwapChain]
bool IsFullscreen() override;
void SetFullscreen(bool isFullscreen) override;
GPUTextureView* GetBackBufferView() override;
#if PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE
void Begin(RenderTask* task) override;
#endif
void End(RenderTask* task) override;
void Present(bool vsync) override;
bool Resize(int32 width, int32 height) override;
void CopyBackbuffer(GPUContext* context, GPUTexture* dst) override;
protected:
// [GPUResourceDX12]
void OnReleaseGPU() override;
};
#endif