6#include <qpa/qplatformvulkaninstance.h>
7#include <qpa/qplatformintegration.h>
8#include <qpa/qplatformnativeinterface.h>
9#include <QtGui/private/qguiapplication_p.h>
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
204
205
206
207
208
209
210
211
212
214bool QVulkanInstancePrivate::ensureVulkan()
217 platformInst.reset(QGuiApplicationPrivate::platformIntegration()->createPlatformVulkanInstance(q_ptr));
219 qWarning(
"QVulkanInstance: Failed to initialize Vulkan");
226void QVulkanInstancePrivate::reset()
228 qDeleteAll(deviceFuncs);
231 platformInst.reset();
232 vkInst = VK_NULL_HANDLE;
233 errorCode = VK_SUCCESS;
237
238
239
240
241QVulkanInstance::QVulkanInstance()
242 : d_ptr(
new QVulkanInstancePrivate(
this))
247
248
249
250
251
252QVulkanInstance::~QVulkanInstance()
259
260
261
264
265
266
269
270
271
272
275
276
277
280
281
282
286
287
288
289
290
291
295
296
297
298
299
300
303
304
305
306
310
311
312
315
316
317
320
321
322
323
327
328
329
330
331
332
336
337
338
339
340
341
344
345
346
347
351
352
353
354
355
356
359
360
361
362
365
366
367
368
369
372
373
374
375
376
379
380
381QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers()
383 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedLayers() : QVulkanInfoVector<QVulkanLayer>();
387
388
389
390
391
394
395
396QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions()
398 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedExtensions() : QVulkanInfoVector<QVulkanExtension>();
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418QVersionNumber QVulkanInstance::supportedApiVersion()
const
420 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedApiVersion() : QVersionNumber();
424
425
426
427
428
429
430
431
432
433
434
435void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
438 qWarning(
"QVulkanInstance already created; setVkInstance() has no effect");
442 d_ptr->vkInst = existingVkInstance;
446
447
448
449
450
451void QVulkanInstance::setFlags(Flags flags)
454 qWarning(
"QVulkanInstance already created; setFlags() has no effect");
458 d_ptr->flags = flags;
462
463
464
465
466
467
468
469void QVulkanInstance::setLayers(
const QByteArrayList &layers)
472 qWarning(
"QVulkanInstance already created; setLayers() has no effect");
476 d_ptr->layers = layers;
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494void QVulkanInstance::setExtensions(
const QByteArrayList &extensions)
497 qWarning(
"QVulkanInstance already created; setExtensions() has no effect");
501 d_ptr->extensions = extensions;
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526void QVulkanInstance::setApiVersion(
const QVersionNumber &vulkanVersion)
529 qWarning(
"QVulkanInstance already created; setApiVersion() has no effect");
533 d_ptr->apiVersion = vulkanVersion;
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553bool QVulkanInstance::create()
558 if (!d_ptr->ensureVulkan())
561 d_ptr->platformInst->createOrAdoptInstance();
563 if (d_ptr->platformInst->isValid()) {
564 d_ptr->vkInst = d_ptr->platformInst->vkInstance();
565 d_ptr->layers = d_ptr->platformInst->enabledLayers();
566 d_ptr->extensions = d_ptr->platformInst->enabledExtensions();
567 d_ptr->errorCode = VK_SUCCESS;
568 d_ptr->funcs.reset(
new QVulkanFunctions(
this));
569 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
570 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
574 qWarning(
"Failed to create platform Vulkan instance");
575 if (d_ptr->platformInst) {
576 d_ptr->errorCode = d_ptr->platformInst->errorCode();
577 d_ptr->platformInst.reset();
579 d_ptr->errorCode = VK_NOT_READY;
585
586
587
588
589void QVulkanInstance::destroy()
595
596
597bool QVulkanInstance::isValid()
const
599 return d_ptr->platformInst && d_ptr->platformInst->isValid();
603
604
605
606
607
608
609VkResult QVulkanInstance::errorCode()
const
611 return d_ptr->errorCode;
615
616
617
618
619VkInstance QVulkanInstance::vkInstance()
const
621 return d_ptr->vkInst;
625
626
627QVulkanInstance::Flags QVulkanInstance::flags()
const
633
634
635
636QByteArrayList QVulkanInstance::layers()
const
638 return d_ptr->layers;
642
643
644
645QByteArrayList QVulkanInstance::extensions()
const
647 return d_ptr->extensions;
651
652
653
654
655QVersionNumber QVulkanInstance::apiVersion()
const
657 return d_ptr->apiVersion;
661
662
663
664
665
666PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(
const char *name)
670 return d_ptr->platformInst->getInstanceProcAddr(name);
674
675
676
677
678QPlatformVulkanInstance *QVulkanInstance::handle()
const
680 return d_ptr->platformInst.data();
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703QVulkanFunctions *QVulkanInstance::functions()
const
705 return d_ptr->funcs.data();
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
740 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
742 f =
new QVulkanDeviceFunctions(
this, device);
747
748
749
750
751
752
753
754
755
756
757
758
759void QVulkanInstance::resetDeviceFunctions(VkDevice device)
761 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
767
768
769
770
771
772VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
774 QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
777 void *p = nativeInterface->nativeResourceForWindow(QByteArrayLiteral(
"vkSurface"), window);
778 return p ? *
static_cast<VkSurfaceKHR *>(p) : VK_NULL_HANDLE;
782
783
784
785
786
787
788bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
790 return d_ptr->platformInst->supportsPresent(physicalDevice, queueFamilyIndex, window);
794
795
796
797
798
799
800
801
802
803
804void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
806 d_ptr->platformInst->presentAboutToBeQueued(window);
810
811
812
813
814
815
816
817void QVulkanInstance::presentQueued(QWindow *window)
819 d_ptr->platformInst->presentQueued(window);
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
845
846
847
848
849
850
851
852
853
854
855
856
857
858void QVulkanInstance::installDebugOutputFilter(DebugFilter filter)
860 if (!d_ptr->debugFilters.contains(filter)) {
861 d_ptr->debugFilters.append(filter);
862 if (d_ptr->platformInst)
863 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
868
869
870
871
872
873
874
875
876
877void QVulkanInstance::removeDebugOutputFilter(DebugFilter filter)
879 d_ptr->debugFilters.removeOne(filter);
880 if (d_ptr->platformInst)
881 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
905
906
907
908
909
910
911
912
915
916
917
918
919
920
921
924
925
926
927
928
929
930
931
932
933
934
935
936void QVulkanInstance::installDebugOutputFilter(DebugUtilsFilter filter)
938 d_ptr->debugUtilsFilters.append(filter);
939 if (d_ptr->platformInst)
940 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
944
945
946
947
948
949
950
951
952void QVulkanInstance::clearDebugOutputFilters()
954 d_ptr->debugFilters.clear();
955 d_ptr->debugUtilsFilters.clear();
956 if (d_ptr->platformInst) {
957 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
958 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
962#ifndef QT_NO_DEBUG_STREAM
965 QDebugStateSaver saver(dbg);
966 dbg.nospace() <<
"QVulkanLayer(" << layer.name <<
" " << layer.version
967 <<
" " << layer.specVersion <<
" " << layer.description <<
")";
973 QDebugStateSaver saver(dbg);
974 dbg.nospace() <<
"QVulkanExtension(" << extension.name <<
" " << extension.version <<
")";
QDebug operator<<(QDebug dbg, const QFileInfo &fi)