#include "deThread.h"
#include "deThreadLocal.h"
+#include "deMutex.h"
namespace glslang
{
return deThreadLocal_get((deThreadLocal)nIndex);
}
-// Global lock - not used
+// Global lock
+
+static deMutex s_globalLock = 0;
void InitGlobalLock (void)
{
+ DE_ASSERT(s_globalLock == 0);
+ s_globalLock = deMutex_create(DE_NULL);
}
void GetGlobalLock (void)
{
+ deMutex_lock(s_globalLock);
}
void ReleaseGlobalLock (void)
{
+ deMutex_unlock(s_globalLock);
}
// Threading
#include "vkGlslToSpirV.hpp"
#include "deArrayUtil.hpp"
-#include "deMutex.hpp"
#include "deSingleton.h"
#include "deMemory.h"
#include "deClock.h"
}
static volatile deSingletonState s_glslangInitState = DE_SINGLETON_STATE_NOT_INITIALIZED;
-static de::Mutex s_glslangLock;
void initGlslang (void*)
{
{
if (!program.sources[shaderType].empty())
{
- const de::ScopedLock compileLock (s_glslangLock);
const std::string& srcText = program.sources[shaderType][0];
const char* srcPtrs[] = { srcText.c_str() };
const int srcLengths[] = { (int)srcText.size() };
de::PoolArray<Program> programs (&programPool);
{
- // \todo [2016-09-30 pyry] Use main executor when glslang no longer requires global lock
- TaskExecutor buildGlslExecutor (1);
de::MemPool tmpPool;
de::PoolArray<BuildGlslTask> buildGlslTasks (&tmpPool);
de::PoolArray<BuildSpirVAsmTask> buildSpirvAsmTasks (&tmpPool);
{
programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName())));
buildGlslTasks.pushBack(BuildGlslTask(progIter.getProgram(), &programs.back()));
- buildGlslExecutor.submit(&buildGlslTasks.back());
+ executor.submit(&buildGlslTasks.back());
}
for (vk::SpirVAsmCollection::Iterator progIter = sourcePrograms.spirvAsmSources.begin();
}
// Need to wait until tasks completed before freeing task memory
- buildGlslExecutor.waitForComplete();
executor.waitForComplete();
}