Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
5#include <QGuiApplication>
6#include <QImage>
7#include <QFile>
8#include <rhi/qrhi.h>
9
10int main(int argc, char **argv)
11{
12 QGuiApplication app(argc, argv);
13
14 std::unique_ptr<QRhi> rhi;
15#if defined(Q_OS_WIN)
16 QRhiD3D12InitParams params;
17 rhi.reset(QRhi::create(QRhi::D3D12, &params));
18#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
20 rhi.reset(QRhi::create(QRhi::Metal, &params));
21#elif QT_CONFIG(vulkan)
22 QVulkanInstance inst;
23 inst.setExtensions(QRhiVulkanInitParams::preferredInstanceExtensions());
24 if (inst.create()) {
26 params.inst = &inst;
27 rhi.reset(QRhi::create(QRhi::Vulkan, &params));
28 } else {
29 qFatal("Failed to create Vulkan instance");
30 }
31#endif
32 if (rhi)
33 qDebug() << rhi->backendName() << rhi->driverInfo();
34 else
35 qFatal("Failed to initialize RHI");
36
37 float rotation = 0.0f;
38 float opacity = 1.0f;
39 int opacityDir = 1;
40
41 std::unique_ptr<QRhiTexture> tex(rhi->newTexture(QRhiTexture::RGBA8,
42 QSize(1280, 720),
43 1,
45 tex->create();
46 std::unique_ptr<QRhiTextureRenderTarget> rt(rhi->newTextureRenderTarget({ tex.get() }));
47 std::unique_ptr<QRhiRenderPassDescriptor> rp(rt->newCompatibleRenderPassDescriptor());
48 rt->setRenderPassDescriptor(rp.get());
49 rt->create();
50
51 QMatrix4x4 viewProjection = rhi->clipSpaceCorrMatrix();
52 viewProjection.perspective(45.0f, 1280 / 720.f, 0.01f, 1000.0f);
53 viewProjection.translate(0, 0, -4);
54
55 static float vertexData[] = { // Y up, CCW
56 0.0f, 0.5f, 1.0f, 0.0f, 0.0f,
57 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
58 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
59 };
60
61 std::unique_ptr<QRhiBuffer> vbuf(rhi->newBuffer(QRhiBuffer::Immutable,
63 sizeof(vertexData)));
64 vbuf->create();
65
66 std::unique_ptr<QRhiBuffer> ubuf(rhi->newBuffer(QRhiBuffer::Dynamic,
68 64 + 4));
69 ubuf->create();
70
71 std::unique_ptr<QRhiShaderResourceBindings> srb(rhi->newShaderResourceBindings());
72 srb->setBindings({
75 ubuf.get())
76 });
77 srb->create();
78
79 std::unique_ptr<QRhiGraphicsPipeline> ps(rhi->newGraphicsPipeline());
80 QRhiGraphicsPipeline::TargetBlend premulAlphaBlend;
81 premulAlphaBlend.enable = true;
82 ps->setTargetBlends({ premulAlphaBlend });
83 static auto getShader = [](const QString &name) {
84 QFile f(name);
85 if (f.open(QIODevice::ReadOnly))
86 return QShader::fromSerialized(f.readAll());
87 return QShader();
88 };
89 ps->setShaderStages({
90 { QRhiShaderStage::Vertex, getShader(QLatin1String("color.vert.qsb")) },
92 });
93 QRhiVertexInputLayout inputLayout;
94 inputLayout.setBindings({
95 { 5 * sizeof(float) }
96 });
97 inputLayout.setAttributes({
99 { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
100 });
101 ps->setVertexInputLayout(inputLayout);
102 ps->setShaderResourceBindings(srb.get());
103 ps->setRenderPassDescriptor(rp.get());
104 ps->create();
105
107 for (int frame = 0; frame < 20; ++frame) {
108 rhi->beginOffscreenFrame(&cb);
109
110 QRhiResourceUpdateBatch *u = rhi->nextResourceUpdateBatch();
111 if (frame == 0)
112 u->uploadStaticBuffer(vbuf.get(), vertexData);
113
114 QMatrix4x4 mvp = viewProjection;
115 mvp.rotate(rotation, 0, 1, 0);
116 u->updateDynamicBuffer(ubuf.get(), 0, 64, mvp.constData());
117 rotation += 5.0f;
118
119 u->updateDynamicBuffer(ubuf.get(), 64, 4, &opacity);
120 opacity += opacityDir * 0.2f;
121 if (opacity < 0.0f || opacity > 1.0f) {
122 opacityDir *= -1;
123 opacity = qBound(0.0f, opacity, 1.0f);
124 }
125
126 cb->beginPass(rt.get(), Qt::green, { 1.0f, 0 }, u);
127 cb->setGraphicsPipeline(ps.get());
128 cb->setViewport({ 0, 0, 1280, 720 });
129 cb->setShaderResources();
130 const QRhiCommandBuffer::VertexInput vbufBinding(vbuf.get(), 0);
131 cb->setVertexInput(0, 1, &vbufBinding);
132 cb->draw(3);
133 QRhiReadbackResult readbackResult;
134 u = rhi->nextResourceUpdateBatch();
135 u->readBackTexture({ tex.get() }, &readbackResult);
136 cb->endPass(u);
137
138 rhi->endOffscreenFrame();
139
140 QImage image(reinterpret_cast<const uchar *>(readbackResult.data.constData()),
141 readbackResult.pixelSize.width(),
142 readbackResult.pixelSize.height(),
144 if (rhi->isYUpInFramebuffer())
145 image = image.mirrored();
146 image.save(QString::asprintf("frame%d.png", frame));
147 }
148
149 return 0;
150}
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:122
\inmodule QtCore
Definition qfile.h:93
\macro qGuiApp
\inmodule QtGui
Definition qimage.h:37
@ Format_RGBA8888_Premultiplied
Definition qimage.h:60
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
void rotate(float angle, const QVector3D &vector)
Multiples this matrix by another that rotates coordinates through angle degrees about vector.
void perspective(float verticalAngle, float aspectRatio, float nearPlane, float farPlane)
Multiplies this matrix by another that applies a perspective projection.
const float * constData() const
Returns a constant pointer to the raw data of this matrix.
Definition qmatrix4x4.h:147
void translate(const QVector3D &vector)
Multiplies this matrix by another that translates coordinates by the components of vector.
@ Immutable
Definition qrhi.h:837
@ Dynamic
Definition qrhi.h:839
@ VertexBuffer
Definition qrhi.h:843
@ UniformBuffer
Definition qrhi.h:845
\inmodule QtGui
Definition qrhi.h:1614
QPair< QRhiBuffer *, quint32 > VertexInput
Synonym for QPair<QRhiBuffer *, quint32>.
Definition qrhi.h:1643
\inmodule QtRhi
\inmodule QtGui
Definition qrhi.h:1694
void updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Dynamic.
Definition qrhi.cpp:8595
void uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Immutable or QRhiBuf...
Definition qrhi.cpp:8615
void readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result)
Enqueues a texture-to-host copy operation as described by rb.
Definition qrhi.cpp:8788
static QRhiShaderResourceBinding uniformBuffer(int binding, StageFlags stage, QRhiBuffer *buf)
Definition qrhi.cpp:5292
@ UsedAsTransferSource
Definition qrhi.h:890
@ RenderTarget
Definition qrhi.h:886
\inmodule QtGui
Definition qrhi.h:313
void setBindings(std::initializer_list< QRhiVertexInputBinding > list)
Sets the bindings from the specified list.
Definition qrhi.h:317
void setAttributes(std::initializer_list< QRhiVertexInputAttribute > list)
Sets the attributes from the specified list.
Definition qrhi.h:329
\inmodule QtGui
@ Metal
Definition qrhi.h:1774
@ Vulkan
Definition qrhi.h:1771
@ D3D12
Definition qrhi.h:1775
static QRhi * create(Implementation impl, QRhiInitParams *params, Flags flags={}, QRhiNativeHandles *importDevice=nullptr)
Definition qrhi.cpp:8129
\inmodule QtGui
Definition qshader.h:81
static QShader fromSerialized(const QByteArray &data)
Creates a new QShader instance from the given data.
Definition qshader.cpp:510
\inmodule QtCore
Definition qsize.h:25
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:132
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:129
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString static QString asprintf(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
Definition qstring.cpp:7005
The QVulkanInstance class represents a native Vulkan instance, enabling Vulkan rendering onto a QSurf...
int main()
[0]
@ green
Definition qnamespace.h:35
Definition image.cpp:4
static QShader getShader(const QString &name)
#define qDebug
[1]
Definition qlogging.h:160
#define qFatal
Definition qlogging.h:164
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
GLfloat GLfloat f
GLuint name
void ** params
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
unsigned char uchar
Definition qtypes.h:27
QApplication app(argc, argv)
[0]
QFrame frame
[0]
\inmodule QtGui
Definition qrhi.h:1686
QByteArray data
Definition qrhi.h:1690