/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWebEngine module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef COMPOSITOR_H
#define COMPOSITOR_H

#include "base/memory/weak_ptr.h"
#include "components/viz/common/frame_timing_details.h"
#include "components/viz/common/frame_sinks/begin_frame_source.h"
#include "components/viz/common/quads/compositor_frame.h"

#include <QtCore/qglobal.h>
#include <QtCore/qshareddata.h>

#include <QtCore/qglobal.h>
#include <QtCore/qshareddata.h>

QT_BEGIN_NAMESPACE
class QSGNode;
QT_END_NAMESPACE

namespace content {
class RenderWidgetHost;
}
namespace viz {
struct ReturnedResource;
namespace mojom {
class CompositorFrameSinkClient;
} // namespace mojom
} // namespace viz

namespace QtWebEngineCore {

class CompositorResourceTracker;
class RenderWidgetHostViewQtDelegate;

// Receives viz::CompositorFrames from child compositors and provides QSGNodes
// to the Qt Quick renderer.
//
// The life cycle of a frame:
//
//   Step 1. A new CompositorFrame is received from child compositors and handed
//   off to submitFrame(). The new frame will start off in a pending state.
//
//   Step 2. Once the new frame is ready to be rendered, Compositor will notify
//   the client by running the callback given to submitFrame().
//
//   Step 3. Once the client is ready to render, updatePaintNode() should be
//   called to receive the scene graph for the new frame. This call will commit
//   the pending frame. Until the next frame is ready, all subsequent calls to
//   updatePaintNode() will keep using this same committed frame.
//
//   Step 4. The Compositor will return unneeded resources back to the child
//   compositors. Go to step 1.
class Compositor final : private viz::BeginFrameObserverBase
{
public:
    explicit Compositor(content::RenderWidgetHost *host);
    ~Compositor() override;

    void setFrameSinkClient(viz::mojom::CompositorFrameSinkClient *frameSinkClient);
    void setNeedsBeginFrames(bool needsBeginFrames);

    void submitFrame(viz::CompositorFrame frame, base::OnceClosure callback);
    QSGNode *updatePaintNode(QSGNode *oldNode, RenderWidgetHostViewQtDelegate *viewDelegate);

private:
    void runSubmitCallback();
    void notifyFrameCommitted();
    void sendPresentationFeedback(uint frame_token);

    // viz::BeginFrameObserverBase
    bool OnBeginFrameDerivedImpl(const viz::BeginFrameArgs &args) override;
    void OnBeginFrameSourcePausedChanged(bool paused) override;

    viz::CompositorFrame m_committedFrame;
    viz::CompositorFrame m_pendingFrame;
    base::OnceClosure m_submitCallback;
    std::unique_ptr<CompositorResourceTracker> m_resourceTracker;
    content::RenderWidgetHost *m_host;
    std::unique_ptr<viz::SyntheticBeginFrameSource> m_beginFrameSource;
    base::flat_map<uint32_t, viz::FrameTimingDetails> m_presentations;
    viz::mojom::CompositorFrameSinkClient *m_frameSinkClient = nullptr;
    bool m_updatePaintNodeShouldCommit = false;
    bool m_needsBeginFrames = false;

    scoped_refptr<base::SingleThreadTaskRunner> m_taskRunner;
    base::WeakPtrFactory<Compositor> m_weakPtrFactory{this};

    DISALLOW_COPY_AND_ASSIGN(Compositor);
};

} // namespace QtWebEngineCore

#endif // !COMPOSITOR_H
