Move the code generation mutex to Reactor. Generation of the routines for copying surfaces and blitting were not protected by the same critical section as the renderer. Change-Id: I10eb386bdeebb04abc999b3313dc2c3b52adc090 Reviewed-on: https://swiftshader-review.googlesource.com/2772 Tested-by: Greg Hartman <ghartman@google.com> Reviewed-by: Greg Hartman <ghartman@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp index 4a819cb..49ec859 100644 --- a/src/Reactor/Nucleus.cpp +++ b/src/Reactor/Nucleus.cpp
@@ -66,6 +66,7 @@ LLVMContext *Nucleus::context = 0; Module *Nucleus::module = 0; llvm::Function *Nucleus::function = 0; + BackoffLock Nucleus::codegenMutex; class Builder : public IRBuilder<> { @@ -73,6 +74,8 @@ Nucleus::Nucleus() { + codegenMutex.lock(); // Reactor and LLVM are currently not thread safe + InitializeNativeTarget(); JITEmitDebugInfo = false; @@ -129,6 +132,8 @@ routineManager = 0; function = 0; module = 0; + + codegenMutex.unlock(); } Routine *Nucleus::acquireRoutine(const wchar_t *name, bool runOptimizations)
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp index 86e2304..59d43e0 100644 --- a/src/Reactor/Nucleus.hpp +++ b/src/Reactor/Nucleus.hpp
@@ -13,6 +13,7 @@ #define sw_Nucleus_hpp #include "Common/Types.hpp" +#include "Common/MutexLock.hpp" #include <stdarg.h> #include <vector> @@ -218,6 +219,8 @@ static llvm::LLVMContext *context; static llvm::Module *module; static RoutineManager *routineManager; + + static BackoffLock codegenMutex; }; class Byte;
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index 3fd13bb..06236b3 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -69,8 +69,6 @@ TranscendentalPrecision rsqPrecision = ACCURATE; bool perspectiveCorrection = true; - BackoffLock Renderer::codegenMutex; - struct Parameters { Renderer *renderer; @@ -232,13 +230,9 @@ setupState = SetupProcessor::update(); pixelState = PixelProcessor::update(); - codegenMutex.lock(); - vertexRoutine = VertexProcessor::routine(vertexState); setupRoutine = SetupProcessor::routine(setupState); pixelRoutine = PixelProcessor::routine(pixelState); - - codegenMutex.unlock(); } int batch = batchSize / ms;
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index 6fbbfa9..0631acd 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -404,7 +404,6 @@ unsigned int qSize; BackoffLock schedulerMutex; - static BackoffLock codegenMutex; #if PERF_HUD int64_t vertexTime[16];