Commit e51dbe82 authored by Daniele Castagna's avatar Daniele Castagna Committed by Commit Bot

exo: Add zcr_vsync_feedback_v1 to wayland clients

This patch adds zcr_vsync_feedback_v1 support to wayland clients.
It additionally adds a new CL flag "--log-vsync-timing-updates"
to wayland_simple_client that can be used to print on the std output
updates on vsync timing information.

Test:
  build wayland_simple_client,
  scp to dut and run
  'export XDG_RUNTIME_DIR=/var/run/chrome; ./wayland_simple_client --log-vsync-timing-updates'

Change-Id: Idcb13cf2e4cc9357cf454de6a8416da3b089eab4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1580469Reviewed-by: default avatarkylechar <kylechar@chromium.org>
Commit-Queue: kylechar <kylechar@chromium.org>
Commit-Queue: Daniele Castagna <dcastagna@chromium.org>
Auto-Submit: Daniele Castagna <dcastagna@chromium.org>
Cr-Commit-Position: refs/heads/master@{#654870}
parent baf15984
......@@ -251,6 +251,7 @@ source_set("client_support") {
"//third_party/wayland-protocols:linux_dmabuf_protocol",
"//third_party/wayland-protocols:linux_explicit_synchronization_protocol",
"//third_party/wayland-protocols:presentation_time_protocol",
"//third_party/wayland-protocols:vsync_feedback_protocol",
]
if (ozone_platform_gbm) {
......@@ -309,6 +310,7 @@ source_set("simple") {
"//third_party/wayland:wayland_client",
"//third_party/wayland-protocols:linux_dmabuf_protocol",
"//third_party/wayland-protocols:presentation_time_protocol",
"//third_party/wayland-protocols:vsync_feedback_protocol",
"//ui/gfx/geometry",
"//ui/gl",
]
......
......@@ -137,6 +137,9 @@ void RegistryHandler(void* data,
static_cast<zwp_linux_explicit_synchronization_v1*>(wl_registry_bind(
registry, id, &zwp_linux_explicit_synchronization_v1_interface,
1)));
} else if (strcmp(interface, "zcr_vsync_feedback_v1") == 0) {
globals->vsync_feedback.reset(static_cast<zcr_vsync_feedback_v1*>(
wl_registry_bind(registry, id, &zcr_vsync_feedback_v1_interface, 1)));
}
}
......
......@@ -78,6 +78,7 @@ class ClientBase {
std::unique_ptr<zwp_input_timestamps_manager_v1> input_timestamps_manager;
std::unique_ptr<zwp_linux_explicit_synchronization_v1>
linux_explicit_synchronization;
std::unique_ptr<zcr_vsync_feedback_v1> vsync_feedback;
};
struct Buffer {
......
......@@ -62,6 +62,8 @@ DEFAULT_DELETER(zwp_linux_explicit_synchronization_v1,
zwp_linux_explicit_synchronization_v1_destroy)
DEFAULT_DELETER(zwp_linux_surface_synchronization_v1,
zwp_linux_surface_synchronization_v1_destroy)
DEFAULT_DELETER(zcr_vsync_feedback_v1, zcr_vsync_feedback_v1_destroy)
DEFAULT_DELETER(zcr_vsync_timing_v1, zcr_vsync_timing_v1_destroy)
#if defined(USE_GBM)
DEFAULT_DELETER(gbm_bo, gbm_bo_destroy)
......
......@@ -11,6 +11,7 @@
#include <linux-dmabuf-unstable-v1-client-protocol.h>
#include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
#include <presentation-time-client-protocol.h>
#include <vsync-feedback-unstable-v1-client-protocol.h>
#include <wayland-client-core.h>
#include <wayland-client-protocol.h>
......@@ -64,6 +65,8 @@ DEFAULT_DELETER_FDECL(zwp_linux_buffer_params_v1)
DEFAULT_DELETER_FDECL(zwp_linux_dmabuf_v1)
DEFAULT_DELETER_FDECL(zwp_linux_explicit_synchronization_v1)
DEFAULT_DELETER_FDECL(zwp_linux_surface_synchronization_v1)
DEFAULT_DELETER_FDECL(zcr_vsync_feedback_v1)
DEFAULT_DELETER_FDECL(zcr_vsync_timing_v1)
#if defined(USE_GBM)
DEFAULT_DELETER_FDECL(gbm_bo)
......
......@@ -25,11 +25,11 @@ TEST_F(WaylandClientPerfTests, Simple) {
exo::wayland::clients::Simple client;
EXPECT_TRUE(client.Init(params));
client.Run(kWarmUpFrames, nullptr);
client.Run(kWarmUpFrames, false, nullptr);
exo::wayland::clients::Simple::PresentationFeedback feedback;
auto start_time = base::Time::Now();
client.Run(kTestFrames, &feedback);
client.Run(kTestFrames, false, &feedback);
auto time_delta = base::Time::Now() - start_time;
float fps = kTestFrames / time_delta.InSecondsF();
perf_test::PrintResult("WaylandClientPerfTests", "", "SimpleFrameRate", fps,
......
......@@ -5,6 +5,7 @@
#include "components/exo/wayland/clients/simple.h"
#include <presentation-time-client-protocol.h>
#include <iostream>
#include "base/command_line.h"
#include "base/containers/circular_deque.h"
......@@ -77,15 +78,46 @@ void FeedbackDiscarded(void* data, struct wp_presentation_feedback* feedback) {
presentation->submitted_frames.erase(it);
}
void VSyncTimingUpdate(void* data,
struct zcr_vsync_timing_v1* zcr_vsync_timing_v1,
uint32_t timebase_l,
uint32_t timebase_h,
uint32_t interval_l,
uint32_t interval_h) {
uint64_t timebase = static_cast<uint64_t>(timebase_h) << 32 | timebase_l;
uint64_t interval = static_cast<uint64_t>(interval_h) << 32 | interval_l;
std::cout << "Received new VSyncTimingUpdate. Timebase: " << timebase
<< ". Interval: " << interval << std::endl;
}
} // namespace
Simple::Simple() = default;
void Simple::Run(int frames, PresentationFeedback* feedback) {
void Simple::Run(int frames,
const bool log_vsync_timing_updates,
PresentationFeedback* feedback) {
wl_callback_listener frame_listener = {FrameCallback};
wp_presentation_feedback_listener feedback_listener = {
FeedbackSyncOutput, FeedbackPresented, FeedbackDiscarded};
std::unique_ptr<zcr_vsync_timing_v1> vsync_timing;
if (log_vsync_timing_updates) {
if (globals_.vsync_feedback) {
vsync_timing.reset(zcr_vsync_feedback_v1_get_vsync_timing(
globals_.vsync_feedback.get(), globals_.output.get()));
DCHECK(vsync_timing);
static zcr_vsync_timing_v1_listener vsync_timing_listener = {
VSyncTimingUpdate};
zcr_vsync_timing_v1_add_listener(vsync_timing.get(),
&vsync_timing_listener, this);
} else {
LOG(WARNING)
<< "VSync timing updates requested but zcr_vsync_feedback_v1 "
"protocol is not available on the server.";
}
}
Presentation presentation;
int frame_count = 0;
......
......@@ -24,7 +24,9 @@ class Simple : public wayland::clients::ClientBase {
uint32_t num_frames_presented = 0;
};
void Run(int frames, PresentationFeedback* feedback = nullptr);
void Run(int frames,
const bool log_vsync_timing_updates = false,
PresentationFeedback* feedback = nullptr);
private:
DISALLOW_COPY_AND_ASSIGN(Simple);
......
......@@ -11,6 +11,11 @@
#include "base/message_loop/message_loop.h"
#include "components/exo/wayland/clients/simple.h"
namespace switches {
// Specifies if VSync timing updates should be logged on the output.
const char kLogVSyncTimingUpdates[] = "log-vsync-timing-updates";
} // namespace switches
int main(int argc, char* argv[]) {
base::AtExitManager exit_manager;
base::CommandLine::Init(argc, argv);
......@@ -24,7 +29,10 @@ int main(int argc, char* argv[]) {
if (!client.Init(params))
return 1;
client.Run(std::numeric_limits<int>::max());
bool log_vsync_timing_updates =
command_line->HasSwitch(switches::kLogVSyncTimingUpdates);
client.Run(std::numeric_limits<int>::max(), log_vsync_timing_updates);
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment