Doc: Compile GUI vulkan snippets

Fix minor issues (e.g. whitespace, missing semi-colon) in passing.

Change-Id: Ia16a7793b999e7ffd8d387fa3826117a4ade2c41
Done-with: Nico Vertriest <nico.vertriest@qt.io>
Task-number: QTBUG-81486
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
bb10
Paul Wicking 2020-08-28 19:26:44 +02:00
parent 4074c54270
commit 1ca85a2fd1
4 changed files with 210 additions and 127 deletions

View File

@ -42,4 +42,7 @@ SOURCES = \
src_gui_text_qtextdocumentwriter.cpp \
src_gui_text_qtextlayout.cpp \
src_gui_util_qdesktopservices.cpp \
src_gui_util_qvalidator.cpp
src_gui_util_qvalidator.cpp \
src_gui_vulkan_qvulkanfunctions.cpp \
src_gui_vulkan_qvulkaninstance.cpp \
src_gui_vulkan_qvulkanwindow.cpp

View File

@ -48,23 +48,51 @@
**
****************************************************************************/
#include <QVulkanDeviceFunctions>
#include <QVulkanFunctions>
#include <QVulkanInstance>
namespace src_gui_vulkan_qvulkanfunctions {
struct Window {
void render();
QVulkanInstance *vulkanInstance() { return nullptr; }
};
VkDevice_T *device = nullptr;
VkCommandBufferAllocateInfo cmdBufInfo;
VkCommandBuffer cmdBuf;
//! [0]
void Window::render()
{
QVulkanInstance *inst = vulkanInstance();
QVulkanFunctions *f = inst->functions();
...
VkResult err = f->vkAllocateCommandBuffers(device, &cmdBufInfo, &cmdBuf);
...
}
void Window::render()
{
QVulkanInstance *inst = vulkanInstance();
QVulkanFunctions *f = inst->functions();
// ...
VkResult err = f->vkAllocateCommandBuffers(device, &cmdBufInfo, &cmdBuf);
// ...
}
//! [0]
} // namespace src_gui_vulkan_qvulkanfunctions {
namespace src_gui_vulkan_qvulkanfunctions2 {
struct Window {
void render();
QVulkanInstance *vulkanInstance() { return nullptr; }
};
VkDevice_T *device = nullptr;
VkCommandBufferAllocateInfo cmdBufInfo;
VkCommandBuffer cmdBuf;
//! [1]
void Window::render()
{
QVulkanInstance *inst = vulkanInstance();
QVulkanDeviceFunctions *df = inst->deviceFunctions(device);
VkResult err = df->vkAllocateCommandBuffers(device, &cmdBufInfo, &cmdBuf);
...
}
void Window::render()
{
QVulkanInstance *inst = vulkanInstance();
QVulkanDeviceFunctions *df = inst->deviceFunctions(device);
VkResult err = df->vkAllocateCommandBuffers(device, &cmdBufInfo, &cmdBuf);
// ...
}
//! [1]
} // src_gui_vulkan_qvulkanfunctions2

View File

