1/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 * Copyright (c) 2016 Google Inc.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and/or associated documentation files (the "Materials"), to
9 * deal in the Materials without restriction, including without limitation the
10 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Materials, and to permit persons to whom the Materials are
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice(s) and this permission notice shall be included in
15 * all copies or substantial portions of the Materials.
16 *
17 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 *
21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
24 * USE OR OTHER DEALINGS IN THE MATERIALS.
25 *
26 */
27#pragma once
28
29#include <vulkan/vulkan.h>
30
31// ------------------------------------------------------------------------------------------------
32// CreateInstance and CreateDevice support structures
33
34typedef enum VkLayerFunction_ {
35    VK_LAYER_FUNCTION_LINK = 0,
36    VK_LAYER_FUNCTION_DATA_CALLBACK = 1
37} VkLayerFunction;
38
39typedef struct VkLayerInstanceLink_ {
40    struct VkLayerInstanceLink_* pNext;
41    PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
42} VkLayerInstanceLink;
43
44typedef VkResult(VKAPI_PTR* PFN_vkSetInstanceLoaderData)(VkInstance instance,
45                                                         void* object);
46typedef VkResult(VKAPI_PTR* PFN_vkSetDeviceLoaderData)(VkDevice device,
47                                                       void* object);
48
49typedef struct {
50    VkStructureType sType;  // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
51    const void* pNext;
52    VkLayerFunction function;
53    union {
54        VkLayerInstanceLink* pLayerInfo;
55        PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;
56    } u;
57} VkLayerInstanceCreateInfo;
58
59typedef struct VkLayerDeviceLink_ {
60    struct VkLayerDeviceLink_* pNext;
61    PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
62    PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr;
63} VkLayerDeviceLink;
64
65typedef struct {
66    VkStructureType sType;  // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
67    const void* pNext;
68    VkLayerFunction function;
69    union {
70        VkLayerDeviceLink* pLayerInfo;
71        PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData;
72    } u;
73} VkLayerDeviceCreateInfo;
74