aboutsummaryrefslogtreecommitdiff
path: root/loader/loader.c
diff options
context:
space:
mode:
authorMark Young <marky@lunarg.com>2016-11-07 13:27:02 -0700
committerMark Young <marky@lunarg.com>2016-11-14 11:02:40 -0700
commite7bf86e164e88409324fa2c8b41e0775f9d48501 (patch)
tree10ebbd2988ad6537ee5977b11ef3814ac628bc52 /loader/loader.c
parent1731acbd8ce5cdadf879117f92cd0b1d1388e440 (diff)
downloadusermoji-e7bf86e164e88409324fa2c8b41e0775f9d48501.tar.xz
loader: gh1120/gh1134 - Object wrapping issues
First issue was that we needed to override vkGetDeviceProcAddr. Instead of allowing this to always go directly to the ICD, we needed to intercept a few commands because they require a loader trampoline and terminator call. Most commands still return a pointer directly to ICD command. GH1120 - Unwrap both the physical device handles and the KHR_surface handles in the loader during both the trampoline and terminator calls for DebugMarker commands. This has to be done since the values given to an application are the loader trampoline versions, and the values given to the last layer is the loader terminator versions. GH1134 - We were passing down the wrong device object to the ICD functions when querying the ICD command function address and comparing it in the override functions. Thanks to Baldur (Mr. Renderdoc) for discovering this, testing my fixes, and resolving several bugs. Change-Id: I7618d71ffee6c53d9842758210a9261f6b3a1797
Diffstat (limited to 'loader/loader.c')
-rw-r--r--loader/loader.c63
1 files changed, 30 insertions, 33 deletions
diff --git a/loader/loader.c b/loader/loader.c
index b433237a..73281f9c 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -1262,9 +1262,10 @@ loader_get_icd_and_device(const VkDevice device,
icd_term = icd_term->next) {
for (struct loader_device *dev = icd_term->logical_device_list; dev;
dev = dev->next)
- /* Value comparison of device prevents object wrapping by layers
- */
- if (loader_get_dispatch(dev->device) ==
+ // Value comparison of device prevents object wrapping by layers
+ if (loader_get_dispatch(dev->icd_device) ==
+ loader_get_dispatch(device) ||
+ loader_get_dispatch(dev->chain_device) ==
loader_get_dispatch(device)) {
*found_dev = dev;
if (NULL != icd_index) {
@@ -1644,6 +1645,8 @@ static bool loader_icd_init_entrys(struct loader_icd_term *icd_term,
LOOKUP_GIPA(GetPhysicalDeviceSparseImageFormatProperties, true);
LOOKUP_GIPA(CreateDebugReportCallbackEXT, false);
LOOKUP_GIPA(DestroyDebugReportCallbackEXT, false);
+ LOOKUP_GIPA(DebugMarkerSetObjectTagEXT, false);
+ LOOKUP_GIPA(DebugMarkerSetObjectNameEXT, false);
LOOKUP_GIPA(GetPhysicalDeviceSurfaceSupportKHR, false);
LOOKUP_GIPA(GetPhysicalDeviceSurfaceCapabilitiesKHR, false);
LOOKUP_GIPA(GetPhysicalDeviceSurfaceFormatsKHR, false);
@@ -3268,36 +3271,28 @@ loader_gpa_instance_internal(VkInstance inst, const char *pName) {
return NULL;
}
-void loader_override_terminating_device_proc(
- VkDevice device, struct loader_dev_dispatch_table *disp_table) {
- struct loader_device *dev;
- struct loader_icd_term *icd_term =
- loader_get_icd_and_device(device, &dev, NULL);
-
- // Certain device entry-points still need to go through a terminator before
- // hitting the ICD. This could be for several reasons, but the main one
- // is currently unwrapping an object before passing the appropriate info
- // along to the ICD.
- if ((PFN_vkVoidFunction)disp_table->core_dispatch.CreateSwapchainKHR ==
- (PFN_vkVoidFunction)icd_term->GetDeviceProcAddr(
- device, "vkCreateSwapchainKHR")) {
- disp_table->core_dispatch.CreateSwapchainKHR =
- terminator_vkCreateSwapchainKHR;
- }
-}
-
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
loader_gpa_device_internal(VkDevice device, const char *pName) {
struct loader_device *dev;
struct loader_icd_term *icd_term =
loader_get_icd_and_device(device, &dev, NULL);
- // Certain device entry-points still need to go through a terminator before
- // hitting the ICD. This could be for several reasons, but the main one
- // is currently unwrapping an object before passing the appropriate info
- // along to the ICD.
- if (!strcmp(pName, "vkCreateSwapchainKHR")) {
+ // NOTE: Device Funcs needing Trampoline/Terminator.
+ // Overrides for device functions needing a trampoline and
+ // a terminator because certain device entry-points still need to go
+ // through a terminator before hitting the ICD. This could be for
+ // several reasons, but the main one is currently unwrapping an
+ // object before passing the appropriate info along to the ICD.
+ // This is why we also have to override the direct ICD call to
+ // vkGetDeviceProcAddr to intercept those calls.
+ if (!strcmp(pName, "vkGetDeviceProcAddr")) {
+ return (PFN_vkVoidFunction)loader_gpa_device_internal;
+ } else if (!strcmp(pName, "vkCreateSwapchainKHR")) {
return (PFN_vkVoidFunction)terminator_vkCreateSwapchainKHR;
+ } else if (!strcmp(pName, "vkDebugMarkerSetObjectTagEXT")) {
+ return (PFN_vkVoidFunction)terminator_DebugMarkerSetObjectTagEXT;
+ } else if (!strcmp(pName, "vkDebugMarkerSetObjectNameEXT")) {
+ return (PFN_vkVoidFunction)terminator_DebugMarkerSetObjectNameEXT;
}
return icd_term->GetDeviceProcAddr(device, pName);
@@ -3321,7 +3316,7 @@ static void loader_init_dispatch_dev_ext_entry(struct loader_instance *inst,
void *gdpa_value;
if (dev != NULL) {
gdpa_value = dev->loader_dispatch.core_dispatch.GetDeviceProcAddr(
- dev->device, funcName);
+ dev->chain_device, funcName);
if (gdpa_value != NULL)
dev->loader_dispatch.ext_dispatch.dev_ext[idx] =
(PFN_vkDevExt)gdpa_value;
@@ -3332,7 +3327,7 @@ static void loader_init_dispatch_dev_ext_entry(struct loader_instance *inst,
while (ldev) {
gdpa_value =
ldev->loader_dispatch.core_dispatch.GetDeviceProcAddr(
- ldev->device, funcName);
+ ldev->chain_device, funcName);
if (gdpa_value != NULL)
ldev->loader_dispatch.ext_dispatch.dev_ext[idx] =
(PFN_vkDevExt)gdpa_value;
@@ -3982,15 +3977,15 @@ loader_create_device_chain(const struct loader_physical_device_tramp *pd,
if (res != VK_SUCCESS) {
return res;
}
- dev->device = created_device;
+ dev->chain_device = created_device;
} else {
// Couldn't find CreateDevice function!
return VK_ERROR_INITIALIZATION_FAILED;
}
- /* Initialize device dispatch table */
+ // Initialize device dispatch table
loader_init_device_dispatch_table(&dev->loader_dispatch, nextGDPA,
- dev->device);
+ dev->chain_device);
return res;
}
@@ -4332,6 +4327,8 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDevice(
PFN_vkCreateDevice fpCreateDevice = icd_term->CreateDevice;
struct loader_extension_list icd_exts;
+ dev->phys_dev_term = phys_dev_term;
+
icd_exts.list = NULL;
if (fpCreateDevice == NULL) {
@@ -4398,7 +4395,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDevice(
}
res = fpCreateDevice(phys_dev_term->phys_dev, &localCreateInfo, pAllocator,
- &dev->device);
+ &dev->icd_device);
if (res != VK_SUCCESS) {
loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
"vkCreateDevice call failed in ICD %s",
@@ -4406,7 +4403,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDevice(
goto out;
}
- *pDevice = dev->device;
+ *pDevice = dev->icd_device;
loader_add_logical_device(icd_term->this_instance, icd_term, dev);
/* Init dispatch pointer in new device object */