diff options
| author | Jon Ashburn <jon@lunarg.com> | 2014-11-14 09:52:42 -0700 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2014-11-21 16:49:40 -0700 |
| commit | 994fc4727631edecf4b31ffd4f358fc34bff88a3 (patch) | |
| tree | 9a11e4ef1e4a91dfaec6728dfeeea139e7393b3f | |
| parent | 3cd8c9be25fa3103b1bd321a89fd4ab5d5e49f4a (diff) | |
| download | usermoji-994fc4727631edecf4b31ffd4f358fc34bff88a3.tar.xz | |
Make the Dbg xgl global calls use dispatch table for layer support
xglDbgRegisterMsgCallbacks, xglDbgUnregisterMsgCallbacks,
xglDbgSetGlobalOptions dispatched via dispatch table so layers can
intercept these calls. Also add support for these calls being dispatched
to different icd functions based on gpu for icd's which may want different
functions per gpu.
| -rw-r--r-- | icd/common/icd.c | 6 | ||||
| -rw-r--r-- | icd/common/icd.h | 4 | ||||
| -rw-r--r-- | loader/loader.c | 87 |
3 files changed, 52 insertions, 45 deletions
diff --git a/icd/common/icd.c b/icd/common/icd.c index 9d0abd91..90487f32 100644 --- a/icd/common/icd.c +++ b/icd/common/icd.c @@ -153,7 +153,7 @@ void icd_clear_msg_callbacks(void) icd.msg_callbacks = NULL; } -ICD_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData) +XGL_RESULT XGLAPI icdDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData) { struct icd_msg_callback *cb; @@ -170,7 +170,7 @@ ICD_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNC return XGL_SUCCESS; } -ICD_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback) +XGL_RESULT XGLAPI icdDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback) { struct icd_msg_callback *cb = icd.msg_callbacks; @@ -195,7 +195,7 @@ ICD_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FU return XGL_SUCCESS; } -ICD_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData) +XGL_RESULT XGLAPI icdDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData) { XGL_RESULT res = XGL_SUCCESS; diff --git a/icd/common/icd.h b/icd/common/icd.h index 3afe9a10..cc9c6acd 100644 --- a/icd/common/icd.h +++ b/icd/common/icd.h @@ -44,6 +44,10 @@ # define ICD_EXPORT #endif +XGL_RESULT XGLAPI icdDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData); +XGL_RESULT XGLAPI icdDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback); +XGL_RESULT XGLAPI icdDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData); + void icd_msg(XGL_DBG_MSG_TYPE msg_type, XGL_VALIDATION_LEVEL validation_level, XGL_BASE_OBJECT src_object, diff --git a/loader/loader.c b/loader/loader.c index 3f8efdb0..5ee32b0a 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -23,6 +23,7 @@ * * Authors: * Chia-I Wu <olv@lunarg.com> + * Jon Ashburn <jon@lunarg.com> * Courtney Goeltzenleuchter <courtney@lunarg.com> */ #define _GNU_SOURCE @@ -59,9 +60,6 @@ struct loader_icd { GetProcAddrType GetProcAddr; InitAndEnumerateGpusType InitAndEnumerateGpus; - DbgRegisterMsgCallbackType DbgRegisterMsgCallback; - DbgUnregisterMsgCallbackType DbgUnregisterMsgCallback; - DbgSetGlobalOptionType DbgSetGlobalOption; SetDispatchType SetDispatch; struct loader_icd *next; @@ -223,9 +221,6 @@ loader_icd_create(const char *filename) } while (0) LOOKUP(icd, GetProcAddr); LOOKUP(icd, InitAndEnumerateGpus); - LOOKUP(icd, DbgRegisterMsgCallback); - LOOKUP(icd, DbgUnregisterMsgCallback); - LOOKUP(icd, DbgSetGlobalOption); LOOKUP(icd, SetDispatch); #undef LOOKUP @@ -238,11 +233,12 @@ static XGL_RESULT loader_icd_register_msg_callbacks(const struct loader_icd *icd XGL_RESULT res; while (cb) { - res = icd->DbgRegisterMsgCallback(cb->func, cb->data); - if (res != XGL_SUCCESS) { - break; + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { + res = (icd->loader_dispatch + i)->DbgRegisterMsgCallback(cb->func, cb->data); + if (res != XGL_SUCCESS) { + break; + } } - cb = cb->next; } @@ -251,7 +247,9 @@ static XGL_RESULT loader_icd_register_msg_callbacks(const struct loader_icd *icd const struct loader_msg_callback *tmp = loader.msg_callbacks; while (tmp != cb) { - icd->DbgUnregisterMsgCallback(cb->func); + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { + (icd->loader_dispatch + i)->DbgUnregisterMsgCallback(cb->func); + } tmp = tmp->next; } @@ -265,10 +263,12 @@ static XGL_RESULT loader_icd_set_global_options(const struct loader_icd *icd) { #define SETB(icd, opt, val) do { \ if (val) { \ - const XGL_RESULT res = \ - icd->DbgSetGlobalOption(opt, sizeof(val), &val); \ - if (res != XGL_SUCCESS) \ - return res; \ + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { \ + const XGL_RESULT res = \ + (icd->loader_dispatch + i)->DbgSetGlobalOption(opt, sizeof(val), &val); \ + if (res != XGL_SUCCESS) \ + return res; \ + } \ } \ } while (0) SETB(icd, XGL_DBG_OPTION_DEBUG_ECHO_ENABLE, loader.debug_echo_enable); @@ -1164,30 +1164,35 @@ LOADER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZ LOADER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData) { - const struct loader_icd *icd = loader.icds; + const struct loader_icd *icd; XGL_RESULT res; + XGL_UINT gpu_idx; if (!loader.scanned) { return loader_msg_callback_add(pfnMsgCallback, pUserData); } - while (icd) { - res = icd->DbgRegisterMsgCallback(pfnMsgCallback, pUserData); - if (res != XGL_SUCCESS) { - break; + for (icd = loader.icds; icd; icd = icd->next) { + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { + res = (icd->loader_dispatch + i)->DbgRegisterMsgCallback(pfnMsgCallback, pUserData); + if (res != XGL_SUCCESS) { + gpu_idx = i; + break; + } } - - icd = icd->next; + if (res != XGL_SUCCESS) + break; } /* roll back on errors */ if (icd) { - const struct loader_icd *tmp = loader.icds; - - while (tmp != icd) { - tmp->DbgUnregisterMsgCallback(pfnMsgCallback); - tmp = tmp->next; + for (const struct loader_icd * tmp = loader.icds; tmp != icd; tmp = tmp->next) { + for (XGL_UINT i = 0; i < icd->gpu_count; i++) + (tmp->loader_dispatch + i)->DbgUnregisterMsgCallback(pfnMsgCallback); } + /* and gpus on current icd */ + for (XGL_UINT i = 0; i < gpu_idx; i++) + (icd->loader_dispatch + i)->DbgUnregisterMsgCallback(pfnMsgCallback); return res; } @@ -1197,27 +1202,25 @@ LOADER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_F LOADER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback) { - const struct loader_icd *icd = loader.icds; XGL_RESULT res = XGL_SUCCESS; if (!loader.scanned) { return loader_msg_callback_remove(pfnMsgCallback); } - while (icd) { - XGL_RESULT r = icd->DbgUnregisterMsgCallback(pfnMsgCallback); - if (r != XGL_SUCCESS) { - res = r; + for (const struct loader_icd * icd = loader.icds; icd; icd = icd->next) { + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { + XGL_RESULT r = (icd->loader_dispatch + i)->DbgUnregisterMsgCallback(pfnMsgCallback); + if (r != XGL_SUCCESS) { + res = r; + } } - icd = icd->next; } - return res; } LOADER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData) { - const struct loader_icd *icd = loader.icds; XGL_RESULT res = XGL_SUCCESS; if (!loader.scanned) { @@ -1242,14 +1245,14 @@ LOADER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgO return res; } - while (icd) { - XGL_RESULT r = icd->DbgSetGlobalOption(dbgOption, dataSize, pData); - /* unfortunately we cannot roll back */ - if (r != XGL_SUCCESS) { - res = r; + for (const struct loader_icd * icd = loader.icds; icd; icd = icd->next) { + for (XGL_UINT i = 0; i < icd->gpu_count; i++) { + XGL_RESULT r = (icd->loader_dispatch + i)->DbgSetGlobalOption(dbgOption, dataSize, pData); + /* unfortunately we cannot roll back */ + if (r != XGL_SUCCESS) { + res = r; + } } - - icd = icd->next; } return res; |
