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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
223
224
225
226
227
228
229
230
231
233bool QVulkanInstancePrivate::ensureVulkan()
236 platformInst.reset(QGuiApplicationPrivate::platformIntegration()->createPlatformVulkanInstance(q_ptr));
238 qWarning(
"QVulkanInstance: Failed to initialize Vulkan");
245void QVulkanInstancePrivate::reset()
248 QMutexLocker locker(&deviceFuncsMutex);
249 qDeleteAll(deviceFuncs);
253 platformInst.reset();
254 vkInst = VK_NULL_HANDLE;
255 errorCode = VK_SUCCESS;
259
260
261
262
263QVulkanInstance::QVulkanInstance()
264 : d_ptr(
new QVulkanInstancePrivate(
this))
269
270
271
272
273
274QVulkanInstance::~QVulkanInstance()
281
282
283
286
287
288
291
292
293
294
297
298
299
302
303
304
308
309
310
311
312
313
317
318
319
320
321
322
325
326
327
328
332
333
334
337
338
339
342
343
344
345
349
350
351
352
353
354
358
359
360
361
362
363
366
367
368
369
373
374
375
376
377
378
381
382
383
384
387
388
389
390
391
394
395
396
397
398
401
402
403QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers()
405 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedLayers() : QVulkanInfoVector<QVulkanLayer>();
409
410
411
412
413
416
417
418QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions()
420 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedExtensions() : QVulkanInfoVector<QVulkanExtension>();
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440QVersionNumber QVulkanInstance::supportedApiVersion()
const
442 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedApiVersion() : QVersionNumber();
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
469 qWarning(
"QVulkanInstance already created; setVkInstance() has no effect");
473 d_ptr->vkInst = existingVkInstance;
477
478
479
480
481
482void QVulkanInstance::setFlags(Flags flags)
485 qWarning(
"QVulkanInstance already created; setFlags() has no effect");
489 d_ptr->flags = flags;
493
494
495
496
497
498
499
500void QVulkanInstance::setLayers(
const QByteArrayList &layers)
503 qWarning(
"QVulkanInstance already created; setLayers() has no effect");
507 d_ptr->layers = layers;
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525void QVulkanInstance::setExtensions(
const QByteArrayList &extensions)
528 qWarning(
"QVulkanInstance already created; setExtensions() has no effect");
532 d_ptr->extensions = extensions;
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557void QVulkanInstance::setApiVersion(
const QVersionNumber &vulkanVersion)
560 qWarning(
"QVulkanInstance already created; setApiVersion() has no effect");
564 d_ptr->apiVersion = vulkanVersion;
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584bool QVulkanInstance::create()
589 if (!d_ptr->ensureVulkan())
592 d_ptr->platformInst->createOrAdoptInstance();
594 if (d_ptr->platformInst->isValid()) {
595 d_ptr->vkInst = d_ptr->platformInst->vkInstance();
596 d_ptr->layers = d_ptr->platformInst->enabledLayers();
597 d_ptr->extensions = d_ptr->platformInst->enabledExtensions();
598 d_ptr->errorCode = VK_SUCCESS;
599 d_ptr->funcs.reset(
new QVulkanFunctions(
this));
600 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
601 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
605 qWarning(
"Failed to create platform Vulkan instance");
606 if (d_ptr->platformInst) {
607 d_ptr->errorCode = d_ptr->platformInst->errorCode();
608 d_ptr->platformInst.reset();
610 d_ptr->errorCode = VK_NOT_READY;
616
617
618
619
620void QVulkanInstance::destroy()
626
627
628bool QVulkanInstance::isValid()
const
630 return d_ptr->platformInst && d_ptr->platformInst->isValid();
634
635
636
637
638
639
640VkResult QVulkanInstance::errorCode()
const
642 return d_ptr->errorCode;
646
647
648
649
650VkInstance QVulkanInstance::vkInstance()
const
652 return d_ptr->vkInst;
656
657
658QVulkanInstance::Flags QVulkanInstance::flags()
const
664
665
666
667QByteArrayList QVulkanInstance::layers()
const
669 return d_ptr->layers;
673
674
675
676QByteArrayList QVulkanInstance::extensions()
const
678 return d_ptr->extensions;
682
683
684
685
686QVersionNumber QVulkanInstance::apiVersion()
const
688 return d_ptr->apiVersion;
692
693
694
695
696
697PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(
const char *name)
701 return d_ptr->platformInst ? d_ptr->platformInst->getInstanceProcAddr(name) :
nullptr;
705
706
707
708
709QPlatformVulkanInstance *QVulkanInstance::handle()
const
711 return d_ptr->platformInst.data();
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734QVulkanFunctions *QVulkanInstance::functions()
const
736 return d_ptr->funcs.data();
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
772 QMutexLocker locker(&d_ptr->deviceFuncsMutex);
773 if (QVulkanDeviceFunctions *f = d_ptr->deviceFuncs.value(device))
780 QVulkanDeviceFunctions *candidate =
new QVulkanDeviceFunctions(
this, device);
782 QMutexLocker locker(&d_ptr->deviceFuncsMutex);
783 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
792
793
794
795
796
797
798
799
800
801
802
803
804void QVulkanInstance::resetDeviceFunctions(VkDevice device)
806 QMutexLocker locker(&d_ptr->deviceFuncsMutex);
807 delete d_ptr->deviceFuncs.take(device);
811
812
813
814
815
816VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
818 QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
821 void *p = nativeInterface->nativeResourceForWindow(QByteArrayLiteral(
"vkSurface"), window);
822 return p ? *
static_cast<VkSurfaceKHR *>(p) : VK_NULL_HANDLE;
826
827
828
829
830
831
832bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
834 return d_ptr->platformInst ? d_ptr->platformInst->supportsPresent(physicalDevice, queueFamilyIndex, window) :
false;
838
839
840
841
842
843
844
845
846
847
848void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
850 if (d_ptr->platformInst)
851 d_ptr->platformInst->presentAboutToBeQueued(window);
855
856
857
858
859
860
861
862void QVulkanInstance::presentQueued(QWindow *window)
864 if (d_ptr->platformInst)
865 d_ptr->platformInst->presentQueued(window);
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
891
892
893
894
895
896
897
898
899
900
901
902
903
904void QVulkanInstance::installDebugOutputFilter(DebugFilter filter)
906 if (!d_ptr->debugFilters.contains(filter)) {
907 d_ptr->debugFilters.append(filter);
908 if (d_ptr->platformInst)
909 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
914
915
916
917
918
919
920
921
922
923void QVulkanInstance::removeDebugOutputFilter(DebugFilter filter)
925 d_ptr->debugFilters.removeOne(filter);
926 if (d_ptr->platformInst)
927 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
951
952
953
954
955
956
957
958
961
962
963
964
965
966
967
970
971
972
973
974
975
976
977
978
979
980
981
982void QVulkanInstance::installDebugOutputFilter(DebugUtilsFilter filter)
984 d_ptr->debugUtilsFilters.append(filter);
985 if (d_ptr->platformInst)
986 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
990
991
992
993
994
995
996
997
998void QVulkanInstance::clearDebugOutputFilters()
1000 d_ptr->debugFilters.clear();
1001 d_ptr->debugUtilsFilters.clear();
1002 if (d_ptr->platformInst) {
1003 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
1004 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
1008#ifndef QT_NO_DEBUG_STREAM
1011 QDebugStateSaver saver(dbg);
1012 dbg.nospace() <<
"QVulkanLayer(" << layer.name <<
" " << layer.version
1013 <<
" " << layer.specVersion <<
" " << layer.description <<
")";
1019 QDebugStateSaver saver(dbg);
1020 dbg.nospace() <<
"QVulkanExtension(" << extension.name <<
" " << extension.version <<
")";
QDebug operator<<(QDebug dbg, const QFileInfo &fi)