aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2015-04-13 18:10:06 -0600
committerChia-I Wu <olv@lunarg.com>2015-04-16 17:48:20 +0800
commitef329ef041b9342c86cd1536d41bd201ed61c0ff (patch)
treef5adf42b25b04179f81474b976899786c7ebd230 /loader
parentb8ec6fe6250725313d12d749372c7ebfc14f367a (diff)
downloadusermoji-ef329ef041b9342c86cd1536d41bd201ed61c0ff.tar.xz
loader: Fix GetProcAddr to return proper function pointers for app
Add case of handling null gpu object for global functions. For device specifc functions use the dispatch table or the loader entrypoints depending on if the trampoline code can be skipped or not. Conflicts: loader/CMakeLists.txt vk-generate.py v2: undo accidental rename of LayerInterceptProcSubcommand fix WinDefFileSubcommand due to rebase (olv)
Diffstat (limited to 'loader')
-rw-r--r--loader/CMakeLists.txt10
-rw-r--r--loader/loader.c42
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);
}
}