blob: 197a9c8506de2ac528ec485ec41c60c87f464405 [file] [log] [blame]
{{/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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.
*/}}
{{Include "cpp_common.tmpl"}}
{{Include "opengl32_exports.tmpl"}}
{{$ | Macro "opengl32_x64.asm" | Reflow 4 | Write "opengl32_x64.asm"}}
{{/*
-------------------------------------------------------------------------------
Entry point.
-------------------------------------------------------------------------------
*/}}
{{define "opengl32_x64.asm"}}
; Copyright (C) 2015 The Android Open Source Project
;
; 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.
; This masm exposes trampoline functions for OpenGL 1.1 and WGL functions that
; are expected to be exposed by OpenGL32.dll but not declared by the API files.
; Lazy resolve all functions, then trampoline to the resolved address
TRAMPOLINE macro FUNC, REAL»
local skip
public FUNC
extern REAL:proc
«FUNC PROC»
mov eax, resolved
cmp eax, 0
jnz skip
; Function are not resolved, resolve now...
; Preserve arguments stored in registers (ecx, edx, r8 and r9)
push rcx
push rdx
push r8
push r9
; give resolve() the necessary 32 byte 'shadow space', and call resolve
sub rsp, 28h
call resolve
add rsp, 28h
; Reload argument registers
pop r9
pop r8
pop rdx
pop rcx
«skip
mov rax, [REAL]
mov rax, [rax]
jmp rax
«FUNC ENDP»
endm
«
extern resolve:proc
extern resolved:SDWORD
.CODE
{{/* This is the list of functions that OpenGL32.dll needs to export. */}}
{{$opengl32_exports := Strings (Macro "OpenGL32Exports") | SplitOn "\n"}}
{{/* This is the list of functions that the spy exports. */}}
{{$api_exports := (ForEach (AllCommands $) "CmdName") | Strings "wglGetProcAddress"}}
{{/* This is list of functions we need to create trampolines for. */}}
{{$trampolines := $opengl32_exports | FilterOut $api_exports}}
{{range $f := $trampolines}}
TRAMPOLINE {{$f}}, real__{{$f}}
{{end}}
end
{{end}}