diff options
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/CMakeLists.txt | 10 | ||||
| -rw-r--r-- | loader/loader.c | 42 |
2 files changed, 44 insertions, 8 deletions
diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index d8039304..002e4052 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -11,6 +11,10 @@ add_custom_command(OUTPUT vulkan.def COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk-generate.py win-def-file vulkan all > vulkan.def DEPENDS ${PROJECT_SOURCE_DIR}/vk-generate.py ${PROJECT_SOURCE_DIR}/vulkan.py) +add_custom_command(OUTPUT gpa_helper.h + COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk-generate.py loader-get-proc-addr loader > gpa_helper.h + DEPENDS ${PROJECT_SOURCE_DIR}/vk-generate.py ${PROJECT_SOURCE_DIR}/vulkan.py) + include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @@ -23,16 +27,16 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") if (WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES -D_CRT_SECURE_NO_WARNINGS -DXCB_NVIDIA") - add_library(vulkan SHARED loader.c loader.h dirent_on_windows.c dispatch.c table_ops.h vulkan.def) + add_library(vulkan SHARED loader.c loader.h dirent_on_windows.c dispatch.c table_ops.h gpa_helper.h vulkan.def) set_target_properties(vulkan PROPERTIES LINK_FLAGS "/DEF:${PROJECT_SOURCE_DIR}/loader/vulkan.def") - add_library(VKstatic STATIC loader.c loader.h dirent_on_windows.c dispatch.c table_ops.h) + add_library(VKstatic STATIC loader.c loader.h dirent_on_windows.c dispatch.c table_ops.h gpa_helper.h) set_target_properties(VKstatic PROPERTIES OUTPUT_NAME VKstatic) target_link_libraries(vulkan) endif() if (NOT WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES -Wpointer-arith") - add_library(vulkan SHARED loader.c dispatch.c table_ops.h) + add_library(vulkan SHARED loader.c dispatch.c table_ops.h gpa_helper.h) set_target_properties(vulkan PROPERTIES SOVERSION 0) target_link_libraries(vulkan -ldl -lpthread) endif() diff --git a/loader/loader.c b/loader/loader.c index 3ce99f01..712118ac 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -42,6 +42,7 @@ #endif // WIN32 #include "loader_platform.h" #include "table_ops.h" +#include "gpa_helper.h" #include "loader.h" #include "vkIcd.h" // The following is #included again to catch certain OS-specific functions @@ -711,6 +712,28 @@ static void loader_init_dispatch_table(VkLayerDispatchTable *tab, PFN_vkGetProcA tab->EnumerateLayers = vkEnumerateLayers; } +static void *loader_gpa_internal(VkPhysicalGpu gpu, const char * pName) +{ + if (gpu == NULL) { + return NULL;; + } + VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu; + VkLayerDispatchTable * disp_table = * (VkLayerDispatchTable **) gpuw->baseObject; + void *addr; + + if (disp_table == NULL) + return NULL; + + addr = loader_lookup_dispatch_table(disp_table, pName); + if (addr) + return addr; + else { + if (disp_table->GetProcAddr == NULL) + return NULL; + return disp_table->GetProcAddr(gpuw->nextObject, pName); + } +} + extern struct loader_icd * loader_get_icd(const VkBaseLayerObject *gpu, uint32_t *gpu_index) { /* @@ -971,7 +994,7 @@ extern uint32_t loader_activate_layers(struct loader_icd *icd, uint32_t gpu_inde if (!loader_layers_activated(icd, gpu_index)) { VkBaseLayerObject *gpuObj = gpu; VkBaseLayerObject *nextGpuObj, *baseObj = gpuObj->baseObject; - PFN_vkGetProcAddr nextGPA = vkGetProcAddr; + PFN_vkGetProcAddr nextGPA = loader_gpa_internal; count = loader_get_layer_libs(icd, gpu_index, ext_count, ext_names, &pLayerNames); if (!count) @@ -1211,12 +1234,21 @@ LOADER_EXPORT VkResult VKAPI vkEnumerateGpus( LOADER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalGpu gpu, const char * pName) { if (gpu == NULL) { - return NULL; + + /* return entrypoint addresses that are global (in the loader)*/ + return globalGetProcAddr(pName); } - VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu; - VkLayerDispatchTable * disp_table = * (VkLayerDispatchTable **) gpuw->baseObject; + void *addr; + /* for entrypoints that loader must handle (ie non-dispatchable or create object) + make sure the loader entrypoint is returned */ + addr = loader_non_passthrough_gpa(pName); + if (addr) + return addr; + + /* return the dispatch table entrypoint for the fastest case */ + const VkLayerDispatchTable *disp_table = * (VkLayerDispatchTable **) gpu; if (disp_table == NULL) return NULL; @@ -1226,7 +1258,7 @@ LOADER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalGpu gpu, const char * pName) else { if (disp_table->GetProcAddr == NULL) return NULL; - return disp_table->GetProcAddr(gpuw->nextObject, pName); + return disp_table->GetProcAddr(gpu, pName); } } |
