summaryrefslogtreecommitdiffstats
path: root/tests/manual/rhi/shared/imgui/qrhiimgui_p.h
blob: ec86c2af7f4d3111ea6ec981b3fb893681120f0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef QRHIIMGUI_P_H
#define QRHIIMGUI_P_H

#include <rhi/qrhi.h>

QT_BEGIN_NAMESPACE

class QEvent;

class QRhiImguiRenderer
{
public:
    ~QRhiImguiRenderer();

    struct CmdListBuffer {
        quint32 offset;
        QByteArray data;
    };

    struct DrawCmd {
        int cmdListBufferIdx;
        int textureIndex;
        quint32 indexOffset;
        quint32 elemCount;
        QPointF itemPixelOffset;
        QVector4D clipRect;
    };

    struct StaticRenderData {
        QImage fontTextureData;
    };

    struct FrameRenderData {
        quint32 totalVbufSize = 0;
        quint32 totalIbufSize = 0;
        QVarLengthArray<CmdListBuffer, 4> vbuf;
        QVarLengthArray<CmdListBuffer, 4> ibuf;
        QVarLengthArray<DrawCmd, 4> draw;
        QSize outputPixelSize;
    };

    StaticRenderData sf;
    FrameRenderData f;

    void prepare(QRhi *rhi,
                 QRhiRenderTarget *rt,
                 QRhiCommandBuffer *cb,
                 const QMatrix4x4 &mvp,
                 float opacity = 1.0f,
                 float hdrWhiteLevelMultiplierOrZeroForSDRsRGB = 0.0f);
    void render();
    void releaseResources();

private:
    QRhi *m_rhi = nullptr;
    QRhiRenderTarget *m_rt = nullptr;
    QRhiCommandBuffer *m_cb = nullptr;

    std::unique_ptr<QRhiBuffer> m_vbuf;
    std::unique_ptr<QRhiBuffer> m_ibuf;
    std::unique_ptr<QRhiBuffer> m_ubuf;
    std::unique_ptr<QRhiGraphicsPipeline> m_ps;
    QVector<quint32> m_renderPassFormat;
    std::unique_ptr<QRhiSampler> m_sampler;

    struct Texture {
        QImage image;
        QRhiTexture *tex = nullptr;
        QRhiShaderResourceBindings *srb = nullptr;
    };
    QVector<Texture> m_textures;
};

class QRhiImgui
{
public:
    QRhiImgui();
    ~QRhiImgui();

    using FrameFunc = std::function<void()>;
    void nextFrame(const QSizeF &logicalOutputSize, float dpr, const QPointF &logicalOffset, FrameFunc frameFunc);
    void syncRenderer(QRhiImguiRenderer *renderer);
    bool processEvent(QEvent *e);

    void rebuildFontAtlas();

private:
    QRhiImguiRenderer::StaticRenderData sf;
    QRhiImguiRenderer::FrameRenderData f;
    Qt::MouseButtons pressedMouseButtons;
};

QT_END_NAMESPACE

#endif