/** * Looking Glass * Copyright © 2017-2026 The Looking Glass Authors * https://looking-glass.io * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. */ #pragma once #include #include #include #include #include #include struct CD3D12Device; extern "C" { #include "common/types.h" } using namespace Microsoft::WRL; enum class PostProcessStatus { SUCCESS, BYPASS_EFFECT, FAILED }; struct D12FrameFormat { D3D12_RESOURCE_DESC desc = {}; unsigned width = 0; unsigned height = 0; FrameType format = FRAME_TYPE_INVALID; bool hdr = false; bool hdrPQ = false; }; class CPostProcessEffect { public: virtual ~CPostProcessEffect() {} virtual const char * GetName() const = 0; virtual PostProcessStatus SetFormat(const ComPtr& device, const D12FrameFormat& src, D12FrameFormat& dst) = 0; virtual void AdjustDamage(RECT dirtyRects[], unsigned * nbDirtyRects) { UNREFERENCED_PARAMETER(dirtyRects); UNREFERENCED_PARAMETER(nbDirtyRects); } virtual ComPtr Run(const ComPtr& device, const ComPtr& commandList, const ComPtr& src, RECT dirtyRects[], unsigned * nbDirtyRects) = 0; bool Enabled = false; }; class CPostProcessor { private: std::shared_ptr m_dx12Device; ComPtr m_device; std::vector> m_effects; D12FrameFormat m_srcFormat = {}; D12FrameFormat m_dstFormat = {}; bool m_effectsActive = false; public: bool Init(std::shared_ptr dx12Device); void Reset(); bool Configure(const D12FrameFormat& srcFormat, bool * formatChanged); void AdjustFrameDamage(RECT dirtyRects[], unsigned * nbDirtyRects); ComPtr Run( const ComPtr& commandList, const ComPtr& src, RECT dirtyRects[], unsigned * nbDirtyRects); const D12FrameFormat& GetOutputFormat() const { return m_dstFormat; } bool HasActiveEffects() const { return m_effectsActive; } };