| // 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 |