text: /* Automatically generated from Vulkan vk.xml; DO NOT EDIT!
   *
   * This file is generated from Vulkan vk.xml file covered
   * by the following copyright and permission notice:
   *
   * Copyright (c) 2015-2019 The Khronos Group Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   * ---- Exceptions to the Apache 2.0 License: ----
   *
   * As an exception, if you use this Software to generate code and portions of
   * this Software are embedded into the generated code as a result, you may
   * redistribute such product without providing attribution as would otherwise
   * be required by Sections 4(a), 4(b) and 4(d) of the License.
   *
   * In addition, if you combine or link code generated by this Software with
   * software that is licensed under the GPLv2 or the LGPL v2.0 or 2.1
   * ("`Combined Software`") and if a court of competent jurisdiction determines
   * that the patent provision (Section 3), the indemnity provision (Section 9)
   * or other Section of the License conflicts with the conditions of the
   * applicable GPL or LGPL license, you may retroactively and prospectively
   * choose to deem waived or otherwise exclude such Section(s) of the License,
   * but only in their entirety and only with respect to the Combined Software.
   *
   */
  
  #ifndef __WINE_VULKAN_DRIVER_H
  #define __WINE_VULKAN_DRIVER_H
  
  /* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */
  #define WINE_VULKAN_DRIVER_VERSION 7
  
  struct vulkan_funcs
  {
      /* Vulkan global functions. These are the only calls at this point a graphics driver
       * needs to provide. Other function calls will be provided indirectly by dispatch
       * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice.
       */
      VkResult (*p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *);
      VkResult (*p_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *);
      VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *);
      void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *);
      void (*p_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *);
      void (*p_vkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *);
      VkResult (*p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *);
      VkResult (*p_vkGetDeviceGroupSurfacePresentModesKHR)(VkDevice, VkSurfaceKHR, VkDeviceGroupPresentModeFlagsKHR *);
      void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *);
      void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *);
      VkResult (*p_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *);
      VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *);
      VkResult (*p_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *);
      VkResult (*p_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkPresentModeKHR *);
      VkResult (*p_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice, uint32_t, VkSurfaceKHR, VkBool32 *);
      VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t);
      VkResult (*p_vkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *);
      VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
  
      /* Optional. Returns TRUE if FS hack is active, otherwise returns FALSE. If
       * it returns TRUE, then real_sz will contain the actual display
       * resolution; user_sz will contain the app's requested mode; and dst_blit
       * will contain the area to blit the user image to in real coordinates.
       * All parameters are optional. */
      VkBool32 (*query_fs_hack)(VkExtent2D *real_sz, VkExtent2D *user_sz, VkRect2D *dst_blit, VkFilter *filter);
  };
  
  extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);
  
  static inline void *get_vulkan_driver_device_proc_addr(
          const struct vulkan_funcs *vulkan_funcs, const char *name)
  {
      if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
  
      name += 2;
  
      if (!strcmp(name, "CreateSwapchainKHR"))
          return vulkan_funcs->p_vkCreateSwapchainKHR;
      if (!strcmp(name, "DestroySwapchainKHR"))
          return vulkan_funcs->p_vkDestroySwapchainKHR;
      if (!strcmp(name, "GetDeviceGroupSurfacePresentModesKHR"))
          return vulkan_funcs->p_vkGetDeviceGroupSurfacePresentModesKHR;
      if (!strcmp(name, "GetDeviceProcAddr"))
          return vulkan_funcs->p_vkGetDeviceProcAddr;
      if (!strcmp(name, "GetSwapchainImagesKHR"))
          return vulkan_funcs->p_vkGetSwapchainImagesKHR;
      if (!strcmp(name, "QueuePresentKHR"))
          return vulkan_funcs->p_vkQueuePresentKHR;
  
      return NULL;
  }
  
  static inline void *get_vulkan_driver_instance_proc_addr(
          const struct vulkan_funcs *vulkan_funcs, VkInstance instance, const char *name)
  {
      if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
  
      name += 2;
  
      if (!strcmp(name, "CreateInstance"))
          return vulkan_funcs->p_vkCreateInstance;
      if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
          return vulkan_funcs->p_vkEnumerateInstanceExtensionProperties;
  
      if (!instance) return NULL;
  
      if (!strcmp(name, "CreateWin32SurfaceKHR"))
          return vulkan_funcs->p_vkCreateWin32SurfaceKHR;
      if (!strcmp(name, "DestroyInstance"))
          return vulkan_funcs->p_vkDestroyInstance;
      if (!strcmp(name, "DestroySurfaceKHR"))
          return vulkan_funcs->p_vkDestroySurfaceKHR;
      if (!strcmp(name, "GetInstanceProcAddr"))
          return vulkan_funcs->p_vkGetInstanceProcAddr;
      if (!strcmp(name, "GetPhysicalDevicePresentRectanglesKHR"))
          return vulkan_funcs->p_vkGetPhysicalDevicePresentRectanglesKHR;
      if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR"))
          return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
      if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))
          return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceFormatsKHR;
      if (!strcmp(name, "GetPhysicalDeviceSurfacePresentModesKHR"))
          return vulkan_funcs->p_vkGetPhysicalDeviceSurfacePresentModesKHR;
      if (!strcmp(name, "GetPhysicalDeviceSurfaceSupportKHR"))
          return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceSupportKHR;
      if (!strcmp(name, "GetPhysicalDeviceWin32PresentationSupportKHR"))
          return vulkan_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR;
  
      name -= 2;
  
      return get_vulkan_driver_device_proc_addr(vulkan_funcs, name);
  }
  
  #endif /* __WINE_VULKAN_DRIVER_H */
  