Defer worker thread creation until the first draw call. crbug.com/336438
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index 030ab6b..41a3cbb 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -183,8 +183,6 @@ delete drawCall[draw]; } - deleteBatches(); - delete swiftConfig; } @@ -1831,14 +1829,10 @@ Clipper::CLIP_FINITE; // FIXME: xyz finite } - void Renderer::initializeThreads(int threads) + void Renderer::initializeThreads() { - terminateThreads(); - deleteBatches(); - - threadCount = threads; - unitCount = ceilPow2(threads); - clusterCount = ceilPow2(threads); + unitCount = ceilPow2(threadCount); + clusterCount = ceilPow2(threadCount); for(int i = 0; i < unitCount; i++) { @@ -1894,10 +1888,7 @@ deallocate(vertexTask[thread]); vertexTask[thread] = 0; } - } - void Renderer::deleteBatches() - { for(int i = 0; i < 16; i++) { deallocate(triangleBatch[i]); @@ -2440,17 +2431,17 @@ switch(configuration.textureSampleQuality) { - case 0: Sampler::setFilterQuality(FILTER_POINT); break; - case 1: Sampler::setFilterQuality(FILTER_LINEAR); break; - case 2: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; - default: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; + case 0: Sampler::setFilterQuality(FILTER_POINT); break; + case 1: Sampler::setFilterQuality(FILTER_LINEAR); break; + case 2: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; + default: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; } switch(configuration.mipmapQuality) { case 0: Sampler::setMipmapQuality(MIPMAP_POINT); break; case 1: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; - default: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; + default: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; } setPerspectiveCorrection(configuration.perspectiveCorrection); @@ -2497,16 +2488,16 @@ switch(configuration.transparencyAntialiasing) { - case 0: transparencyAntialiasing = Context::TRANSPARENCY_NONE; break; - case 1: transparencyAntialiasing = Context::TRANSPARENCY_ALPHA_TO_COVERAGE; break; - default: transparencyAntialiasing = Context::TRANSPARENCY_NONE; break; + case 0: transparencyAntialiasing = Context::TRANSPARENCY_NONE; break; + case 1: transparencyAntialiasing = Context::TRANSPARENCY_ALPHA_TO_COVERAGE; break; + default: transparencyAntialiasing = Context::TRANSPARENCY_NONE; break; } switch(configuration.threadCount) { - case -1: initializeThreads(CPUID::coreCount()); break; - case 0: initializeThreads(CPUID::processAffinity()); break; - default: initializeThreads(configuration.threadCount); break; + case -1: threadCount = CPUID::coreCount(); break; + case 0: threadCount = CPUID::processAffinity(); break; + default: threadCount = configuration.threadCount; break; } CPUID::setEnableSSE4_1(configuration.enableSSE4_1); @@ -2531,5 +2522,10 @@ maxPrimitives = configuration.maxPrimitives; #endif } + + if(!initialUpdate && !worker[0]) + { + initializeThreads(); + } } }
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index b0e76a3..3756a47 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -359,9 +359,8 @@ void updateClipper(); void updateConfiguration(bool initialUpdate = false); static unsigned int computeClipFlags(const float4 &v, const DrawData &data); - void initializeThreads(int threadCount); + void initializeThreads(); void terminateThreads(); - void deleteBatches(); void loadConstants(const VertexShader *vertexShader); void loadConstants(const PixelShader *pixelShader);