1d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn/*
2d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
3d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * Copyright (C) 2015-2016 Valve Corporation
4d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * Copyright (C) 2015-2016 LunarG, Inc.
5d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
6d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License");
7d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * you may not use this file except in compliance with the License.
8d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * You may obtain a copy of the License at
9d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
10d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *     http://www.apache.org/licenses/LICENSE-2.0
11d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
12d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * Unless required by applicable law or agreed to in writing, software
13d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS,
14d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * See the License for the specific language governing permissions and
16d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * limitations under the License.
17d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
18d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn * Author: Jon Ashburn <jon@lunarg.com>
19d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn *
20d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn */
21d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
22d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn#pragma once
23d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn#include <unordered_map>
24d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn#include "vulkan/vk_layer.h"
25d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
26d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstruct wrapped_phys_dev_obj {
27d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerInstanceDispatchTable *loader_disp;
28d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    struct wrapped_inst_obj *inst;  // parent instance object
29d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    void *obj;
30d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn};
31d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
32d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstruct wrapped_inst_obj {
33d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerInstanceDispatchTable *loader_disp;
34d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerInstanceDispatchTable layer_disp;    //this layer's dispatch table
35d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    PFN_vkSetInstanceLoaderData pfn_inst_init;
36d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    struct wrapped_phys_dev_obj *ptr_phys_devs; // any enumerated phys devs
37d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkInstance obj;
38d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn};
39d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
40d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstruct wrapped_dev_obj {
41d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerDispatchTable *disp;
42d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerInstanceDispatchTable *layer_disp;  // TODO use this
43d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    PFN_vkSetDeviceLoaderData pfn_dev_init;  //TODO use this
44d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    void *obj;
45d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn};
46d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
47d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstatic inline VkInstance unwrap_instance(const VkInstance instance,  wrapped_inst_obj **inst) {
48d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn   *inst = reinterpret_cast<wrapped_inst_obj *> (instance);
49d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn   return (*inst)->obj;
50d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn}
51d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
52d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstatic inline VkPhysicalDevice unwrap_phys_dev(const VkPhysicalDevice physical_device,  wrapped_phys_dev_obj **phys_dev) {
53d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn   *phys_dev = reinterpret_cast<wrapped_phys_dev_obj *> (physical_device);
54d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn   return reinterpret_cast <VkPhysicalDevice> ((*phys_dev)->obj);
55d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn}
56d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn
57d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburnstatic void create_device_register_extensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
58d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    VkLayerDispatchTable *pDisp = device_dispatch_table(device);
59d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
60d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR");
61d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR");
62d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR");
63d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR");
64d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn    pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR");
65d45cf2771a72a29592e32025cb9bf2aa103d5e62Jon Ashburn}
66