Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c0b03d8

Browse files
egdanielSkia Commit-Bot
authored andcommitted
Start adding support for some base extensions which others build on.
Many of the other extensions in Vulkan rely on these some just want to get these landed so we can start building on top of them. Bug: skia: Change-Id: Icef82c169cd50ff51b97fe065923531ef2940319 Reviewed-on: https://skia-review.googlesource.com/145362 Commit-Queue: Greg Daniel <[email protected]> Reviewed-by: Robert Phillips <[email protected]>
1 parent 12fb9cf commit c0b03d8

File tree

7 files changed

+224
-12
lines changed

7 files changed

+224
-12
lines changed

include/gpu/vk/GrVkExtensions.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ class SK_API GrVkExtensions {
4343
};
4444
};
4545

46+
#ifdef SK_DEBUG
47+
void dump() const {
48+
SkDebugf("**Vulkan Extensions**\n");
49+
for (int i = 0; i < fExtensions.count(); ++i) {
50+
SkDebugf("%s. Version: %d\n",
51+
fExtensions[i].fName.c_str(), fExtensions[i].fSpecVersion);
52+
}
53+
SkDebugf("**End Vulkan Extensions**\n");
54+
}
55+
#endif
56+
4657
private:
4758
void getSpecVersions(GrVkGetProc getProc, VkInstance, VkPhysicalDevice);
4859

src/gpu/vk/GrVkCaps.cpp

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,24 @@
1313
#include "GrVkInterface.h"
1414
#include "GrVkUtil.h"
1515
#include "vk/GrVkBackendContext.h"
16+
#include "vk/GrVkExtensions.h"
1617

1718
GrVkCaps::GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
1819
VkPhysicalDevice physDev, const VkPhysicalDeviceFeatures& features,
19-
uint32_t instanceVersion)
20+
uint32_t instanceVersion, const GrVkExtensions& extensions)
2021
: INHERITED(contextOptions) {
2122
fMustDoCopiesFromOrigin = false;
2223
fMustSubmitCommandsBeforeCopyOp = false;
2324
fMustSleepOnTearDown = false;
2425
fNewCBOnPipelineChange = false;
2526
fShouldAlwaysUseDedicatedImageMemory = false;
2627

28+
fSupportsPhysicalDeviceProperties2 = false;
29+
fSupportsMemoryRequirements2 = false;
30+
fSupportsMaintenance1 = false;
31+
fSupportsMaintenance2 = false;
32+
fSupportsMaintenance3 = false;
33+
2734
/**************************************************************************
2835
* GrDrawTargetCaps fields
2936
**************************************************************************/
@@ -48,7 +55,7 @@ GrVkCaps::GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface*
4855

4956
fShaderCaps.reset(new GrShaderCaps(contextOptions));
5057

51-
this->init(contextOptions, vkInterface, physDev, features);
58+
this->init(contextOptions, vkInterface, physDev, features, extensions);
5259
}
5360

5461
bool GrVkCaps::initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc,
@@ -196,14 +203,42 @@ bool GrVkCaps::canCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* s
196203
}
197204

198205
void GrVkCaps::init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
199-
VkPhysicalDevice physDev, const VkPhysicalDeviceFeatures& features) {
206+
VkPhysicalDevice physDev, const VkPhysicalDeviceFeatures& features,
207+
const GrVkExtensions& extensions) {
200208

201209
VkPhysicalDeviceProperties properties;
202210
GR_VK_CALL(vkInterface, GetPhysicalDeviceProperties(physDev, &properties));
203211

204212
VkPhysicalDeviceMemoryProperties memoryProperties;
205213
GR_VK_CALL(vkInterface, GetPhysicalDeviceMemoryProperties(physDev, &memoryProperties));
206214

215+
uint32_t physicalDeviceVersion = properties.apiVersion;
216+
217+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
218+
extensions.hasExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1)) {
219+
fSupportsPhysicalDeviceProperties2 = true;
220+
}
221+
222+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
223+
extensions.hasExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1)) {
224+
fSupportsMemoryRequirements2 = true;
225+
}
226+
227+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
228+
extensions.hasExtension(VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1)) {
229+
fSupportsMaintenance1 = true;
230+
}
231+
232+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
233+
extensions.hasExtension(VK_KHR_MAINTENANCE2_EXTENSION_NAME, 1)) {
234+
fSupportsMaintenance2 = true;
235+
}
236+
237+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
238+
extensions.hasExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME, 1)) {
239+
fSupportsMaintenance3 = true;
240+
}
241+
207242
this->initGrCaps(properties, memoryProperties, features);
208243
this->initShaderCaps(properties, features);
209244

