1 | // Copyright (C) 2017 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #ifndef QVULKANWINDOW_P_H |
5 | #define QVULKANWINDOW_P_H |
6 | |
7 | #include <QtGui/private/qtguiglobal_p.h> |
8 | |
9 | #if QT_CONFIG(vulkan) || defined(Q_QDOC) |
10 | |
11 | #include "qvulkanwindow.h" |
12 | #include <QtCore/QHash> |
13 | #include <private/qwindow_p.h> |
14 | |
15 | // |
16 | // W A R N I N G |
17 | // ------------- |
18 | // |
19 | // This file is not part of the Qt API. It exists for the convenience |
20 | // of a number of Qt sources files. This header file may change from |
21 | // version to version without notice, or even be removed. |
22 | // |
23 | // We mean it. |
24 | // |
25 | |
26 | QT_BEGIN_NAMESPACE |
27 | |
28 | class Q_GUI_EXPORT QVulkanWindowPrivate : public QWindowPrivate |
29 | { |
30 | Q_DECLARE_PUBLIC(QVulkanWindow) |
31 | |
32 | public: |
33 | ~QVulkanWindowPrivate(); |
34 | |
35 | void ensureStarted(); |
36 | void init(); |
37 | void reset(); |
38 | bool createDefaultRenderPass(); |
39 | QSize surfacePixelSize() const; |
40 | void recreateSwapChain(); |
41 | uint32_t chooseTransientImageMemType(VkImage img, uint32_t startIndex); |
42 | bool createTransientImage(VkFormat format, VkImageUsageFlags usage, VkImageAspectFlags aspectMask, |
43 | VkImage *images, VkDeviceMemory *mem, VkImageView *views, int count); |
44 | void releaseSwapChain(); |
45 | void beginFrame(); |
46 | void endFrame(); |
47 | bool checkDeviceLost(VkResult err); |
48 | void addReadback(); |
49 | void finishBlockingReadback(); |
50 | |
51 | enum Status { |
52 | StatusUninitialized, |
53 | StatusFail, |
54 | StatusFailRetry, |
55 | StatusDeviceReady, |
56 | StatusReady |
57 | }; |
58 | Status status = StatusUninitialized; |
59 | QVulkanWindowRenderer *renderer = nullptr; |
60 | QVulkanInstance *inst = nullptr; |
61 | VkSurfaceKHR surface = VK_NULL_HANDLE; |
62 | int physDevIndex = 0; |
63 | QList<VkPhysicalDevice> physDevs; |
64 | QList<VkPhysicalDeviceProperties> physDevProps; |
65 | QVulkanWindow::Flags flags; |
66 | QByteArrayList requestedDevExtensions; |
67 | QHash<VkPhysicalDevice, QVulkanInfoVector<QVulkanExtension> > supportedDevExtensions; |
68 | QList<VkFormat> requestedColorFormats; |
69 | VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; |
70 | QVulkanWindow::QueueCreateInfoModifier queueCreateInfoModifier; |
71 | QVulkanWindow::EnabledFeaturesModifier enabledFeaturesModifier; |
72 | QVulkanWindow::EnabledFeatures2Modifier enabledFeatures2Modifier; |
73 | |
74 | VkDevice dev = VK_NULL_HANDLE; |
75 | QVulkanDeviceFunctions *devFuncs; |
76 | uint32_t gfxQueueFamilyIdx; |
77 | uint32_t presQueueFamilyIdx; |
78 | VkQueue gfxQueue; |
79 | VkQueue presQueue; |
80 | VkCommandPool cmdPool = VK_NULL_HANDLE; |
81 | VkCommandPool presCmdPool = VK_NULL_HANDLE; |
82 | uint32_t hostVisibleMemIndex; |
83 | uint32_t deviceLocalMemIndex; |
84 | VkFormat colorFormat; |
85 | VkColorSpaceKHR colorSpace; |
86 | VkFormat dsFormat = VK_FORMAT_D24_UNORM_S8_UINT; |
87 | |
88 | PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR = nullptr; |
89 | PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; |
90 | PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; |
91 | PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; |
92 | PFN_vkQueuePresentKHR vkQueuePresentKHR; |
93 | PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = nullptr; |
94 | PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; |
95 | |
96 | static const int MAX_SWAPCHAIN_BUFFER_COUNT = 4; |
97 | static const int MAX_FRAME_LAG = QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT; |
98 | // QVulkanWindow only supports the always available FIFO mode. The |
99 | // rendering thread will get throttled to the presentation rate (vsync). |
100 | // This is in effect Example 5 from the VK_KHR_swapchain spec. |
101 | VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR; |
102 | int swapChainBufferCount = 0; |
103 | int frameLag = 2; |
104 | |
105 | QSize swapChainImageSize; |
106 | VkSwapchainKHR swapChain = VK_NULL_HANDLE; |
107 | bool swapChainSupportsReadBack = false; |
108 | |
109 | struct ImageResources { |
110 | VkImage image = VK_NULL_HANDLE; |
111 | VkImageView imageView = VK_NULL_HANDLE; |
112 | VkCommandBuffer cmdBuf = VK_NULL_HANDLE; |
113 | VkFence cmdFence = VK_NULL_HANDLE; |
114 | bool cmdFenceWaitable = false; |
115 | VkFramebuffer fb = VK_NULL_HANDLE; |
116 | VkCommandBuffer presTransCmdBuf = VK_NULL_HANDLE; |
117 | VkImage msaaImage = VK_NULL_HANDLE; |
118 | VkImageView msaaImageView = VK_NULL_HANDLE; |
119 | } imageRes[MAX_SWAPCHAIN_BUFFER_COUNT]; |
120 | |
121 | VkDeviceMemory msaaImageMem = VK_NULL_HANDLE; |
122 | |
123 | uint32_t currentImage; |
124 | |
125 | struct FrameResources { |
126 | VkFence fence = VK_NULL_HANDLE; |
127 | bool fenceWaitable = false; |
128 | VkSemaphore imageSem = VK_NULL_HANDLE; |
129 | VkSemaphore drawSem = VK_NULL_HANDLE; |
130 | VkSemaphore presTransSem = VK_NULL_HANDLE; |
131 | bool imageAcquired = false; |
132 | bool imageSemWaitable = false; |
133 | } frameRes[MAX_FRAME_LAG]; |
134 | |
135 | uint32_t currentFrame; |
136 | |
137 | VkRenderPass defaultRenderPass = VK_NULL_HANDLE; |
138 | |
139 | VkDeviceMemory dsMem = VK_NULL_HANDLE; |
140 | VkImage dsImage = VK_NULL_HANDLE; |
141 | VkImageView dsView = VK_NULL_HANDLE; |
142 | |
143 | bool framePending = false; |
144 | bool frameGrabbing = false; |
145 | QImage frameGrabTargetImage; |
146 | VkImage frameGrabImage = VK_NULL_HANDLE; |
147 | VkDeviceMemory frameGrabImageMem = VK_NULL_HANDLE; |
148 | |
149 | QMatrix4x4 m_clipCorrect; |
150 | }; |
151 | |
152 | QT_END_NAMESPACE |
153 | |
154 | #endif // QT_CONFIG(vulkan) |
155 | |
156 | #endif |
157 | |