diff options
| author | Chris Forbes <chrisf@ijw.co.nz> | 2015-05-29 14:55:18 +1200 |
|---|---|---|
| committer | Chris Forbes <chrisf@ijw.co.nz> | 2015-06-04 10:15:33 +1200 |
| commit | e4b85ed633f6f79de7a09764f2d505a519a0a8f4 (patch) | |
| tree | 6c9248b193779a4c4e4316bba881f946a5fd871d /layers/shader_checker.cpp | |
| parent | 4a8f7bbd82ed7714a57fc43e27652dced042362e (diff) | |
| download | usermoji-e4b85ed633f6f79de7a09764f2d505a519a0a8f4.tar.xz | |
shader_checker: current object & locking
Fix some issues with cross-thread access to the shader map, etc.
Also introduce a 'current object' as a hack to be able to support
the debug callback, which currently needs a dispatch table while
only having a VkInstance.
Diffstat (limited to 'layers/shader_checker.cpp')
| -rw-r--r-- | layers/shader_checker.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp index 34a6b77e..40dad1b6 100644 --- a/layers/shader_checker.cpp +++ b/layers/shader_checker.cpp @@ -43,7 +43,11 @@ static std::unordered_map<void *, VkLayerDispatchTable *> tableMap; +static VkBaseLayerObject *pCurObj; static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce); +// TODO : This can be much smarter, using separate locks for separate global data +static int globalLockInitialized = 0; +static loader_platform_thread_mutex globalLock; static void @@ -145,6 +149,7 @@ static VkLayerDispatchTable * initLayerTable(const VkBaseLayerObject *gpuw) } layer_initialize_dispatch_table(pTable, gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject); + pCurObj = (VkBaseLayerObject *)gpuw->baseObject; return pTable; } @@ -158,6 +163,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDevi loader_platform_thread_once(&g_initOnce, initLayer); // create a mapping for the device object into the dispatch table tableMap.emplace(*pDevice, pTable); + pCurObj = (VkBaseLayerObject *) *pDevice; return result; } @@ -466,10 +472,12 @@ collect_interface_by_location(shader_source const *src, spv::StorageClass sinter VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo *pCreateInfo, VkShader *pShader) { + loader_platform_thread_lock_mutex(&globalLock); VkLayerDispatchTable* pTable = tableMap[(VkBaseLayerObject *)device]; VkResult res = pTable->CreateShader(device, pCreateInfo, pShader); shader_map[(VkBaseLayerObject *) *pShader] = new shader_source(pCreateInfo); + loader_platform_thread_unlock_mutex(&globalLock); return res; } @@ -761,6 +769,8 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, VkPipelineVertexInputCreateInfo const *vi = 0; char str[1024]; + loader_platform_thread_lock_mutex(&globalLock); + for (auto stage = pCreateInfo; stage; stage = (decltype(stage))stage->pNext) { if (stage->sType == VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) { auto shader_stage = (VkPipelineShaderStageCreateInfo const *)stage; @@ -802,6 +812,8 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, VkLayerDispatchTable *pTable = tableMap[(VkBaseLayerObject *)device]; VkResult res = pTable->CreateGraphicsPipeline(device, pCreateInfo, pPipeline); + + loader_platform_thread_unlock_mutex(&globalLock); return res; } @@ -823,7 +835,9 @@ VK_LAYER_EXPORT VkResult VKAPI vkDbgRegisterMsgCallback( if (g_actionIsDefault) { g_debugAction = VK_DBG_LAYER_ACTION_CALLBACK; } - VkResult result = nextTable.DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData); + // NOT CORRECT WITH MULTIPLE DEVICES OR INSTANCES, BUT THIS IS ALL GOING AWAY SOON ANYWAY + VkLayerDispatchTable *pTable = tableMap[pCurObj]; + VkResult result = pTable->DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData); return result; } @@ -852,7 +866,9 @@ VK_LAYER_EXPORT VkResult VKAPI vkDbgUnregisterMsgCallback( g_debugAction = (VK_LAYER_DBG_ACTION)(g_debugAction & ~((uint32_t)VK_DBG_LAYER_ACTION_CALLBACK)); } } - VkResult result = nextTable.DbgUnregisterMsgCallback(instance, pfnMsgCallback); + // NOT CORRECT WITH MULTIPLE DEVICES OR INSTANCES, BUT THIS IS ALL GOING AWAY SOON ANYWAY + VkLayerDispatchTable *pTable = tableMap[pCurObj]; + VkResult result = pTable->DbgUnregisterMsgCallback(instance, pfnMsgCallback); return result; } |
