blob: fc795c661da9074842e73fc9438fdccff6ba0d54 [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 "shm.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 {
Shm::Shm(Connection* connection, const x11::QueryExtensionReply& info)
: connection_(connection), info_(info) {}
template <>
COMPONENT_EXPORT(X11)
void ReadEvent<Shm::CompletionEvent>(Shm::CompletionEvent* event_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*event_).sequence;
auto& drawable = (*event_).drawable;
auto& minor_event = (*event_).minor_event;
auto& major_event = (*event_).major_event;
auto& shmseg = (*event_).shmseg;
auto& offset = (*event_).offset;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// drawable
Read(&drawable, &buf);
// minor_event
Read(&minor_event, &buf);
// major_event
Read(&major_event, &buf);
// pad1
Pad(&buf, 1);
// shmseg
Read(&shmseg, &buf);
// offset
Read(&offset, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Shm::BadSegError::ToString() const {
std::stringstream ss_;
ss_ << "Shm::BadSegError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", ";
ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", ";
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<Shm::BadSegError>(Shm::BadSegError* error_, ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
auto& bad_value = (*error_).bad_value;
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_value
Read(&bad_value, &buf);
// minor_opcode
Read(&minor_opcode, &buf);
// major_opcode
Read(&major_opcode, &buf);
// pad0
Pad(&buf, 1);
DCHECK_LE(buf.offset, 32ul);
}
Future<Shm::QueryVersionReply> Shm::QueryVersion(
const Shm::QueryVersionRequest& 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 = 0;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
Align(&buf, 4);
return connection_->SendRequest<Shm::QueryVersionReply>(
&buf, "Shm::QueryVersion", false);
}
Future<Shm::QueryVersionReply> Shm::QueryVersion() {
return Shm::QueryVersion(Shm::QueryVersionRequest{});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Shm::QueryVersionReply> detail::ReadReply<
Shm::QueryVersionReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Shm::QueryVersionReply>();
auto& shared_pixmaps = (*reply).shared_pixmaps;
auto& sequence = (*reply).sequence;
auto& major_version = (*reply).major_version;
auto& minor_version = (*reply).minor_version;
auto& uid = (*reply).uid;
auto& gid = (*reply).gid;
auto& pixmap_format = (*reply).pixmap_format;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// shared_pixmaps
Read(&shared_pixmaps, &buf);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// major_version
Read(&major_version, &buf);
// minor_version
Read(&minor_version, &buf);
// uid
Read(&uid, &buf);
// gid
Read(&gid, &buf);
// pixmap_format
Read(&pixmap_format, &buf);
// pad0
Pad(&buf, 15);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Shm::Attach(const Shm::AttachRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& shmseg = request.shmseg;
auto& shmid = request.shmid;
auto& read_only = request.read_only;
// 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));
// shmseg
buf.Write(&shmseg);
// shmid
buf.Write(&shmid);
// read_only
buf.Write(&read_only);
// pad0
Pad(&buf, 3);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Shm::Attach", false);
}
Future<void> Shm::Attach(const Seg& shmseg,
const uint32_t& shmid,
const uint8_t& read_only) {
return Shm::Attach(Shm::AttachRequest{shmseg, shmid, read_only});
}
Future<void> Shm::Detach(const Shm::DetachRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& shmseg = request.shmseg;
// 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));
// shmseg
buf.Write(&shmseg);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Shm::Detach", false);
}
Future<void> Shm::Detach(const Seg& shmseg) {
return Shm::Detach(Shm::DetachRequest{shmseg});
}
Future<void> Shm::PutImage(const Shm::PutImageRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& drawable = request.drawable;
auto& gc = request.gc;
auto& total_width = request.total_width;
auto& total_height = request.total_height;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& src_width = request.src_width;
auto& src_height = request.src_height;
auto& dst_x = request.dst_x;
auto& dst_y = request.dst_y;
auto& depth = request.depth;
auto& format = request.format;
auto& send_event = request.send_event;
auto& shmseg = request.shmseg;
auto& offset = request.offset;
// 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));
// drawable
buf.Write(&drawable);
// gc
buf.Write(&gc);
// total_width
buf.Write(&total_width);
// total_height
buf.Write(&total_height);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// src_width
buf.Write(&src_width);
// src_height
buf.Write(&src_height);
// dst_x
buf.Write(&dst_x);
// dst_y
buf.Write(&dst_y);
// depth
buf.Write(&depth);
// format
uint8_t tmp0;
tmp0 = static_cast<uint8_t>(format);
buf.Write(&tmp0);
// send_event
buf.Write(&send_event);
// pad0
Pad(&buf, 1);
// shmseg
buf.Write(&shmseg);
// offset
buf.Write(&offset);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Shm::PutImage", false);
}
Future<void> Shm::PutImage(const Drawable& drawable,
const GraphicsContext& gc,
const uint16_t& total_width,
const uint16_t& total_height,
const uint16_t& src_x,
const uint16_t& src_y,
const uint16_t& src_width,
const uint16_t& src_height,
const int16_t& dst_x,
const int16_t& dst_y,
const uint8_t& depth,
const ImageFormat& format,
const uint8_t& send_event,
const Seg& shmseg,
const uint32_t& offset) {
return Shm::PutImage(Shm::PutImageRequest{
drawable, gc, total_width, total_height, src_x, src_y, src_width,
src_height, dst_x, dst_y, depth, format, send_event, shmseg, offset});
}
Future<Shm::GetImageReply> Shm::GetImage(const Shm::GetImageRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& drawable = request.drawable;
auto& x = request.x;
auto& y = request.y;
auto& width = request.width;
auto& height = request.height;
auto& plane_mask = request.plane_mask;
auto& format = request.format;
auto& shmseg = request.shmseg;
auto& offset = request.offset;
// 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));
// drawable
buf.Write(&drawable);
// x
buf.Write(&x);
// y
buf.Write(&y);
// width
buf.Write(&width);
// height
buf.Write(&height);
// plane_mask
buf.Write(&plane_mask);
// format
buf.Write(&format);
// pad0
Pad(&buf, 3);
// shmseg
buf.Write(&shmseg);
// offset
buf.Write(&offset);
Align(&buf, 4);
return connection_->SendRequest<Shm::GetImageReply>(&buf, "Shm::GetImage",
false);
}
Future<Shm::GetImageReply> Shm::GetImage(const Drawable& drawable,
const int16_t& x,
const int16_t& y,
const uint16_t& width,
const uint16_t& height,
const uint32_t& plane_mask,
const uint8_t& format,
const Seg& shmseg,
const uint32_t& offset) {
return Shm::GetImage(Shm::GetImageRequest{
drawable, x, y, width, height, plane_mask, format, shmseg, offset});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Shm::GetImageReply> detail::ReadReply<Shm::GetImageReply>(
ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Shm::GetImageReply>();
auto& depth = (*reply).depth;
auto& sequence = (*reply).sequence;
auto& visual = (*reply).visual;
auto& size = (*reply).size;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// depth
Read(&depth, &buf);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// visual
Read(&visual, &buf);
// size
Read(&size, &buf);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Shm::CreatePixmap(const Shm::CreatePixmapRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& pid = request.pid;
auto& drawable = request.drawable;
auto& width = request.width;
auto& height = request.height;
auto& depth = request.depth;
auto& shmseg = request.shmseg;
auto& offset = request.offset;
// 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));
// pid
buf.Write(&pid);
// drawable
buf.Write(&drawable);
// width
buf.Write(&width);
// height
buf.Write(&height);
// depth
buf.Write(&depth);
// pad0
Pad(&buf, 3);
// shmseg
buf.Write(&shmseg);
// offset
buf.Write(&offset);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Shm::CreatePixmap", false);
}
Future<void> Shm::CreatePixmap(const Pixmap& pid,
const Drawable& drawable,
const uint16_t& width,
const uint16_t& height,
const uint8_t& depth,
const Seg& shmseg,
const uint32_t& offset) {
return Shm::CreatePixmap(Shm::CreatePixmapRequest{
pid, drawable, width, height, depth, shmseg, offset});
}
Future<void> Shm::AttachFd(const Shm::AttachFdRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& shmseg = request.shmseg;
auto& shm_fd = request.shm_fd;
auto& read_only = request.read_only;
// 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));
// shmseg
buf.Write(&shmseg);
// shm_fd
buf.fds().push_back(HANDLE_EINTR(dup(shm_fd.get())));
// read_only
buf.Write(&read_only);
// pad0
Pad(&buf, 3);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Shm::AttachFd", false);
}
Future<void> Shm::AttachFd(const Seg& shmseg,
const RefCountedFD& shm_fd,
const uint8_t& read_only) {
return Shm::AttachFd(Shm::AttachFdRequest{shmseg, shm_fd, read_only});
}
Future<Shm::CreateSegmentReply> Shm::CreateSegment(
const Shm::CreateSegmentRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& shmseg = request.shmseg;
auto& size = request.size;
auto& read_only = request.read_only;
// 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));
// shmseg
buf.Write(&shmseg);
// size
buf.Write(&size);
// read_only
buf.Write(&read_only);
// pad0
Pad(&buf, 3);
Align(&buf, 4);
return connection_->SendRequest<Shm::CreateSegmentReply>(
&buf, "Shm::CreateSegment", true);
}
Future<Shm::CreateSegmentReply> Shm::CreateSegment(const Seg& shmseg,
const uint32_t& size,
const uint8_t& read_only) {
return Shm::CreateSegment(Shm::CreateSegmentRequest{shmseg, size, read_only});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Shm::CreateSegmentReply> detail::ReadReply<
Shm::CreateSegmentReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Shm::CreateSegmentReply>();
auto& nfd = (*reply).nfd;
auto& sequence = (*reply).sequence;
auto& shm_fd = (*reply).shm_fd;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// nfd
Read(&nfd, &buf);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// shm_fd
shm_fd = RefCountedFD(buf.TakeFd());
// pad0
Pad(&buf, 24);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
} // namespace x11