blob: afae541d06f0ac5f478882b5b7902d3dbb72b3fc [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef VIRTGPU_CROSS_DOMAIN_PROTOCOL_H
#define VIRTGPU_CROSS_DOMAIN_PROTOCOL_H
#include <stdint.h>
// Cross-domain commands (only a maximum of 255 supported)
#define CROSS_DOMAIN_CMD_INIT 1
#define CROSS_DOMAIN_CMD_GET_IMAGE_REQUIREMENTS 2
#define CROSS_DOMAIN_CMD_POLL 3
#define CROSS_DOMAIN_CMD_SEND 4
#define CROSS_DOMAIN_CMD_RECEIVE 5
#define CROSS_DOMAIN_CMD_READ 6
#define CROSS_DOMAIN_CMD_WRITE 7
// Channel types (must match rutabaga channel types)
#define CROSS_DOMAIN_CHANNEL_TYPE_WAYLAND 0x0001
#define CROSS_DOMAIN_CHANNEL_TYPE_CAMERA 0x0002
// The maximum number of identifiers (value based on wp_linux_dmabuf)
#define CROSS_DOMAIN_MAX_IDENTIFIERS 4
// virtgpu memory resource ID. Also works with non-blob memory resources,
// despite the name.
#define CROSS_DOMAIN_ID_TYPE_VIRTGPU_BLOB 1
// virtgpu synchronization resource id.
#define CROSS_DOMAIN_ID_TYPE_VIRTGPU_SYNC 2
// ID for Wayland pipe used for reading. The reading is done by the guest proxy
// and the host proxy. The host sends the write end of the proxied pipe over
// the host Wayland socket.
#define CROSS_DOMAIN_ID_TYPE_READ_PIPE 3
// ID for Wayland pipe used for writing. The writing is done by the guest and
// the host proxy. The host receives the write end of the pipe over the host
// Wayland socket.
#define CROSS_DOMAIN_ID_TYPE_WRITE_PIPE 4
// No ring used
#define CROSS_DOMAIN_RING_NONE 0xffffffff
// A ring for metadata queries.
#define CROSS_DOMAIN_QUERY_RING 0
// A ring based on this particular context's channel.
#define CROSS_DOMAIN_CHANNEL_RING 1
struct CrossDomainCapabilities {
uint32_t version;
uint32_t supported_channels;
uint32_t supports_dmabuf;
uint32_t supports_external_gpu_memory;
};
struct CrossDomainImageRequirements {
uint32_t strides[4];
uint32_t offsets[4];
uint64_t modifier;
uint64_t size;
uint32_t blob_id;
uint32_t map_info;
int32_t memory_idx;
int32_t physical_device_idx;
};
struct CrossDomainHeader {
uint8_t cmd;
uint8_t fence_ctx_idx;
uint16_t cmd_size;
uint32_t pad;
};
struct CrossDomainInit {
struct CrossDomainHeader hdr;
uint32_t ring_id;
uint32_t channel_type;
};
struct CrossDomainGetImageRequirements {
struct CrossDomainHeader hdr;
uint32_t width;
uint32_t height;
uint32_t drm_format;
uint32_t flags;
};
struct CrossDomainPoll {
struct CrossDomainHeader hdr;
uint64_t pad;
};
struct CrossDomainSendReceive {
struct CrossDomainHeader hdr;
uint32_t num_identifiers;
uint32_t opaque_data_size;
uint32_t identifiers[CROSS_DOMAIN_MAX_IDENTIFIERS];
uint32_t identifier_types[CROSS_DOMAIN_MAX_IDENTIFIERS];
uint32_t identifier_sizes[CROSS_DOMAIN_MAX_IDENTIFIERS];
};
struct CrossDomainReadWrite {
struct CrossDomainHeader hdr;
uint32_t identifier;
uint32_t hang_up;
uint32_t opaque_data_size;
uint32_t pad;
};
#endif