Create a global and thread-safe Blitter.
Bug 21716622
Change-Id: I090154cdfbb6f8781df578b3f493d3ecd297c847
Reviewed-on: https://swiftshader-review.googlesource.com/3437
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp
index aaf1c89..f3b9ab6 100644
--- a/src/Renderer/Blitter.cpp
+++ b/src/Renderer/Blitter.cpp
@@ -16,6 +16,8 @@
namespace sw
{
+ Blitter blitter;
+
Blitter::Blitter()
{
blitCache = new RoutineCache<BlitState>(1024);
@@ -400,6 +402,7 @@
state.destFormat = dest->getInternalFormat();
state.filter = filter;
+ criticalSection.lock();
Routine *blitRoutine = blitCache->query(state);
if(!blitRoutine)
@@ -408,12 +411,15 @@
if(!blitRoutine)
{
+ criticalSection.unlock();
return false;
}
blitCache->add(state, blitRoutine);
}
+ criticalSection.unlock();
+
void (*blitFunction)(const BlitData *data) = (void(*)(const BlitData*))blitRoutine->getEntry();
BlitData data;
diff --git a/src/Renderer/Blitter.hpp b/src/Renderer/Blitter.hpp
index 6c20ecb..ca7ec66 100644
--- a/src/Renderer/Blitter.hpp
+++ b/src/Renderer/Blitter.hpp
@@ -69,7 +69,10 @@
Routine *generate(BlitState &state);
RoutineCache<BlitState> *blitCache;
+ BackoffLock criticalSection;
};
+
+ extern Blitter blitter;
}
#endif // sw_Blitter_hpp
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp
index 5b64563..894b4e0 100644
--- a/src/Renderer/Renderer.hpp
+++ b/src/Renderer/Renderer.hpp
@@ -442,8 +442,6 @@
VertexProcessor::State vertexState;
SetupProcessor::State setupState;
PixelProcessor::State pixelState;
-
- Blitter blitter;
};
}