TextureMapperPlatformLayerProxy.h [plain text]
#pragma once
#if USE(COORDINATED_GRAPHICS)
#include "TextureMapperGLHeaders.h"
#include <wtf/Condition.h>
#include <wtf/Function.h>
#include <wtf/Lock.h>
#include <wtf/RunLoop.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Vector.h>
#ifndef NDEBUG
#include <wtf/Threading.h>
#endif
namespace WebCore {
class IntSize;
class TextureMapperGL;
class TextureMapperLayer;
class TextureMapperPlatformLayerBuffer;
class TextureMapperPlatformLayerProxy : public ThreadSafeRefCounted<TextureMapperPlatformLayerProxy> {
WTF_MAKE_FAST_ALLOCATED();
public:
class Compositor {
public:
virtual void onNewBufferAvailable() = 0;
};
TextureMapperPlatformLayerProxy();
virtual ~TextureMapperPlatformLayerProxy();
Lock& lock() { return m_lock; }
std::unique_ptr<TextureMapperPlatformLayerBuffer> getAvailableBuffer(const IntSize&, GLint internalFormat);
void pushNextBuffer(std::unique_ptr<TextureMapperPlatformLayerBuffer>);
bool isActive();
WEBCORE_EXPORT void activateOnCompositingThread(Compositor*, TextureMapperLayer*);
WEBCORE_EXPORT void invalidate();
WEBCORE_EXPORT void swapBuffer();
void dropCurrentBufferWhilePreservingTexture(bool shouldWait = false);
bool scheduleUpdateOnCompositorThread(Function<void()>&&);
private:
void appendToUnusedBuffers(std::unique_ptr<TextureMapperPlatformLayerBuffer>);
void scheduleReleaseUnusedBuffers();
void releaseUnusedBuffersTimerFired();
Compositor* m_compositor;
TextureMapperLayer* m_targetLayer;
std::unique_ptr<TextureMapperPlatformLayerBuffer> m_currentBuffer;
std::unique_ptr<TextureMapperPlatformLayerBuffer> m_pendingBuffer;
Lock m_lock;
Lock m_wasBufferDroppedLock;
Condition m_wasBufferDroppedCondition;
bool m_wasBufferDropped { false };
Vector<std::unique_ptr<TextureMapperPlatformLayerBuffer>> m_usedBuffers;
std::unique_ptr<RunLoop::Timer<TextureMapperPlatformLayerProxy>> m_releaseUnusedBuffersTimer;
#ifndef NDEBUG
RefPtr<Thread> m_compositorThread;
#endif
void compositorThreadUpdateTimerFired();
std::unique_ptr<RunLoop::Timer<TextureMapperPlatformLayerProxy>> m_compositorThreadUpdateTimer;
Function<void()> m_compositorThreadUpdateFunction;
};
}
#endif // USE(COORDINATED_GRAPHICS)