Home | History | Annotate | Download | only in wsi
      1 /*
      2  * Copyright  2015 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 #ifndef WSI_COMMON_H
     24 #define WSI_COMMON_H
     25 
     26 #include <stdint.h>
     27 #include <stdbool.h>
     28 
     29 #include "util/vk_alloc.h"
     30 #include <vulkan/vulkan.h>
     31 #include <vulkan/vk_icd.h>
     32 
     33 struct wsi_device;
     34 struct wsi_image_fns {
     35    VkResult (*create_wsi_image)(VkDevice device_h,
     36                                 const VkSwapchainCreateInfoKHR *pCreateInfo,
     37                                 const VkAllocationCallbacks *pAllocator,
     38                                 VkImage *image_p,
     39                                 VkDeviceMemory *memory_p,
     40                                 uint32_t *size_p,
     41                                 uint32_t *offset_p,
     42                                 uint32_t *row_pitch_p,
     43                                 int *fd_p);
     44    void (*free_wsi_image)(VkDevice device,
     45                           const VkAllocationCallbacks *pAllocator,
     46                           VkImage image_h,
     47                           VkDeviceMemory memory_h);
     48 };
     49 
     50 struct wsi_swapchain {
     51 
     52    VkDevice device;
     53    VkAllocationCallbacks alloc;
     54    const struct wsi_image_fns *image_fns;
     55    VkFence fences[3];
     56    VkPresentModeKHR present_mode;
     57 
     58    VkResult (*destroy)(struct wsi_swapchain *swapchain,
     59                        const VkAllocationCallbacks *pAllocator);
     60    VkResult (*get_images)(struct wsi_swapchain *swapchain,
     61                           uint32_t *pCount, VkImage *pSwapchainImages);
     62    VkResult (*acquire_next_image)(struct wsi_swapchain *swap_chain,
     63                                   uint64_t timeout, VkSemaphore semaphore,
     64                                   uint32_t *image_index);
     65    VkResult (*queue_present)(struct wsi_swapchain *swap_chain,
     66                              uint32_t image_index);
     67 };
     68 
     69 struct wsi_interface {
     70    VkResult (*get_support)(VkIcdSurfaceBase *surface,
     71                            struct wsi_device *wsi_device,
     72                            const VkAllocationCallbacks *alloc,
     73                            uint32_t queueFamilyIndex,
     74                            VkBool32* pSupported);
     75    VkResult (*get_capabilities)(VkIcdSurfaceBase *surface,
     76                                 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
     77    VkResult (*get_formats)(VkIcdSurfaceBase *surface,
     78                            struct wsi_device *wsi_device,
     79                            uint32_t* pSurfaceFormatCount,
     80                            VkSurfaceFormatKHR* pSurfaceFormats);
     81    VkResult (*get_present_modes)(VkIcdSurfaceBase *surface,
     82                                  uint32_t* pPresentModeCount,
     83                                  VkPresentModeKHR* pPresentModes);
     84    VkResult (*create_swapchain)(VkIcdSurfaceBase *surface,
     85                                 VkDevice device,
     86                                 struct wsi_device *wsi_device,
     87                                 const VkSwapchainCreateInfoKHR* pCreateInfo,
     88                                 const VkAllocationCallbacks* pAllocator,
     89                                 const struct wsi_image_fns *image_fns,
     90                                 struct wsi_swapchain **swapchain);
     91 };
     92 
     93 #define VK_ICD_WSI_PLATFORM_MAX 5
     94 
     95 struct wsi_device {
     96     struct wsi_interface *                  wsi[VK_ICD_WSI_PLATFORM_MAX];
     97 };
     98 
     99 struct wsi_callbacks {
    100    void (*get_phys_device_format_properties)(VkPhysicalDevice physicalDevice,
    101                                              VkFormat format,
    102                                              VkFormatProperties *pFormatProperties);
    103 };
    104 
    105 #define WSI_DEFINE_NONDISP_HANDLE_CASTS(__wsi_type, __VkType)              \
    106                                                                            \
    107    static inline struct __wsi_type *                                       \
    108    __wsi_type ## _from_handle(__VkType _handle)                            \
    109    {                                                                       \
    110       return (struct __wsi_type *)(uintptr_t) _handle;                     \
    111    }                                                                       \
    112                                                                            \
    113    static inline __VkType                                                  \
    114    __wsi_type ## _to_handle(struct __wsi_type *_obj)                       \
    115    {                                                                       \
    116       return (__VkType)(uintptr_t) _obj;                                   \
    117    }
    118 
    119 WSI_DEFINE_NONDISP_HANDLE_CASTS(wsi_swapchain, VkSwapchainKHR)
    120 
    121 #define ICD_DEFINE_NONDISP_HANDLE_CASTS(__VkIcdType, __VkType)             \
    122                                                                            \
    123    static inline __VkIcdType *                                             \
    124    __VkIcdType ## _from_handle(__VkType _handle)                           \
    125    {                                                                       \
    126       return (__VkIcdType *)(uintptr_t) _handle;                           \
    127    }                                                                       \
    128                                                                            \
    129    static inline __VkType                                                  \
    130    __VkIcdType ## _to_handle(__VkIcdType *_obj)                            \
    131    {                                                                       \
    132       return (__VkType)(uintptr_t) _obj;                                   \
    133    }
    134 
    135 #define ICD_FROM_HANDLE(__VkIcdType, __name, __handle) \
    136    __VkIcdType *__name = __VkIcdType ## _from_handle(__handle)
    137 
    138 ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, VkSurfaceKHR)
    139 
    140 VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device,
    141                           const VkAllocationCallbacks *alloc);
    142 void wsi_x11_finish_wsi(struct wsi_device *wsi_device,
    143                         const VkAllocationCallbacks *alloc);
    144 VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device,
    145                          const VkAllocationCallbacks *alloc,
    146                          VkPhysicalDevice physical_device,
    147                          const struct wsi_callbacks *cbs);
    148 void wsi_wl_finish_wsi(struct wsi_device *wsi_device,
    149                        const VkAllocationCallbacks *alloc);
    150 
    151 
    152 #endif
    153