src/gpu/vk/GrVkCaps.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
#include "GrVkStencilAttachment.h"
1313
#include "vk/GrVkDefines.h"
1414

15-
struct GrVkInterface;
1615
class GrShaderCaps;
16+
class GrVkExtensions;
17+
struct GrVkInterface;
1718

1819
/**
1920
* Stores some capabilities of a Vk backend.
@@ -28,7 +29,7 @@ class GrVkCaps : public GrCaps {
2829
*/
2930
GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
3031
VkPhysicalDevice device, const VkPhysicalDeviceFeatures& features,
31-
uint32_t instanceVersion);
32+
uint32_t instanceVersion, const GrVkExtensions& extensions);
3233

3334
bool isConfigTexturable(GrPixelConfig config) const override {
3435
return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fOptimalFlags);
@@ -104,6 +105,16 @@ class GrVkCaps : public GrCaps {
104105
return fPreferedStencilFormat;
105106
}
106107

108+
// Returns whether the device supports the ability to extend VkPhysicalDeviceProperties struct.
109+
bool supportsPhysicalDeviceProperties2() const { return fSupportsPhysicalDeviceProperties2; }
110+
// Returns whether the device supports the ability to extend VkMemoryRequirements struct.
111+
bool supportsMemoryRequirements2() const { return fSupportsMemoryRequirements2; }
112+
// Returns whether or not the device suports the various API maintenance fixes to Vulkan 1.0. In
113+
// Vulkan 1.1 all these maintenance are part of the core spec.
114+
bool supportsMaintenance1() const { return fSupportsMaintenance1; }
115+
bool supportsMaintenance2() const { return fSupportsMaintenance2; }
116+
bool supportsMaintenance3() const { return fSupportsMaintenance3; }
117+
107118
/**
108119
* Helpers used by canCopySurface. In all cases if the SampleCnt parameter is zero that means
109120
* the surface is not a render target, otherwise it is the number of samples in the render
@@ -147,7 +158,7 @@ class GrVkCaps : public GrCaps {
147158
};
148159

149160
void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
150-
VkPhysicalDevice device, const VkPhysicalDeviceFeatures&);
161+
VkPhysicalDevice device, const VkPhysicalDeviceFeatures&, const GrVkExtensions&);
151162
void initGrCaps(const VkPhysicalDeviceProperties&,
152163
const VkPhysicalDeviceMemoryProperties&,
153164
const VkPhysicalDeviceFeatures&);
@@ -193,6 +204,12 @@ class GrVkCaps : public GrCaps {
193204
bool fNewCBOnPipelineChange;
194205
bool fShouldAlwaysUseDedicatedImageMemory;
195206

207+
bool fSupportsPhysicalDeviceProperties2;
208+
bool fSupportsMemoryRequirements2;
209+
bool fSupportsMaintenance1;
210+
bool fSupportsMaintenance2;
211+
bool fSupportsMaintenance3;
212+
196213
typedef GrCaps INHERITED;
197214
};
198215

src/gpu/vk/GrVkGpu.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,30 @@ sk_sp<GrGpu> GrVkGpu::Make(const GrVkBackendContext& backendContext,
6666
return nullptr;
6767
}
6868

69+
PFN_vkGetPhysicalDeviceProperties localGetPhysicalDeviceProperties =
70+
reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(
71+
backendContext.fGetProc("vkGetPhysicalDeviceProperties",
72+
backendContext.fInstance,
73+
VK_NULL_HANDLE));
74+
75+
if (!localGetPhysicalDeviceProperties) {
76+
return nullptr;
77+
}
78+
VkPhysicalDeviceProperties physDeviceProperties;
79+
localGetPhysicalDeviceProperties(backendContext.fPhysicalDevice, &physDeviceProperties);
80+
uint32_t physDevVersion = physDeviceProperties.apiVersion;
81+
6982
sk_sp<const GrVkInterface> interface;
7083

7184
if (backendContext.fVkExtensions) {
7285
interface.reset(new GrVkInterface(backendContext.fGetProc,
7386
backendContext.fInstance,
7487
backendContext.fDevice,
88+
backendContext.fInstanceVersion,
89+
physDevVersion,
7590
backendContext.fVkExtensions));
76-
if (!interface->validate(backendContext.fVkExtensions)) {
91+
if (!interface->validate(backendContext.fInstanceVersion, physDevVersion,
92+
backendContext.fVkExtensions)) {
7793
return nullptr;
7894
}
7995
} else {
@@ -83,8 +99,10 @@ sk_sp<GrGpu> GrVkGpu::Make(const GrVkBackendContext& backendContext,
8399
interface.reset(new GrVkInterface(backendContext.fGetProc,
84100
backendContext.fInstance,
85101
backendContext.fDevice,
102+
backendContext.fInstanceVersion,
103+
physDevVersion,
86104
&extensions));
87-
if (!interface->validate(&extensions)) {
105+
if (!interface->validate(backendContext.fInstanceVersion, physDevVersion, &extensions)) {
88106
return nullptr;
89107
}
90108
}
@@ -118,8 +136,10 @@ GrVkGpu::GrVkGpu(GrContext* context, const GrContextOptions& options,
118136
: backendContext.fMinAPIVersion;
119137

120138
if (backendContext.fFeatures & kIgnoreAllFlags_GrVkFeatureFlag) {
139+
SkASSERT(backendContext.fVkExtensions);
121140
fVkCaps.reset(new GrVkCaps(options, this->vkInterface(), backendContext.fPhysicalDevice,
122-
backendContext.fDeviceFeatures, instanceVersion));
141+
backendContext.fDeviceFeatures, instanceVersion,
142+
*backendContext.fVkExtensions));
123143
} else {
124144
VkPhysicalDeviceFeatures features;
125145
if (backendContext.fFeatures & kGeometryShader_GrVkFeatureFlag) {
@@ -132,7 +152,7 @@ GrVkGpu::GrVkGpu(GrContext* context, const GrContextOptions& options,
132152
features.sampleRateShading = true;
133153
}
134154
fVkCaps.reset(new GrVkCaps(options, this->vkInterface(), backendContext.fPhysicalDevice,
135-
features, instanceVersion));
155+
features, instanceVersion, GrVkExtensions()));
136156
}
137157
fCaps.reset(SkRef(fVkCaps.get()));
138158

src/gpu/vk/GrVkInterface.cpp

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@
1313
#define ACQUIRE_PROC(name, instance, device) fFunctions.f##name = \
1414
reinterpret_cast<PFN_vk##name>(getProc("vk"#name, instance, device));
1515

16+
#define ACQUIRE_PROC_SUFFIX(name, suffix, instance, device) fFunctions.f##name = \
17+
reinterpret_cast<PFN_vk##name##suffix>(getProc("vk"#name#suffix, instance, device));
18+
1619
GrVkInterface::GrVkInterface(GrVkGetProc getProc,
1720
VkInstance instance,
1821
VkDevice device,
22+
uint32_t instanceVersion,
23+
uint32_t physicalDeviceVersion,
1924
const GrVkExtensions* extensions) {
2025
if (getProc == nullptr) {
2126
return;
@@ -160,6 +165,52 @@ GrVkInterface::GrVkInterface(GrVkGetProc getProc,
160165
ACQUIRE_PROC(CmdNextSubpass, VK_NULL_HANDLE, device);
161166
ACQUIRE_PROC(CmdEndRenderPass, VK_NULL_HANDLE, device);
162167
ACQUIRE_PROC(CmdExecuteCommands, VK_NULL_HANDLE, device);
168+
169+
// Functions for VK_KHR_get_physical_device_properties2
170+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
171+
ACQUIRE_PROC(GetPhysicalDeviceFeatures2, instance, VK_NULL_HANDLE);
172+
ACQUIRE_PROC(GetPhysicalDeviceProperties2, instance, VK_NULL_HANDLE);
173+
ACQUIRE_PROC(GetPhysicalDeviceFormatProperties2, instance, VK_NULL_HANDLE);
174+
ACQUIRE_PROC(GetPhysicalDeviceImageFormatProperties2, instance, VK_NULL_HANDLE);
175+
ACQUIRE_PROC(GetPhysicalDeviceQueueFamilyProperties2, instance, VK_NULL_HANDLE);
176+
ACQUIRE_PROC(GetPhysicalDeviceMemoryProperties2, instance, VK_NULL_HANDLE);
177+
ACQUIRE_PROC(GetPhysicalDeviceSparseImageFormatProperties2, instance, VK_NULL_HANDLE);
178+
} else if (extensions->hasExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
179+
1)) {
180+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceFeatures2, KHR, instance, VK_NULL_HANDLE);
181+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceProperties2, KHR, instance, VK_NULL_HANDLE);
182+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceFormatProperties2, KHR, instance, VK_NULL_HANDLE);
183+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceImageFormatProperties2, KHR, instance, VK_NULL_HANDLE);
184+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceQueueFamilyProperties2, KHR, instance, VK_NULL_HANDLE);
185+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceMemoryProperties2, KHR, instance, VK_NULL_HANDLE);
186+
ACQUIRE_PROC_SUFFIX(GetPhysicalDeviceSparseImageFormatProperties2, KHR, instance,
187+
VK_NULL_HANDLE);
188+
}
189+
190+
// Functions for VK_KHR_get_memory_requirements2
191+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
192+
ACQUIRE_PROC(GetImageMemoryRequirements2, VK_NULL_HANDLE, device);
193+
ACQUIRE_PROC(GetBufferMemoryRequirements2, VK_NULL_HANDLE, device);
194+
ACQUIRE_PROC(GetImageSparseMemoryRequirements2, VK_NULL_HANDLE, device);
195+
} else if (extensions->hasExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1)) {
196+
ACQUIRE_PROC_SUFFIX(GetImageMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
197+
ACQUIRE_PROC_SUFFIX(GetBufferMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
198+
ACQUIRE_PROC_SUFFIX(GetImageSparseMemoryRequirements2, KHR, VK_NULL_HANDLE, device);
199+
}
200+
201+
// Functions for VK_KHR_maintenance1 or vulkan 1.1
202+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
203+
ACQUIRE_PROC(TrimCommandPool, VK_NULL_HANDLE, device);
204+
} else if (extensions->hasExtension(VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1)) {
205+
ACQUIRE_PROC_SUFFIX(TrimCommandPool, KHR, VK_NULL_HANDLE, device);
206+
}
207+
208+
// Functions for VK_KHR_maintenance3 or vulkan 1.1
209+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0)) {
210+
ACQUIRE_PROC(GetDescriptorSetLayoutSupport, VK_NULL_HANDLE, device);
211+
} else if (extensions->hasExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME, 1)) {
212+
ACQUIRE_PROC_SUFFIX(GetDescriptorSetLayoutSupport, KHR, VK_NULL_HANDLE, device);
213+
}
163214
}
164215

165216
#ifdef SK_DEBUG
@@ -172,7 +223,8 @@ GrVkInterface::GrVkInterface(GrVkGetProc getProc,
172223
if (kIsDebug) { SkDebugf("%s:%d GrVkInterface::validate() failed.\n", __FILE__, __LINE__); } \
173224
return false;
174225

175-
bool GrVkInterface::validate(const GrVkExtensions* extensions) const {
226+
bool GrVkInterface::validate(uint32_t instanceVersion, uint32_t physicalDeviceVersion,
227+
const GrVkExtensions* extensions) const {
176228
// functions that are always required
177229
if (nullptr == fFunctions.fCreateInstance ||
178230
nullptr == fFunctions.fDestroyInstance ||
@@ -312,6 +364,46 @@ bool GrVkInterface::validate(const GrVkExtensions* extensions) const {
312364
RETURN_FALSE_INTERFACE
313365
}
314366

367+
// Functions for VK_KHR_get_physical_device_properties2 or vulkan 1.1
368+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
369+
extensions->hasExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1)) {
370+
if (nullptr == fFunctions.fGetPhysicalDeviceFeatures2 ||
371+
nullptr == fFunctions.fGetPhysicalDeviceProperties2 ||
372+
nullptr == fFunctions.fGetPhysicalDeviceFormatProperties2 ||
373+
nullptr == fFunctions.fGetPhysicalDeviceImageFormatProperties2 ||
374+
nullptr == fFunctions.fGetPhysicalDeviceQueueFamilyProperties2 ||
375+
nullptr == fFunctions.fGetPhysicalDeviceMemoryProperties2 ||
376+
nullptr == fFunctions.fGetPhysicalDeviceSparseImageFormatProperties2) {
377+
RETURN_FALSE_INTERFACE
378+
}
379+
}
380+
381+
// Functions for VK_KHR_get_memory_requirements2 or vulkan 1.1
382+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
383+
extensions->hasExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, 1)) {
384+
if (nullptr == fFunctions.fGetImageMemoryRequirements2 ||
385+
nullptr == fFunctions.fGetBufferMemoryRequirements2 ||
386+
nullptr == fFunctions.fGetImageSparseMemoryRequirements2) {
387+
RETURN_FALSE_INTERFACE
388+
}
389+
}
390+
391+
// Functions for VK_KHR_maintenance1 or vulkan 1.1
392+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
393+
extensions->hasExtension(VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1)) {
394+
if (nullptr == fFunctions.fTrimCommandPool) {
395+
RETURN_FALSE_INTERFACE
396+
}
397+
}
398+
399+
// Functions for VK_KHR_maintenance3 or vulkan 1.1
400+
if (physicalDeviceVersion >= VK_MAKE_VERSION(1, 1, 0) ||
401+
extensions->hasExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME, 1)) {
402+
if (nullptr == fFunctions.fGetDescriptorSetLayoutSupport) {
403+
RETURN_FALSE_INTERFACE
404+
}
405+
}
406+
315407
return true;
316408
}
317409

src/gpu/vk/GrVkInterface.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ struct GrVkInterface : public SkRefCnt {
4242
GrVkInterface(GrVkGetProc getProc,
4343
VkInstance instance,
4444
VkDevice device,
45+
uint32_t instanceVersion,
46+
uint32_t physicalDeviceVersion,
4547
const GrVkExtensions*);
4648

4749
// Validates that the GrVkInterface supports its advertised standard. This means the necessary
4850
// function pointers have been initialized for Vulkan version.
49-
bool validate(const GrVkExtensions*) const;
51+
bool validate(uint32_t instanceVersion, uint32_t physicalDeviceVersion,
52+
const GrVkExtensions*) const;
5053

5154
/**
5255
* The function pointers are in a struct so that we can have a compiler generated assignment
@@ -188,6 +191,26 @@ struct GrVkInterface : public SkRefCnt {
188191
VkPtr<PFN_vkCmdNextSubpass> fCmdNextSubpass;
189192
VkPtr<PFN_vkCmdEndRenderPass> fCmdEndRenderPass;
190193
VkPtr<PFN_vkCmdExecuteCommands> fCmdExecuteCommands;
194+
195+
// Functions for VK_KHR_get_physical_device_properties2 or vulkan 1.1
196+
VkPtr<PFN_vkGetPhysicalDeviceFeatures2> fGetPhysicalDeviceFeatures2;
197+
VkPtr<PFN_vkGetPhysicalDeviceProperties2> fGetPhysicalDeviceProperties2;
198+
VkPtr<PFN_vkGetPhysicalDeviceFormatProperties2> fGetPhysicalDeviceFormatProperties2;
199+
VkPtr<PFN_vkGetPhysicalDeviceImageFormatProperties2> fGetPhysicalDeviceImageFormatProperties2;
200+
VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties2> fGetPhysicalDeviceQueueFamilyProperties2;
201+
VkPtr<PFN_vkGetPhysicalDeviceMemoryProperties2> fGetPhysicalDeviceMemoryProperties2;
202+
VkPtr<PFN_vkGetPhysicalDeviceSparseImageFormatProperties2> fGetPhysicalDeviceSparseImageFormatProperties2;
203+
204+
// Functions for VK_KHR_get_memory_requirements2 or vulkan 1.1
205+
VkPtr<PFN_vkGetImageMemoryRequirements2> fGetImageMemoryRequirements2;
206+
VkPtr<PFN_vkGetBufferMemoryRequirements2> fGetBufferMemoryRequirements2;
207+
VkPtr<PFN_vkGetImageSparseMemoryRequirements2> fGetImageSparseMemoryRequirements2;
208+
209+
// Functions for VK_KHR_maintenance1 or vulkan 1.1
210+
VkPtr<PFN_vkTrimCommandPool> fTrimCommandPool;
211+
212+
// Functions for VK_KHR_maintenance3 or vulkan 1.1
213+
VkPtr<PFN_vkGetDescriptorSetLayoutSupport> fGetDescriptorSetLayoutSupport;
191214
} fFunctions;
192215
};
193216

0 commit comments

Comments
 (0)