diff --git a/libraries/render-utils/src/FramebufferCache.cpp b/libraries/render-utils/src/FramebufferCache.cpp index 5375de273a..4ada0ce980 100644 --- a/libraries/render-utils/src/FramebufferCache.cpp +++ b/libraries/render-utils/src/FramebufferCache.cpp @@ -11,34 +11,25 @@ #include "FramebufferCache.h" -#include - #include +#include +#include -#include -#include -#include #include "RenderUtilsLogging.h" -static QQueue _cachedFramebuffers; - -FramebufferCache::FramebufferCache() { -} - -FramebufferCache::~FramebufferCache() { - _cachedFramebuffers.clear(); -} - void FramebufferCache::setFrameBufferSize(QSize frameBufferSize) { //If the size changed, we need to delete our FBOs if (_frameBufferSize != frameBufferSize) { _frameBufferSize = frameBufferSize; _selfieFramebuffer.reset(); - _cachedFramebuffers.clear(); _occlusionFramebuffer.reset(); _occlusionTexture.reset(); _occlusionBlurredFramebuffer.reset(); _occlusionBlurredTexture.reset(); + { + std::unique_lock lock(_mutex); + _cachedFramebuffers.clear(); + } } } @@ -55,8 +46,6 @@ void FramebufferCache::createPrimaryFramebuffer() { auto smoothSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR); - - resizeAmbientOcclusionBuffers(); } @@ -87,7 +76,8 @@ void FramebufferCache::resizeAmbientOcclusionBuffers() { gpu::FramebufferPointer FramebufferCache::getFramebuffer() { - if (_cachedFramebuffers.isEmpty()) { + std::unique_lock lock(_mutex); + if (_cachedFramebuffers.empty()) { _cachedFramebuffers.push_back(gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_SRGBA_32, _frameBufferSize.width(), _frameBufferSize.height()))); } gpu::FramebufferPointer result = _cachedFramebuffers.front(); @@ -96,6 +86,7 @@ gpu::FramebufferPointer FramebufferCache::getFramebuffer() { } void FramebufferCache::releaseFramebuffer(const gpu::FramebufferPointer& framebuffer) { + std::unique_lock lock(_mutex); if (QSize(framebuffer->getSize().x, framebuffer->getSize().y) == _frameBufferSize) { _cachedFramebuffers.push_back(framebuffer); } diff --git a/libraries/render-utils/src/FramebufferCache.h b/libraries/render-utils/src/FramebufferCache.h index d3d26c35b0..10ec664669 100644 --- a/libraries/render-utils/src/FramebufferCache.h +++ b/libraries/render-utils/src/FramebufferCache.h @@ -11,13 +11,10 @@ #include -#include +#include +#include #include -namespace gpu { -class Batch; -} - /// Stores cached textures, including render-to-texture targets. class FramebufferCache : public Dependency { SINGLETON_DEPENDENCY @@ -47,9 +44,6 @@ public: void releaseFramebuffer(const gpu::FramebufferPointer& framebuffer); private: - FramebufferCache(); - virtual ~FramebufferCache(); - void createPrimaryFramebuffer(); gpu::FramebufferPointer _shadowFramebuffer; @@ -65,6 +59,9 @@ private: QSize _frameBufferSize{ 100, 100 }; int _AOResolutionLevel = 1; // AO perform at half res + std::mutex _mutex; + std::list _cachedFramebuffers; + // Resize/reallocate the buffers used for AO // the size of the AO buffers is scaled by the AOResolutionScale; void resizeAmbientOcclusionBuffers();