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