blob: ce33e8f4829f2a76a8bb456237bf9f0171a14d20 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_SHARED_CONTEXT_RATE_LIMITER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_SHARED_CONTEXT_RATE_LIMITER_H_
#include <memory>
#include "gpu/command_buffer/client/raster_interface.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/deque.h"
namespace blink {
class WebGraphicsContext3DProvider;
// Purpose: to limit the amount of worked queued for execution
// (backlog) on the GPU by blocking the main thread to allow the GPU
// to catch up. The Prevents unsynchronized tight animation loops
// from cause a GPU denial of service.
//
// How it works: The rate limiter uses GPU fences to mark each tick
// and makes sure there are never more that 'maxPendingTicks' fences
// that are awaiting completion. On platforms that do not support
// fences, we use glFinish instead. glFinish will only be called in
// unsynchronized cases that submit more than maxPendingTicks animation
// tick per compositor frame, which should be quite rare.
//
// How to use it: Each unit of work that constitutes a complete animation
// frame must call tick(). reset() must be called when the animation
// is consumed by committing to the compositor. Several rate limiters can
// be used concurrently: they will each use their own sequences of
// fences which may be interleaved. When the graphics context is lost
// and later restored, the existing rate limiter must be destroyed and
// a new one created.
class SharedContextRateLimiter final {
USING_FAST_MALLOC(SharedContextRateLimiter);
public:
explicit SharedContextRateLimiter(unsigned max_pending_ticks);
SharedContextRateLimiter(const SharedContextRateLimiter&) = delete;
SharedContextRateLimiter& operator=(const SharedContextRateLimiter&) = delete;
void Tick();
void Reset();
private:
std::unique_ptr<WebGraphicsContext3DProvider> context_provider_;
Deque<GLuint> queries_;
unsigned max_pending_ticks_;
bool can_use_sync_queries_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_SHARED_CONTEXT_RATE_LIMITER_H_