TSAN fix
leadingVertexFirst is used within rendering threads and assigned in
the Renderer's constructor, so TSAN detects this as a data race. In
order to fix this, we can make sure any of these global rendering
settings are only set once (since they never change).
Change-Id: Ib4b43d181b140e500ca31e1ce48340c7f4ce500d
Reviewed-on: https://swiftshader-review.googlesource.com/20008
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index b560f41..e7ec20a 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -72,6 +72,24 @@
TranscendentalPrecision rsqPrecision = ACCURATE;
bool perspectiveCorrection = true;
+ static void setGlobalRenderingSettings(Conventions conventions, bool exactColorRounding)
+ {
+ static bool initialized = false;
+
+ if(!initialized)
+ {
+ sw::halfIntegerCoordinates = conventions.halfIntegerCoordinates;
+ sw::symmetricNormalizedDepth = conventions.symmetricNormalizedDepth;
+ sw::booleanFaceRegister = conventions.booleanFaceRegister;
+ sw::fullPixelPositionRegister = conventions.fullPixelPositionRegister;
+ sw::leadingVertexFirst = conventions.leadingVertexFirst;
+ sw::secondaryColor = conventions.secondaryColor;
+ sw::colorsDefaultToZero = conventions.colorsDefaultToZero;
+ sw::exactColorRounding = exactColorRounding;
+ initialized = true;
+ }
+ }
+
struct Parameters
{
Renderer *renderer;
@@ -105,14 +123,7 @@
Renderer::Renderer(Context *context, Conventions conventions, bool exactColorRounding) : VertexProcessor(context), PixelProcessor(context), SetupProcessor(context), context(context), viewport()
{
- sw::halfIntegerCoordinates = conventions.halfIntegerCoordinates;
- sw::symmetricNormalizedDepth = conventions.symmetricNormalizedDepth;
- sw::booleanFaceRegister = conventions.booleanFaceRegister;
- sw::fullPixelPositionRegister = conventions.fullPixelPositionRegister;
- sw::leadingVertexFirst = conventions.leadingVertexFirst;
- sw::secondaryColor = conventions.secondaryColor;
- sw::colorsDefaultToZero = conventions.colorsDefaultToZero;
- sw::exactColorRounding = exactColorRounding;
+ setGlobalRenderingSettings(conventions, exactColorRounding);
setRenderTarget(0, 0);
clipper = new Clipper(symmetricNormalizedDepth);