# # Copyright (c) 2017 The Khronos Group Inc. # Copyright (c) 2017 Valve Corporation # Copyright (c) 2017 LunarG, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Author: Lenny Komow # # This code is used to pass on physical device extensions through the call chain. It must do this without creating a stack frame, # because the actual parameters of the call are not known. Since the first parameter is known to be a VkPhysicalDevice, it can # unwrap the physical device, overwriting the wrapped device, and then jump to the next function in the call chain .intel_syntax noprefix .include "gen_defines.asm" .ifdef X86_64 .set PHYS_DEV_SIZE, 8 .set PHYS_DEV_UNWRAP_OFFSET, 16 .set PTR_SIZE, 8 .macro PhysDevExtTramp num .global vkPhysDevExtTramp\num vkPhysDevExtTramp\num: mov rax, [rdi] mov rdi, [rdi + PHYS_DEV_UNWRAP_OFFSET] jmp [rax + (PHYS_DEV_DISP_OFFSET + (PTR_SIZE * \num))] .endm .else # NOTE: The 32-bit code has not been properly tested, so it likely won't work .set PHYS_DEV_SIZE, 4 .set PHYS_DEV_UNWRAP_OFFSET, 8 .set PTR_SIZE, 4 .macro PhysDevExtTramp num .global vkPhysDevExtTramp\num vkPhysDevExtTramp\num: mov eax, [esp + PHYS_DEV_SIZE] # Load the wrapped VkPhysicalDevice into eax mov ecx, [eax + PHYS_DEV_UNWRAP_OFFSET] # Load the unwrapped VkPhysicalDevice into ecx mov [esp + PHYS_DEV_SIZE], ecx # Overwrite the wrapped VkPhysicalDevice with the unwrapped one (on the stack) mov eax, [eax] # Dereference the wrapped VkPhysicalDevice to get the dispatch table in eax jmp [eax + (PHYS_DEV_DISP_OFFSET + (PTR_SIZE * \num))] # Dereference the wrapped VkPhysicalDevice to get the dispatch table in eax .endm .endif .text PhysDevExtTramp 0 PhysDevExtTramp 1 PhysDevExtTramp 2 PhysDevExtTramp 3 PhysDevExtTramp 4 PhysDevExtTramp 5 PhysDevExtTramp 6 PhysDevExtTramp 7 PhysDevExtTramp 8 PhysDevExtTramp 9 PhysDevExtTramp 10 PhysDevExtTramp 11 PhysDevExtTramp 12 PhysDevExtTramp 13 PhysDevExtTramp 14 PhysDevExtTramp 15 PhysDevExtTramp 16 PhysDevExtTramp 17 PhysDevExtTramp 18 PhysDevExtTramp 19 PhysDevExtTramp 20 PhysDevExtTramp 21 PhysDevExtTramp 22 PhysDevExtTramp 23 PhysDevExtTramp 24 PhysDevExtTramp 25 PhysDevExtTramp 26 PhysDevExtTramp 27 PhysDevExtTramp 28 PhysDevExtTramp 29 PhysDevExtTramp 30 PhysDevExtTramp 31 PhysDevExtTramp 32 PhysDevExtTramp 33 PhysDevExtTramp 34 PhysDevExtTramp 35 PhysDevExtTramp 36 PhysDevExtTramp 37 PhysDevExtTramp 38 PhysDevExtTramp 39 PhysDevExtTramp 40 PhysDevExtTramp 41 PhysDevExtTramp 42 PhysDevExtTramp 43 PhysDevExtTramp 44 PhysDevExtTramp 45 PhysDevExtTramp 46 PhysDevExtTramp 47 PhysDevExtTramp 48 PhysDevExtTramp 49 PhysDevExtTramp 50 PhysDevExtTramp 51 PhysDevExtTramp 52 PhysDevExtTramp 53 PhysDevExtTramp 54 PhysDevExtTramp 55 PhysDevExtTramp 56 PhysDevExtTramp 57 PhysDevExtTramp 58 PhysDevExtTramp 59 PhysDevExtTramp 60 PhysDevExtTramp 61 PhysDevExtTramp 62 PhysDevExtTramp 63 PhysDevExtTramp 64 PhysDevExtTramp 65 PhysDevExtTramp 66 PhysDevExtTramp 67 PhysDevExtTramp 68 PhysDevExtTramp 69 PhysDevExtTramp 70 PhysDevExtTramp 71 PhysDevExtTramp 72 PhysDevExtTramp 73 PhysDevExtTramp 74 PhysDevExtTramp 75 PhysDevExtTramp 76 PhysDevExtTramp 77 PhysDevExtTramp 78 PhysDevExtTramp 79 PhysDevExtTramp 80 PhysDevExtTramp 81 PhysDevExtTramp 82 PhysDevExtTramp 83 PhysDevExtTramp 84 PhysDevExtTramp 85 PhysDevExtTramp 86 PhysDevExtTramp 87 PhysDevExtTramp 88 PhysDevExtTramp 89 PhysDevExtTramp 90 PhysDevExtTramp 91 PhysDevExtTramp 92 PhysDevExtTramp 93 PhysDevExtTramp 94 PhysDevExtTramp 95 PhysDevExtTramp 96 PhysDevExtTramp 97 PhysDevExtTramp 98 PhysDevExtTramp 99 PhysDevExtTramp 100 PhysDevExtTramp 101 PhysDevExtTramp 102 PhysDevExtTramp 103 PhysDevExtTramp 104 PhysDevExtTramp 105 PhysDevExtTramp 106 PhysDevExtTramp 107 PhysDevExtTramp 108 PhysDevExtTramp 109 PhysDevExtTramp 110 PhysDevExtTramp 111 PhysDevExtTramp 112 PhysDevExtTramp 113 PhysDevExtTramp 114 PhysDevExtTramp 115 PhysDevExtTramp 116 PhysDevExtTramp 117 PhysDevExtTramp 118 PhysDevExtTramp 119 PhysDevExtTramp 120 PhysDevExtTramp 121 PhysDevExtTramp 122 PhysDevExtTramp 123 PhysDevExtTramp 124 PhysDevExtTramp 125 PhysDevExtTramp 126 PhysDevExtTramp 127 PhysDevExtTramp 128 PhysDevExtTramp 129 PhysDevExtTramp 130 PhysDevExtTramp 131 PhysDevExtTramp 132 PhysDevExtTramp 133 PhysDevExtTramp 134 PhysDevExtTramp 135 PhysDevExtTramp 136 PhysDevExtTramp 137 PhysDevExtTramp 138 PhysDevExtTramp 139 PhysDevExtTramp 140 PhysDevExtTramp 141 PhysDevExtTramp 142 PhysDevExtTramp 143 PhysDevExtTramp 144 PhysDevExtTramp 145 PhysDevExtTramp 146 PhysDevExtTramp 147 PhysDevExtTramp 148 PhysDevExtTramp 149 PhysDevExtTramp 150 PhysDevExtTramp 151 PhysDevExtTramp 152 PhysDevExtTramp 153 PhysDevExtTramp 154 PhysDevExtTramp 155 PhysDevExtTramp 156 PhysDevExtTramp 157 PhysDevExtTramp 158 PhysDevExtTramp 159 PhysDevExtTramp 160 PhysDevExtTramp 161 PhysDevExtTramp 162 PhysDevExtTramp 163 PhysDevExtTramp 164 PhysDevExtTramp 165 PhysDevExtTramp 166 PhysDevExtTramp 167 PhysDevExtTramp 168 PhysDevExtTramp 169 PhysDevExtTramp 170 PhysDevExtTramp 171 PhysDevExtTramp 172 PhysDevExtTramp 173 PhysDevExtTramp 174 PhysDevExtTramp 175 PhysDevExtTramp 176 PhysDevExtTramp 177 PhysDevExtTramp 178 PhysDevExtTramp 179 PhysDevExtTramp 180 PhysDevExtTramp 181 PhysDevExtTramp 182 PhysDevExtTramp 183 PhysDevExtTramp 184 PhysDevExtTramp 185 PhysDevExtTramp 186 PhysDevExtTramp 187 PhysDevExtTramp 188 PhysDevExtTramp 189 PhysDevExtTramp 190 PhysDevExtTramp 191 PhysDevExtTramp 192 PhysDevExtTramp 193 PhysDevExtTramp 194 PhysDevExtTramp 195 PhysDevExtTramp 196 PhysDevExtTramp 197 PhysDevExtTramp 198 PhysDevExtTramp 199 PhysDevExtTramp 200 PhysDevExtTramp 201 PhysDevExtTramp 202 PhysDevExtTramp 203 PhysDevExtTramp 204 PhysDevExtTramp 205 PhysDevExtTramp 206 PhysDevExtTramp 207 PhysDevExtTramp 208 PhysDevExtTramp 209 PhysDevExtTramp 210 PhysDevExtTramp 211 PhysDevExtTramp 212 PhysDevExtTramp 213 PhysDevExtTramp 214 PhysDevExtTramp 215 PhysDevExtTramp 216 PhysDevExtTramp 217 PhysDevExtTramp 218 PhysDevExtTramp 219 PhysDevExtTramp 220 PhysDevExtTramp 221 PhysDevExtTramp 222 PhysDevExtTramp 223 PhysDevExtTramp 224 PhysDevExtTramp 225 PhysDevExtTramp 226 PhysDevExtTramp 227 PhysDevExtTramp 228 PhysDevExtTramp 229 PhysDevExtTramp 230 PhysDevExtTramp 231 PhysDevExtTramp 232 PhysDevExtTramp 233 PhysDevExtTramp 234 PhysDevExtTramp 235 PhysDevExtTramp 236 PhysDevExtTramp 237 PhysDevExtTramp 238 PhysDevExtTramp 239 PhysDevExtTramp 240 PhysDevExtTramp 241 PhysDevExtTramp 242 PhysDevExtTramp 243 PhysDevExtTramp 244 PhysDevExtTramp 245 PhysDevExtTramp 246 PhysDevExtTramp 247 PhysDevExtTramp 248 PhysDevExtTramp 249