Make Blitter part of Renderer. This fixes two issues. We had a global 'blitter' instance which doesn't get destroyed until the library us unloaded. This is reported as a memory leak (albeit benign). Potentially worse is that the singleton was shared between all threads, and the Routine cache isn't thread safe. Bug chromium:732691 Change-Id: I7b90d7d2bc67b4a9f78cdf4f54a76fa2f798b7cc Reviewed-on: https://swiftshader-review.googlesource.com/10128 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index a8f6032..a84423d 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -114,6 +114,7 @@ setRenderTarget(0, 0); clipper = new Clipper(symmetricNormalizedDepth); + blitter = new Blitter; updateViewMatrix = true; updateBaseMatrix = true; @@ -177,7 +178,10 @@ sync->destruct(); delete clipper; - clipper = 0; + clipper = nullptr; + + delete blitter; + blitter = nullptr; terminateThreads(); delete resumeApp; @@ -202,21 +206,6 @@ sw::deallocate(mem); } - void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask) - { - blitter.clear(pixel, format, dest, dRect, rgbaMask); - } - - void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil) - { - blitter.blit(source, sRect, dest, dRect, filter, isStencil); - } - - void Renderer::blit3D(Surface *source, Surface *dest) - { - blitter.blit3D(source, dest); - } - void Renderer::draw(DrawType drawType, unsigned int indexOffset, unsigned int count, bool update) { #ifndef NDEBUG @@ -681,6 +670,21 @@ } } + void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask) + { + blitter->clear(pixel, format, dest, dRect, rgbaMask); + } + + void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil) + { + blitter->blit(source, sRect, dest, dRect, filter, isStencil); + } + + void Renderer::blit3D(Surface *source, Surface *dest) + { + blitter->blit3D(source, dest); + } + void Renderer::threadFunction(void *parameters) { Renderer *renderer = static_cast<Parameters*>(parameters)->renderer;