@ -48,6 +48,20 @@
**
****************************************************************************/
#include <QGuiApplication>
#include <QVulkanFunctions>
#include <QVulkanInstance>
#include <QWindow>
namespace src_gui_vulkan_qvulkaninstance {
struct Window {
void setVulkanInstance(QVulkanInstance *instance) { Q_UNUSED(instance); }
void show();
};
Window *window = nullptr;
//! [0]
int main(int argc, char **argv)
{
@ -57,7 +71,7 @@
if (!inst.create())
return 1;
...
// ...
window->setVulkanInstance(&inst);
window->show();
@ -65,6 +79,8 @@
}
//! [0]
void wrapper0() {
//! [1]
QVulkanInstance inst;
@ -72,75 +88,91 @@
inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
bool ok = inst.create();
if (!ok)
... // Vulkan not available
if (!inst.layers().contains("VK_LAYER_LUNARG_standard_validation"))
... // validation layer not available
//! [1]
if (!ok) {
// ... Vulkan not available
}
if (!inst.layers().contains("VK_LAYER_LUNARG_standard_validation")) {
// ... validation layer not available
}
//! [1]
}
void wrapper1() {
//! [2]
QVulkanInstance inst;
if (inst.supportedLayers().contains("VK_LAYER_LUNARG_standard_validation"))
...
if (inst.supportedLayers().contains("VK_LAYER_LUNARG_standard_validation")) {
// ...
}
bool ok = inst.create();
...
// ...
//! [2]
//! [3]
class VulkanWindow : public QWindow
{
public:
VulkanWindow() {
setSurfaceType(VulkanSurface);
}
Q_UNUSED(ok);
} // wrapper1
} // src_gui_vulkan_qvulkaninstance
void exposeEvent(QExposeEvent *) {
if (isExposed()) {
if (!m_initialized) {
m_initialized = true;
// initialize device, swapchain, etc.
QVulkanInstance *inst = vulkanInstance();
QVulkanFunctions *f = inst->functions();
uint32_t devCount = 0;
f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr);
...
// build the first frame
render();
}
namespace src_gui_vulkan_qvulkaninstance2 {
//! [3]
class VulkanWindow : public QWindow
{
public:
VulkanWindow() {
setSurfaceType(VulkanSurface);
}
void exposeEvent(QExposeEvent *) {
if (isExposed()) {
if (!m_initialized) {
m_initialized = true;
// initialize device, swapchain, etc.
QVulkanInstance *inst = vulkanInstance();
QVulkanFunctions *f = inst->functions();
uint32_t devCount = 0;
f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr);
// ...
// build the first frame
render();
}
}
bool event(QEvent *e) {
if (e->type() == QEvent::UpdateRequest)
render();
return QWindow::event(e);
}
void render() {
...
requestUpdate(); // render continuously
}
private:
bool m_initialized = false;
};
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
if (!inst.create()) {
qWarning("Vulkan not available");
return 1;
}
VulkanWindow window;
window.showMaximized();
return app.exec();
}
bool event(QEvent *e) {
if (e->type() == QEvent::UpdateRequest)
render();
return QWindow::event(e);
}
void render() {
// ...
requestUpdate(); // render continuously
}
private:
bool m_initialized = false;
};
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
if (!inst.create()) {
qWarning("Vulkan not available");
return 1;
}
VulkanWindow window;
window.showMaximized();
return app.exec();
}
//! [3]
} // src_gui_vulkan_qvulkaninstance2

View File

@ -47,86 +47,106 @@
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QGuiApplication>
#include <QVulkanDeviceFunctions>
#include <QVulkanWindow>
namespace src_gui_vulkan_qvulkanwindow {
VkCommandBuffer commandBuffer;
const VkRenderPassBeginInfo *renderPassBegin = nullptr;
VkSubpassContents contents;
//! [0]
class VulkanRenderer : public QVulkanWindowRenderer
{
public:
VulkanRenderer(QVulkanWindow *w) : m_window(w) { }
class VulkanRenderer : public QVulkanWindowRenderer
{
public:
VulkanRenderer(QVulkanWindow *w) : m_window(w) { }
void initResources() override
{
m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
...
}
void initSwapChainResources() override { ... }
void releaseSwapChainResources() override { ... }
void releaseResources() override { ... }
void initResources() override
{
m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
// ..
}
void initSwapChainResources() override { /* ... */ }
void releaseSwapChainResources() override { /* ... */ }
void releaseResources() override { /* ... */ }
void startNextFrame() override
{
VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
...
m_devFuncs->vkCmdBeginRenderPass(...);
...
m_window->frameReady();
}
void startNextFrame() override
{
VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
// ...
m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents);
// ...
m_window->frameReady();
}
private:
QVulkanWindow *m_window;
QVulkanDeviceFunctions *m_devFuncs;
};
private:
QVulkanWindow *m_window;
QVulkanDeviceFunctions *m_devFuncs;
};
class VulkanWindow : public QVulkanWindow
{
public:
QVulkanWindowRenderer *createRenderer() override {
return new VulkanRenderer(this);
}
};
class VulkanWindow : public QVulkanWindow
{
public:
QVulkanWindowRenderer *createRenderer() override {
return new VulkanRenderer(this);
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
// enable the standard validation layers, when available
inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
QVulkanInstance inst;
// enable the standard validation layers, when available
inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
VulkanWindow w;
w.setVulkanInstance(&inst);
w.showMaximized();
VulkanWindow w;
w.setVulkanInstance(&inst);
w.showMaximized();
return app.exec();
}
return app.exec();
}
//! [0]
//! [1]
class Renderer {
...
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
void Renderer::startNextFrame()
{
VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
...
// ...
}
//! [1]
} // src_gui_vulkan_qvulkanwindow
namespace src_gui_vulkan_qvulkanwindow2 {
//! [2]
class Renderer {
...
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
void Renderer::startNextFrame()
{
const int count = m_window->concurrentFrameCount();
for (int i = 0; i < count; ++i)
m_uniformBufInfo[i] = ...
...
// for (int i = 0; i < count; ++i)
// m_uniformBufInfo[i] = ...
// ...
}
//! [2]
} // src_gui_vulkan_qvulkanwindow2