blob: f175c29b22b1edfe24e281281db81fc680be71df [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file was automatically generated with:
// ../../ui/gfx/x/gen_xproto.py \
// ../../third_party/xcbproto/src \
// gen/ui/gfx/x \
// bigreq \
// composite \
// damage \
// dpms \
// dri2 \
// dri3 \
// ge \
// glx \
// present \
// randr \
// record \
// render \
// res \
// screensaver \
// shape \
// shm \
// sync \
// xc_misc \
// xevie \
// xf86dri \
// xf86vidmode \
// xfixes \
// xinerama \
// xinput \
// xkb \
// xprint \
// xproto \
// xselinux \
// xtest \
// xv \
// xvmc
#include "sync.h"
#include <xcb/xcb.h>
#include <xcb/xcbext.h>
#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "ui/gfx/x/xproto_internal.h"
namespace x11 {
Sync::Sync(Connection* connection, const x11::QueryExtensionReply& info)
: connection_(connection), info_(info) {}
std::string Sync::CounterError::ToString() const {
std::stringstream ss_;
ss_ << "Sync::CounterError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", ";
ss_ << ".bad_counter = " << static_cast<uint64_t>(bad_counter) << ", ";
ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", ";
ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Sync::CounterError>(Sync::CounterError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
auto& bad_counter = (*error_).bad_counter;
auto& minor_opcode = (*error_).minor_opcode;
auto& major_opcode = (*error_).major_opcode;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
// bad_counter
Read(&bad_counter, &buf);
// minor_opcode
Read(&minor_opcode, &buf);
// major_opcode
Read(&major_opcode, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Sync::AlarmError::ToString() const {
std::stringstream ss_;
ss_ << "Sync::AlarmError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", ";
ss_ << ".bad_alarm = " << static_cast<uint64_t>(bad_alarm) << ", ";
ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", ";
ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Sync::AlarmError>(Sync::AlarmError* error_, ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
auto& bad_alarm = (*error_).bad_alarm;
auto& minor_opcode = (*error_).minor_opcode;
auto& major_opcode = (*error_).major_opcode;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
// bad_alarm
Read(&bad_alarm, &buf);
// minor_opcode
Read(&minor_opcode, &buf);
// major_opcode
Read(&major_opcode, &buf);
DCHECK_LE(buf.offset, 32ul);
}
template <>
COMPONENT_EXPORT(X11)
void ReadEvent<Sync::CounterNotifyEvent>(Sync::CounterNotifyEvent* event_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& kind = (*event_).kind;
auto& sequence = (*event_).sequence;
auto& counter = (*event_).counter;
auto& wait_value = (*event_).wait_value;
auto& counter_value = (*event_).counter_value;
auto& timestamp = (*event_).timestamp;
auto& count = (*event_).count;
auto& destroyed = (*event_).destroyed;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// kind
Read(&kind, &buf);
// sequence
Read(&sequence, &buf);
// counter
Read(&counter, &buf);
// wait_value
{
auto& hi = wait_value.hi;
auto& lo = wait_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// counter_value
{
auto& hi = counter_value.hi;
auto& lo = counter_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// timestamp
Read(&timestamp, &buf);
// count
Read(&count, &buf);
// destroyed
Read(&destroyed, &buf);
// pad0
Pad(&buf, 1);
DCHECK_LE(buf.offset, 32ul);
}
template <>
COMPONENT_EXPORT(X11)
void ReadEvent<Sync::AlarmNotifyEvent>(Sync::AlarmNotifyEvent* event_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& kind = (*event_).kind;
auto& sequence = (*event_).sequence;
auto& alarm = (*event_).alarm;
auto& counter_value = (*event_).counter_value;
auto& alarm_value = (*event_).alarm_value;
auto& timestamp = (*event_).timestamp;
auto& state = (*event_).state;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// kind
Read(&kind, &buf);
// sequence
Read(&sequence, &buf);
// alarm
Read(&alarm, &buf);
// counter_value
{
auto& hi = counter_value.hi;
auto& lo = counter_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// alarm_value
{
auto& hi = alarm_value.hi;
auto& lo = alarm_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// timestamp
Read(&timestamp, &buf);
// state
uint8_t tmp0;
Read(&tmp0, &buf);
state = static_cast<Sync::Alarmstate>(tmp0);
// pad0
Pad(&buf, 3);
DCHECK_LE(buf.offset, 32ul);
}
Future<Sync::InitializeReply> Sync::Initialize(
const Sync::InitializeRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& desired_major_version = request.desired_major_version;
auto& desired_minor_version = request.desired_minor_version;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 0;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// desired_major_version
buf.Write(&desired_major_version);
// desired_minor_version
buf.Write(&desired_minor_version);
Align(&buf, 4);
return connection_->SendRequest<Sync::InitializeReply>(
&buf, "Sync::Initialize", false);
}
Future<Sync::InitializeReply> Sync::Initialize(
const uint8_t& desired_major_version,
const uint8_t& desired_minor_version) {
return Sync::Initialize(
Sync::InitializeRequest{desired_major_version, desired_minor_version});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::InitializeReply> detail::ReadReply<Sync::InitializeReply>(
ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::InitializeReply>();
auto& sequence = (*reply).sequence;
auto& major_version = (*reply).major_version;
auto& minor_version = (*reply).minor_version;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// major_version
Read(&major_version, &buf);
// minor_version
Read(&minor_version, &buf);
// pad1
Pad(&buf, 22);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<Sync::ListSystemCountersReply> Sync::ListSystemCounters(
const Sync::ListSystemCountersRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 1;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
Align(&buf, 4);
return connection_->SendRequest<Sync::ListSystemCountersReply>(
&buf, "Sync::ListSystemCounters", false);
}
Future<Sync::ListSystemCountersReply> Sync::ListSystemCounters() {
return Sync::ListSystemCounters(Sync::ListSystemCountersRequest{});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::ListSystemCountersReply> detail::ReadReply<
Sync::ListSystemCountersReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::ListSystemCountersReply>();
auto& sequence = (*reply).sequence;
uint32_t counters_len{};
auto& counters = (*reply).counters;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// counters_len
Read(&counters_len, &buf);
// pad1
Pad(&buf, 20);
// counters
counters.resize(counters_len);
for (auto& counters_elem : counters) {
// counters_elem
{
auto& counter = counters_elem.counter;
auto& resolution = counters_elem.resolution;
uint16_t name_len{};
auto& name = counters_elem.name;
// counter
Read(&counter, &buf);
// resolution
{
auto& hi = resolution.hi;
auto& lo = resolution.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// name_len
Read(&name_len, &buf);
// name
name.resize(name_len);
for (auto& name_elem : name) {
// name_elem
Read(&name_elem, &buf);
}
// pad0
Align(&buf, 4);
}
}
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Sync::CreateCounter(const Sync::CreateCounterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& id = request.id;
auto& initial_value = request.initial_value;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 2;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// id
buf.Write(&id);
// initial_value
{
auto& hi = initial_value.hi;
auto& lo = initial_value.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::CreateCounter", false);
}
Future<void> Sync::CreateCounter(const Counter& id,
const Int64& initial_value) {
return Sync::CreateCounter(Sync::CreateCounterRequest{id, initial_value});
}
Future<void> Sync::DestroyCounter(const Sync::DestroyCounterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& counter = request.counter;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 6;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// counter
buf.Write(&counter);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::DestroyCounter", false);
}
Future<void> Sync::DestroyCounter(const Counter& counter) {
return Sync::DestroyCounter(Sync::DestroyCounterRequest{counter});
}
Future<Sync::QueryCounterReply> Sync::QueryCounter(
const Sync::QueryCounterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& counter = request.counter;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 5;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// counter
buf.Write(&counter);
Align(&buf, 4);
return connection_->SendRequest<Sync::QueryCounterReply>(
&buf, "Sync::QueryCounter", false);
}
Future<Sync::QueryCounterReply> Sync::QueryCounter(const Counter& counter) {
return Sync::QueryCounter(Sync::QueryCounterRequest{counter});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::QueryCounterReply> detail::ReadReply<
Sync::QueryCounterReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::QueryCounterReply>();
auto& sequence = (*reply).sequence;
auto& counter_value = (*reply).counter_value;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// counter_value
{
auto& hi = counter_value.hi;
auto& lo = counter_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Sync::Await(const Sync::AwaitRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& wait_list = request.wait_list;
size_t wait_list_len = wait_list.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 7;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// wait_list
DCHECK_EQ(static_cast<size_t>(wait_list_len), wait_list.size());
for (auto& wait_list_elem : wait_list) {
// wait_list_elem
{
auto& trigger = wait_list_elem.trigger;
auto& event_threshold = wait_list_elem.event_threshold;
// trigger
{
auto& counter = trigger.counter;
auto& wait_type = trigger.wait_type;
auto& wait_value = trigger.wait_value;
auto& test_type = trigger.test_type;
// counter
buf.Write(&counter);
// wait_type
uint32_t tmp1;
tmp1 = static_cast<uint32_t>(wait_type);
buf.Write(&tmp1);
// wait_value
{
auto& hi = wait_value.hi;
auto& lo = wait_value.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
// test_type
uint32_t tmp2;
tmp2 = static_cast<uint32_t>(test_type);
buf.Write(&tmp2);
}
// event_threshold
{
auto& hi = event_threshold.hi;
auto& lo = event_threshold.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::Await", false);
}
Future<void> Sync::Await(const std::vector<WaitCondition>& wait_list) {
return Sync::Await(Sync::AwaitRequest{wait_list});
}
Future<void> Sync::ChangeCounter(const Sync::ChangeCounterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& counter = request.counter;
auto& amount = request.amount;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 4;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// counter
buf.Write(&counter);
// amount
{
auto& hi = amount.hi;
auto& lo = amount.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::ChangeCounter", false);
}
Future<void> Sync::ChangeCounter(const Counter& counter, const Int64& amount) {
return Sync::ChangeCounter(Sync::ChangeCounterRequest{counter, amount});
}
Future<void> Sync::SetCounter(const Sync::SetCounterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& counter = request.counter;
auto& value = request.value;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 3;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// counter
buf.Write(&counter);
// value
{
auto& hi = value.hi;
auto& lo = value.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::SetCounter", false);
}
Future<void> Sync::SetCounter(const Counter& counter, const Int64& value) {
return Sync::SetCounter(Sync::SetCounterRequest{counter, value});
}
Future<void> Sync::CreateAlarm(const Sync::CreateAlarmRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& id = request.id;
ChangeAlarmAttribute value_mask{};
auto& value_list = request;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 8;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// id
buf.Write(&id);
// value_mask
SwitchVar(ChangeAlarmAttribute::Counter, value_list.counter.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::ValueType, value_list.valueType.has_value(),
true, &value_mask);
SwitchVar(ChangeAlarmAttribute::Value, value_list.value.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::TestType, value_list.testType.has_value(),
true, &value_mask);
SwitchVar(ChangeAlarmAttribute::Delta, value_list.delta.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::Events, value_list.events.has_value(), true,
&value_mask);
uint32_t tmp3;
tmp3 = static_cast<uint32_t>(value_mask);
buf.Write(&tmp3);
// value_list
auto value_list_expr = value_mask;
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Counter)) {
auto& counter = *value_list.counter;
// counter
buf.Write(&counter);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::ValueType)) {
auto& valueType = *value_list.valueType;
// valueType
uint32_t tmp4;
tmp4 = static_cast<uint32_t>(valueType);
buf.Write(&tmp4);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Value)) {
auto& value = *value_list.value;
// value
{
auto& hi = value.hi;
auto& lo = value.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::TestType)) {
auto& testType = *value_list.testType;
// testType
uint32_t tmp5;
tmp5 = static_cast<uint32_t>(testType);
buf.Write(&tmp5);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Delta)) {
auto& delta = *value_list.delta;
// delta
{
auto& hi = delta.hi;
auto& lo = delta.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Events)) {
auto& events = *value_list.events;
// events
buf.Write(&events);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::CreateAlarm", false);
}
Future<void> Sync::CreateAlarm(const Alarm& id,
const absl::optional<Counter>& counter,
const absl::optional<Valuetype>& valueType,
const absl::optional<Int64>& value,
const absl::optional<Testtype>& testType,
const absl::optional<Int64>& delta,
const absl::optional<uint32_t>& events) {
return Sync::CreateAlarm(Sync::CreateAlarmRequest{
id, counter, valueType, value, testType, delta, events});
}
Future<void> Sync::ChangeAlarm(const Sync::ChangeAlarmRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& id = request.id;
ChangeAlarmAttribute value_mask{};
auto& value_list = request;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 9;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// id
buf.Write(&id);
// value_mask
SwitchVar(ChangeAlarmAttribute::Counter, value_list.counter.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::ValueType, value_list.valueType.has_value(),
true, &value_mask);
SwitchVar(ChangeAlarmAttribute::Value, value_list.value.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::TestType, value_list.testType.has_value(),
true, &value_mask);
SwitchVar(ChangeAlarmAttribute::Delta, value_list.delta.has_value(), true,
&value_mask);
SwitchVar(ChangeAlarmAttribute::Events, value_list.events.has_value(), true,
&value_mask);
uint32_t tmp6;
tmp6 = static_cast<uint32_t>(value_mask);
buf.Write(&tmp6);
// value_list
auto value_list_expr = value_mask;
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Counter)) {
auto& counter = *value_list.counter;
// counter
buf.Write(&counter);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::ValueType)) {
auto& valueType = *value_list.valueType;
// valueType
uint32_t tmp7;
tmp7 = static_cast<uint32_t>(valueType);
buf.Write(&tmp7);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Value)) {
auto& value = *value_list.value;
// value
{
auto& hi = value.hi;
auto& lo = value.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::TestType)) {
auto& testType = *value_list.testType;
// testType
uint32_t tmp8;
tmp8 = static_cast<uint32_t>(testType);
buf.Write(&tmp8);
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Delta)) {
auto& delta = *value_list.delta;
// delta
{
auto& hi = delta.hi;
auto& lo = delta.lo;
// hi
buf.Write(&hi);
// lo
buf.Write(&lo);
}
}
if (CaseAnd(value_list_expr, ChangeAlarmAttribute::Events)) {
auto& events = *value_list.events;
// events
buf.Write(&events);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::ChangeAlarm", false);
}
Future<void> Sync::ChangeAlarm(const Alarm& id,
const absl::optional<Counter>& counter,
const absl::optional<Valuetype>& valueType,
const absl::optional<Int64>& value,
const absl::optional<Testtype>& testType,
const absl::optional<Int64>& delta,
const absl::optional<uint32_t>& events) {
return Sync::ChangeAlarm(Sync::ChangeAlarmRequest{
id, counter, valueType, value, testType, delta, events});
}
Future<void> Sync::DestroyAlarm(const Sync::DestroyAlarmRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& alarm = request.alarm;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 11;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// alarm
buf.Write(&alarm);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::DestroyAlarm", false);
}
Future<void> Sync::DestroyAlarm(const Alarm& alarm) {
return Sync::DestroyAlarm(Sync::DestroyAlarmRequest{alarm});
}
Future<Sync::QueryAlarmReply> Sync::QueryAlarm(
const Sync::QueryAlarmRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& alarm = request.alarm;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 10;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// alarm
buf.Write(&alarm);
Align(&buf, 4);
return connection_->SendRequest<Sync::QueryAlarmReply>(
&buf, "Sync::QueryAlarm", false);
}
Future<Sync::QueryAlarmReply> Sync::QueryAlarm(const Alarm& alarm) {
return Sync::QueryAlarm(Sync::QueryAlarmRequest{alarm});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::QueryAlarmReply> detail::ReadReply<Sync::QueryAlarmReply>(
ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::QueryAlarmReply>();
auto& sequence = (*reply).sequence;
auto& trigger = (*reply).trigger;
auto& delta = (*reply).delta;
auto& events = (*reply).events;
auto& state = (*reply).state;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// trigger
{
auto& counter = trigger.counter;
auto& wait_type = trigger.wait_type;
auto& wait_value = trigger.wait_value;
auto& test_type = trigger.test_type;
// counter
Read(&counter, &buf);
// wait_type
uint32_t tmp9;
Read(&tmp9, &buf);
wait_type = static_cast<Sync::Valuetype>(tmp9);
// wait_value
{
auto& hi = wait_value.hi;
auto& lo = wait_value.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// test_type
uint32_t tmp10;
Read(&tmp10, &buf);
test_type = static_cast<Sync::Testtype>(tmp10);
}
// delta
{
auto& hi = delta.hi;
auto& lo = delta.lo;
// hi
Read(&hi, &buf);
// lo
Read(&lo, &buf);
}
// events
Read(&events, &buf);
// state
uint8_t tmp11;
Read(&tmp11, &buf);
state = static_cast<Sync::Alarmstate>(tmp11);
// pad1
Pad(&buf, 2);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Sync::SetPriority(const Sync::SetPriorityRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& id = request.id;
auto& priority = request.priority;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 12;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// id
buf.Write(&id);
// priority
buf.Write(&priority);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::SetPriority", false);
}
Future<void> Sync::SetPriority(const uint32_t& id, const int32_t& priority) {
return Sync::SetPriority(Sync::SetPriorityRequest{id, priority});
}
Future<Sync::GetPriorityReply> Sync::GetPriority(
const Sync::GetPriorityRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& id = request.id;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 13;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// id
buf.Write(&id);
Align(&buf, 4);
return connection_->SendRequest<Sync::GetPriorityReply>(
&buf, "Sync::GetPriority", false);
}
Future<Sync::GetPriorityReply> Sync::GetPriority(const uint32_t& id) {
return Sync::GetPriority(Sync::GetPriorityRequest{id});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::GetPriorityReply> detail::ReadReply<
Sync::GetPriorityReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::GetPriorityReply>();
auto& sequence = (*reply).sequence;
auto& priority = (*reply).priority;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// priority
Read(&priority, &buf);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Sync::CreateFence(const Sync::CreateFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& drawable = request.drawable;
auto& fence = request.fence;
auto& initially_triggered = request.initially_triggered;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 14;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// drawable
buf.Write(&drawable);
// fence
buf.Write(&fence);
// initially_triggered
buf.Write(&initially_triggered);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::CreateFence", false);
}
Future<void> Sync::CreateFence(const Drawable& drawable,
const Fence& fence,
const uint8_t& initially_triggered) {
return Sync::CreateFence(
Sync::CreateFenceRequest{drawable, fence, initially_triggered});
}
Future<void> Sync::TriggerFence(const Sync::TriggerFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& fence = request.fence;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 15;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// fence
buf.Write(&fence);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::TriggerFence", false);
}
Future<void> Sync::TriggerFence(const Fence& fence) {
return Sync::TriggerFence(Sync::TriggerFenceRequest{fence});
}
Future<void> Sync::ResetFence(const Sync::ResetFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& fence = request.fence;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 16;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// fence
buf.Write(&fence);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::ResetFence", false);
}
Future<void> Sync::ResetFence(const Fence& fence) {
return Sync::ResetFence(Sync::ResetFenceRequest{fence});
}
Future<void> Sync::DestroyFence(const Sync::DestroyFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& fence = request.fence;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 17;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// fence
buf.Write(&fence);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::DestroyFence", false);
}
Future<void> Sync::DestroyFence(const Fence& fence) {
return Sync::DestroyFence(Sync::DestroyFenceRequest{fence});
}
Future<Sync::QueryFenceReply> Sync::QueryFence(
const Sync::QueryFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& fence = request.fence;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 18;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// fence
buf.Write(&fence);
Align(&buf, 4);
return connection_->SendRequest<Sync::QueryFenceReply>(
&buf, "Sync::QueryFence", false);
}
Future<Sync::QueryFenceReply> Sync::QueryFence(const Fence& fence) {
return Sync::QueryFence(Sync::QueryFenceRequest{fence});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Sync::QueryFenceReply> detail::ReadReply<Sync::QueryFenceReply>(
ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Sync::QueryFenceReply>();
auto& sequence = (*reply).sequence;
auto& triggered = (*reply).triggered;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// triggered
Read(&triggered, &buf);
// pad1
Pad(&buf, 23);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Sync::AwaitFence(const Sync::AwaitFenceRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& fence_list = request.fence_list;
size_t fence_list_len = fence_list.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 19;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// fence_list
DCHECK_EQ(static_cast<size_t>(fence_list_len), fence_list.size());
for (auto& fence_list_elem : fence_list) {
// fence_list_elem
buf.Write(&fence_list_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Sync::AwaitFence", false);
}
Future<void> Sync::AwaitFence(const std::vector<Fence>& fence_list) {
return Sync::AwaitFence(Sync::AwaitFenceRequest{fence_list});
}
} // namespace x11