tools/trace: add initial interposed Vulkan tracing library
This commit is contained in:
parent
114e960810
commit
222b662995
@ -16,6 +16,7 @@ endif ()
|
||||
###############################################################################
|
||||
set (GENERATED_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cruft/vk/")
|
||||
file (MAKE_DIRECTORY "${GENERATED_PREFIX}/load")
|
||||
file (MAKE_DIRECTORY "${GENERATED_PREFIX}/tools")
|
||||
|
||||
|
||||
if (WIN32)
|
||||
@ -33,6 +34,7 @@ OUTPUT
|
||||
"${GENERATED_PREFIX}/vk.hpp"
|
||||
"${GENERATED_PREFIX}/load/dispatch.cpp"
|
||||
"${GENERATED_PREFIX}/load/vtable.hpp"
|
||||
"${GENERATED_PREFIX}/tools/trace.cpp"
|
||||
COMMENT
|
||||
"[spec.py] vk.hpp"
|
||||
COMMAND
|
||||
@ -42,6 +44,7 @@ COMMAND
|
||||
"--dst" "${GENERATED_PREFIX}/vk.hpp"
|
||||
"--load" "${GENERATED_PREFIX}/load/vtable.hpp"
|
||||
"--dispatch" "${GENERATED_PREFIX}/load/dispatch.cpp"
|
||||
"--trace" "${GENERATED_PREFIX}/tools/trace.cpp"
|
||||
"--platform" "${VK_PLATFORM}"
|
||||
DEPENDS
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/tools/spec.py"
|
||||
@ -204,6 +207,18 @@ endforeach ()
|
||||
target_link_libraries (vk_info cruft-vk cruft-vk-load)
|
||||
target_link_libraries (vk_hello ${NC_CXX_STDCXXFS} cruft cruft-vk glfw vulkan)
|
||||
|
||||
add_library (trace SHARED
|
||||
"${GENERATED_PREFIX}/tools/trace.cpp"
|
||||
)
|
||||
|
||||
target_include_directories (trace
|
||||
PUBLIC
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/specs/include/vulkan"
|
||||
)
|
||||
|
||||
target_link_libraries(trace cruft-vk)
|
||||
|
||||
##-----------------------------------------------------------------------------
|
||||
add_dependencies (vk_hello hello.vert.spv hello.frag.spv)
|
||||
|
@ -991,6 +991,54 @@ def write_dispatch(dst: TextIO, q: List[Type], reg: Registry):
|
||||
}}
|
||||
""")
|
||||
|
||||
def write_trace(dst: TextIO, q: List[Type], reg: Registry):
|
||||
dst.write("""
|
||||
#include <cruft/vk/vk.hpp>
|
||||
#include <cruft/vk/load/vtable.hpp>
|
||||
#include <cruft/vk/ostream.hpp>
|
||||
#include <iostream>
|
||||
#include <dlfcn.h>
|
||||
#include <cstring>
|
||||
|
||||
static void* g_lib;
|
||||
|
||||
void init [[gnu::constructor]] (void) {
|
||||
g_lib = dlopen (getenv ("REAL_VULKAN"), RTLD_LAZY | RTLD_LOCAL);
|
||||
}
|
||||
|
||||
void deinit [[gnu::destructor]] (void) {
|
||||
dlclose (g_lib);
|
||||
g_lib = nullptr;
|
||||
}
|
||||
#pragma GCC diagnostic ignored "-Wsign-promo"
|
||||
""")
|
||||
|
||||
|
||||
for obj in (i for i in q if isinstance(i, Command)):
|
||||
inner = ""
|
||||
if obj.name in [ 'vkGetInstanceProcAddr' ]:
|
||||
inner = """
|
||||
|
||||
#define FWD(NAME) \\
|
||||
if (!strcmp(#NAME,pName)) { \\
|
||||
if (fn (nullptr, #NAME)) \\
|
||||
return (PFN_vkVoidFunction)NAME; \\
|
||||
else \\
|
||||
return nullptr;\\
|
||||
}
|
||||
MAP_INSTANCE_COMMANDS(FWD)
|
||||
#undef FWD
|
||||
std::clog << "Missed: " << pName << '\\n';
|
||||
"""
|
||||
|
||||
dst.write(f"""
|
||||
extern "C" {obj.result} {rename(obj.name)} ({", ".join(p.param for p in obj.params)}) noexcept {{
|
||||
std::clog << "{obj.name}" << " " << {'<< " " << '.join (p.name for p in obj.params)} << '\\n';
|
||||
static auto fn = reinterpret_cast<decltype({obj.name})*> (dlsym (g_lib, "{obj.name}"));
|
||||
{inner}
|
||||
return (*fn) ({','.join (p.name for p in obj.params)});
|
||||
}}""")
|
||||
|
||||
|
||||
###############################################################################
|
||||
import argparse
|
||||
@ -1005,6 +1053,7 @@ def main():
|
||||
parser.add_argument('--dst', type=str, help='the output path for the result')
|
||||
parser.add_argument('--load', type=str, help='the output path for the loading routines')
|
||||
parser.add_argument('--dispatch', type=str, help="the output path for function dispatch")
|
||||
parser.add_argument('--trace', type=str, help="the output path for the vulkan tracing library")
|
||||
parser.add_argument(
|
||||
'--platform',
|
||||
type=str,
|
||||
@ -1104,6 +1153,9 @@ def main():
|
||||
with open(args.dispatch, 'w') as dst:
|
||||
write_dispatch(dst, q, reg)
|
||||
|
||||
with open(args.trace, 'w') as dst:
|
||||
write_trace(dst, q, reg)
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
if __name__ == '__main__':
|
||||
|
Loading…
Reference in New Issue
Block a user