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
parent
4074c54270
commit
1ca85a2fd1
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue