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