mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Add a new CefBrowserHost::SetWindowlessFrameRate method to support
dynamic configuration of the windowless frame rate (issue #1629).
This commit is contained in:
@@ -1267,6 +1267,40 @@ void CefBrowserHostImpl::NotifyMoveOrResizeStarted() {
|
||||
PlatformNotifyMoveOrResizeStarted();
|
||||
}
|
||||
|
||||
int CefBrowserHostImpl::GetWindowlessFrameRate() {
|
||||
// Verify that this method is being called on the UI thread.
|
||||
if (!CEF_CURRENTLY_ON_UIT()) {
|
||||
NOTREACHED() << "called on invalid thread";
|
||||
return 0;
|
||||
}
|
||||
|
||||
return CefRenderWidgetHostViewOSR::ClampFrameRate(
|
||||
settings_.windowless_frame_rate);
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::SetWindowlessFrameRate(int frame_rate) {
|
||||
if (!CEF_CURRENTLY_ON_UIT()) {
|
||||
CEF_POST_TASK(CEF_UIT,
|
||||
base::Bind(&CefBrowserHostImpl::SetWindowlessFrameRate, this,
|
||||
frame_rate));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsWindowless())
|
||||
return;
|
||||
|
||||
settings_.windowless_frame_rate = frame_rate;
|
||||
|
||||
if (!web_contents())
|
||||
return;
|
||||
|
||||
CefRenderWidgetHostViewOSR* view =
|
||||
static_cast<CefRenderWidgetHostViewOSR*>(
|
||||
web_contents()->GetRenderViewHost()->GetView());
|
||||
if (view)
|
||||
view->UpdateFrameRate();
|
||||
}
|
||||
|
||||
// CefBrowser methods.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
|
@@ -192,6 +192,8 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
||||
void SendFocusEvent(bool setFocus) override;
|
||||
void SendCaptureLostEvent() override;
|
||||
void NotifyMoveOrResizeStarted() override;
|
||||
int GetWindowlessFrameRate() override;
|
||||
void SetWindowlessFrameRate(int frame_rate) override;
|
||||
CefTextInputContext GetNSTextInputContext() override;
|
||||
void HandleKeyEventBeforeTextInputClient(CefEventHandle keyEvent) override;
|
||||
void HandleKeyEventAfterTextInputClient(CefEventHandle keyEvent) override;
|
||||
|
@@ -172,6 +172,10 @@ class CefCopyFrameGenerator {
|
||||
|
||||
bool frame_pending() const { return frame_pending_; }
|
||||
|
||||
void set_frame_rate_threshold_ms(int frame_rate_threshold_ms) {
|
||||
frame_rate_threshold_ms_ = frame_rate_threshold_ms;
|
||||
}
|
||||
|
||||
private:
|
||||
void InternalGenerateCopyFrame() {
|
||||
frame_pending_ = false;
|
||||
@@ -375,7 +379,7 @@ class CefCopyFrameGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
const int frame_rate_threshold_ms_;
|
||||
int frame_rate_threshold_ms_;
|
||||
CefRenderWidgetHostViewOSR* view_;
|
||||
|
||||
base::TimeTicks frame_start_time_;
|
||||
@@ -411,6 +415,12 @@ class CefBeginFrameTimer : public cc::TimeSourceClient {
|
||||
return time_source_->Active();
|
||||
}
|
||||
|
||||
void SetFrameRateThresholdMs(int frame_rate_threshold_ms) {
|
||||
time_source_->SetTimebaseAndInterval(
|
||||
time_source_->Now(),
|
||||
base::TimeDelta::FromMilliseconds(frame_rate_threshold_ms));
|
||||
}
|
||||
|
||||
private:
|
||||
// cc::TimerSourceClient implementation.
|
||||
void OnTimerTick() override {
|
||||
@@ -1182,6 +1192,11 @@ void CefRenderWidgetHostViewOSR::SendFocusEvent(bool focus) {
|
||||
}
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::UpdateFrameRate() {
|
||||
frame_rate_threshold_ms_ = 0;
|
||||
SetFrameRate();
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::HoldResize() {
|
||||
if (!hold_resize_)
|
||||
hold_resize_ = true;
|
||||
@@ -1233,6 +1248,15 @@ void CefRenderWidgetHostViewOSR::OnPaint(
|
||||
ReleaseResize();
|
||||
}
|
||||
|
||||
// static
|
||||
int CefRenderWidgetHostViewOSR::ClampFrameRate(int frame_rate) {
|
||||
if (frame_rate < 1)
|
||||
return kDefaultFrameRate;
|
||||
else if (frame_rate > kMaximumFrameRate)
|
||||
return kMaximumFrameRate;
|
||||
return frame_rate;
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::SetFrameRate() {
|
||||
DCHECK(browser_impl_.get());
|
||||
if (!browser_impl_.get())
|
||||
@@ -1242,24 +1266,29 @@ void CefRenderWidgetHostViewOSR::SetFrameRate() {
|
||||
if (frame_rate_threshold_ms_ != 0)
|
||||
return;
|
||||
|
||||
int frame_rate = browser_impl_->settings().windowless_frame_rate;
|
||||
if (frame_rate < 1)
|
||||
frame_rate = kDefaultFrameRate;
|
||||
else if (frame_rate > kMaximumFrameRate)
|
||||
frame_rate = kMaximumFrameRate;
|
||||
const int frame_rate =
|
||||
ClampFrameRate(browser_impl_->settings().windowless_frame_rate);
|
||||
frame_rate_threshold_ms_ = 1000 / frame_rate;
|
||||
|
||||
// Configure the VSync interval for the browser process.
|
||||
compositor_->vsync_manager()->SetAuthoritativeVSyncInterval(
|
||||
base::TimeDelta::FromMilliseconds(frame_rate_threshold_ms_));
|
||||
|
||||
if (copy_frame_generator_.get()) {
|
||||
copy_frame_generator_->set_frame_rate_threshold_ms(
|
||||
frame_rate_threshold_ms_);
|
||||
}
|
||||
|
||||
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
||||
if (command_line->HasSwitch(switches::kEnableBeginFrameScheduling)) {
|
||||
DCHECK(!begin_frame_timer_.get());
|
||||
begin_frame_timer_.reset(new CefBeginFrameTimer(
|
||||
frame_rate_threshold_ms_,
|
||||
base::Bind(&CefRenderWidgetHostViewOSR::OnBeginFrameTimerTick,
|
||||
weak_ptr_factory_.GetWeakPtr())));
|
||||
if (begin_frame_timer_.get()) {
|
||||
begin_frame_timer_->SetFrameRateThresholdMs(frame_rate_threshold_ms_);
|
||||
} else {
|
||||
begin_frame_timer_.reset(new CefBeginFrameTimer(
|
||||
frame_rate_threshold_ms_,
|
||||
base::Bind(&CefRenderWidgetHostViewOSR::OnBeginFrameTimerTick,
|
||||
weak_ptr_factory_.GetWeakPtr())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -234,6 +234,7 @@ class CefRenderWidgetHostViewOSR
|
||||
void SendMouseEvent(const blink::WebMouseEvent& event);
|
||||
void SendMouseWheelEvent(const blink::WebMouseWheelEvent& event);
|
||||
void SendFocusEvent(bool focus);
|
||||
void UpdateFrameRate();
|
||||
|
||||
void HoldResize();
|
||||
void ReleaseResize();
|
||||
@@ -269,6 +270,8 @@ class CefRenderWidgetHostViewOSR
|
||||
content::RenderWidgetHostImpl* render_widget_host() const
|
||||
{ return render_widget_host_; }
|
||||
|
||||
static int ClampFrameRate(int frame_rate);
|
||||
|
||||
private:
|
||||
void SetFrameRate();
|
||||
void SetDeviceScaleFactor();
|
||||
|
Reference in New Issue
Block a user