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+
1619GrVkInterface::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
0 commit comments