// Copyright (c) 2012-2022 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; /// /// Represents a DirectX 12 swap chain back buffer wrapper object. /// class BackBufferDX12 : public ResourceOwnerDX12 { public: /// /// The render target surface handle. /// GPUTextureViewDX12 Handle; public: /// /// Setup backbuffer wrapper /// /// Parent window /// Back buffer DirectX 12 resource void Setup(GPUSwapChainDX12* window, ID3D12Resource* backbuffer); /// /// Release references to the backbuffer /// void Release(); public: // [ResourceOwnerDX12] GPUResource* AsGPUResource() const override { return nullptr; } }; /// /// Graphics Device rendering output for DirectX 12 backend. /// class GPUSwapChainDX12 : public GPUResourceDX12 { 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> _backBuffers; public: GPUSwapChainDX12(GPUDeviceDX12* device, Window* window); public: /// /// Gets current backbuffer resource. /// /// The backbuffer resource. ID3D12Resource* GetBackBuffer() const { return _backBuffers[_currentFrameIndex].GetResource(); } /// /// Gets render target handle for DirectX 12 backend. /// /// The render target handle. 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