blob: 09a5247d2ee8504beae5902c829aa64a7209bac3 [file] [log] [blame]
/*
*
* Copyright (C) 2015 Valve Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Author: Ian Elliott <ian@lunarg.com>
*
*/
//#define _ISOC11_SOURCE /* for aligned_alloc() */
#define _GNU_SOURCE
#include <stdlib.h>
#include <string.h>
#include "vk_loader_platform.h"
#include "loader.h"
#include "wsi.h"
static const VkExtensionProperties wsi_surface_extension_info = {
.extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_SURFACE_REVISION,
};
#ifdef _WIN32
static const VkExtensionProperties wsi_win32_surface_extension_info = {
.extensionName = VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_WIN32_SURFACE_REVISION,
};
#else // _WIN32
static const VkExtensionProperties wsi_mir_surface_extension_info = {
.extensionName = VK_KHR_MIR_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_MIR_SURFACE_REVISION,
};
static const VkExtensionProperties wsi_wayland_surface_extension_info = {
.extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_WAYLAND_SURFACE_REVISION,
};
static const VkExtensionProperties wsi_xcb_surface_extension_info = {
.extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_XCB_SURFACE_REVISION,
};
static const VkExtensionProperties wsi_xlib_surface_extension_info = {
.extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
.specVersion = VK_KHR_XLIB_SURFACE_REVISION,
};
#endif // _WIN32
void wsi_add_instance_extensions(
const struct loader_instance *inst,
struct loader_extension_list *ext_list)
{
loader_add_to_ext_list(inst, ext_list, 1, &wsi_surface_extension_info);
#ifdef _WIN32
loader_add_to_ext_list(inst, ext_list, 1, &wsi_win32_surface_extension_info);
#else // _WIN32
loader_add_to_ext_list(inst, ext_list, 1, &wsi_mir_surface_extension_info);
loader_add_to_ext_list(inst, ext_list, 1, &wsi_wayland_surface_extension_info);
loader_add_to_ext_list(inst, ext_list, 1, &wsi_xcb_surface_extension_info);
loader_add_to_ext_list(inst, ext_list, 1, &wsi_xlib_surface_extension_info);
#endif // _WIN32
}
void wsi_create_instance(
struct loader_instance *ptr_instance,
const VkInstanceCreateInfo *pCreateInfo)
{
ptr_instance->wsi_enabled = false;
#ifdef _WIN32
ptr_instance->wsi_surface_enabled = true;
#else // _WIN32
ptr_instance->wsi_mir_surface_enabled = false;
ptr_instance->wsi_wayland_surface_enabled = false;
ptr_instance->wsi_xcb_surface_enabled = false;
ptr_instance->wsi_xlib_surface_enabled = false;
#endif // _WIN32
ptr_instance->wsi_swapchain_enabled = false;
for (uint32_t i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_surface_enabled = true;
}
#ifdef _WIN32
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_surface_enabled = true;
}
#else // _WIN32
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_mir_surface_enabled = true;
}
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_wayland_surface_enabled = true;
}
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_xcb_surface_enabled = true;
}
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
ptr_instance->wsi_xlib_surface_enabled = true;
}
#endif // _WIN32
}
}
/*
* This is the trampoline entrypoint
* for GetPhysicalDeviceSurfaceSupportKHR
*/
VKAPI_ATTR VkResult VKAPI_CALL wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
VkBool32* pSupported)
{
const VkLayerInstanceDispatchTable *disp;
disp = loader_get_instance_dispatch(physicalDevice);
VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(
physicalDevice,
queueFamilyIndex,
surface,
pSupported);
return res;
}
/*
* This is the instance chain terminator function
* for GetPhysicalDeviceSurfaceSupportKHR
*/
VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
VkBool32* pSupported)
{
struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
struct loader_icd *icd = phys_dev->this_icd;
assert(pSupported && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
*pSupported = false;
assert(icd->GetPhysicalDeviceSurfaceSupportKHR && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
return icd->GetPhysicalDeviceSurfaceSupportKHR(phys_dev->phys_dev,
queueFamilyIndex,
surface,
pSupported);
}
bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
const char* name, void **addr)
{
*addr = NULL;
if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
*addr = ptr_instance->wsi_swapchain_enabled ? (void *) wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR : NULL;
return true;
}
return false;
}