e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifndef CR_PROTOCOL_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_PROTOCOL_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
944af4e9c55b259413ffc0fb9429da524a3685c6vboxsync#include <iprt/types.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/cdefs.h>
14d0566627e0dd5853cae37a1ae7b8e28a99e0f5vboxsync#ifdef DEBUG_misha
14d0566627e0dd5853cae37a1ae7b8e28a99e0f5vboxsync#include "cr_error.h"
14d0566627e0dd5853cae37a1ae7b8e28a99e0f5vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern "C" {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync#define CR_CMDVBVA_VERSION 1
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync#pragma pack(1)
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsynctypedef struct CR_CAPS_INFO
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync{
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync uint32_t u32Caps;
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync uint32_t u32CmdVbvaVersion;
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync} CR_CAPS_INFO;
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync#pragma pack()
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync
e5970f9ca60805a4507171d4d88da38e61ca5004vboxsync
2e6dc32bcc9c3a3e70c957764c033b1f402bc617vboxsync/*For now guest is allowed to connect host opengl service if protocol version matches exactly*/
2e6dc32bcc9c3a3e70c957764c033b1f402bc617vboxsync/*Note: that after any change to this file, or glapi_parser\apispec.txt version should be changed*/
c12885bf3de22fa504a7b9ddc41473b485d9ab25vboxsync#define CR_PROTOCOL_VERSION_MAJOR 9
2e6dc32bcc9c3a3e70c957764c033b1f402bc617vboxsync#define CR_PROTOCOL_VERSION_MINOR 1
2e6dc32bcc9c3a3e70c957764c033b1f402bc617vboxsync
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync/* new TexPresent mechanism is available */
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync#define CR_VBOX_CAP_TEX_PRESENT 0x00000001
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync/* vbva command submission mechanism supported */
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync#define CR_VBOX_CAP_CMDVBVA 0x00000002
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync/* host supports Command Blocks, i.e. CR_CMDBLOCKBEGIN_OPCODE and CR_CMDBLOCKEND_OPCODE opcodes.
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * Command Block can be used by guest to prevent clients from blocking each other.
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * The Command Block allows multiple command buffers to be processed with one run.
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * Command Block commands have to obey to the following rules:
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * CR_CMDBLOCKBEGIN_OPCODE - must be the first command in the command buffer, specifying the command block start
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * CR_CMDBLOCKEND_OPCODE - must be the last command in the command buffer, specifying the command block end
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * If not placed accordingly, CR_CMDBLOCK** commands are ignored.
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * Server copies the command block buffer commands to its internal storage
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync * and processes them with one run when the command block end is signalled
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync */
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync#define CR_VBOX_CAP_CMDBLOCKS 0x00000004
716eca86fb214d6bf59f8837d35f5e812729940avboxsync/* GetAttribsLocations support */
716eca86fb214d6bf59f8837d35f5e812729940avboxsync#define CR_VBOX_CAP_GETATTRIBSLOCATIONS 0x00000008
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync/* flush command blocks for execution */
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync#define CR_VBOX_CAP_CMDBLOCKS_FLUSH 0x00000010
1e6f7d3f7b9ce2a0984a768221964905446a4c1evboxsync/* Notify guest if host reports minimal OpenGL capabilities. */
9a12c5b3449d176bbe9757d301a4c22fac6e1e2cvboxsync#define CR_VBOX_CAP_HOST_CAPS_NOT_SUFFICIENT 0x00000020
716eca86fb214d6bf59f8837d35f5e812729940avboxsync
1e6f7d3f7b9ce2a0984a768221964905446a4c1evboxsync#define CR_VBOX_CAPS_ALL 0x0000003f
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_SCREEN_MASK 0xffff
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_FLAGS_OFFSET 16
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_FLAGS_MASK 0xffff0000
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_DEFINE_FLAG(_f) (1 << (CR_PRESENT_FLAGS_OFFSET + _f))
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync#define CR_PRESENT_FLAG_CLEAR_RECTS CR_PRESENT_DEFINE_FLAG(0)
ea1cc8df95dba6fca9c36c94f565ef95c7802a36vboxsync#define CR_PRESENT_FLAG_TEX_NONINVERT_YCOORD CR_PRESENT_DEFINE_FLAG(1)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_GET_SCREEN(_cfg) ((_cfg) & CR_PRESENT_SCREEN_MASK)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync#define CR_PRESENT_GET_FLAGS(_cfg) ((_cfg) & CR_PRESENT_FLAGS_MASK)
8cfe2efff2058bd07777056112155ea5353dcfbavboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef enum {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* first message types is 'wGL\001', so we can immediately
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync recognize bad message types */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_OPCODES = 0x77474c01,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_WRITEBACK,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_READBACK,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_READ_PIXELS,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_MULTI_BODY,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_MULTI_TAIL,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_FLOW_CONTROL,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_OOB,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_NEWCLIENT,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_GATHER,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_ERROR,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_CRUT,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CR_MESSAGE_REDIR_PTR
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageType;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef union {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* pointers are usually 4 bytes, but on 64-bit machines (Alpha,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * SGI-n64, etc.) they are 8 bytes. Pass network pointers around
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * as an opaque array of bytes, since the interpretation & size of
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the pointer only matter to the machine which emitted the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * pointer (and will eventually receive the pointer back again) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int ptrAlign[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char ptrSize[8];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* hack to make this packet big */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* unsigned int junk[512]; */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRNetworkPointer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#if 0 //def DEBUG_misha
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_SETZ(_p) crMemset((_p), 0, sizeof (CRNetworkPointer))
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_CHECKZ(_p) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRNetworkPointer _ptr = {0}; \
a36941c0c575a6116528b213066e4f08381feb69vboxsync CRASSERT(!crMemcmp((_p), &_ptr, sizeof (CRNetworkPointer))); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_CHECKNZ(_p) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRNetworkPointer _ptr = {0}; \
a36941c0c575a6116528b213066e4f08381feb69vboxsync CRASSERT(crMemcmp((_p), &_ptr, sizeof (CRNetworkPointer))); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# if 0
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define _CRDBGPTR_PRINT(_tStr, _id, _p) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync crDebug(_tStr "%d:0x%08x%08x", (_id), (_p)->ptrAlign[1], (_p)->ptrAlign[0]); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# else
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define _CRDBGPTR_PRINT(_tStr, _id, _p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# endif
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_PRINTWB(_id, _p) _CRDBGPTR_PRINT("wbptr:", _id, _p)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_PRINTRB(_id, _p) _CRDBGPTR_PRINT("rbptr:", _id, _p)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#else
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_SETZ(_p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_CHECKZ(_p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_CHECKNZ(_p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_PRINTWB(_id, _p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRDBGPTR_PRINTRB(_id, _p) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#endif
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#ifdef VBOX_WITH_CRHGSMI
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsynctypedef struct CRVBOXHGSMI_CMDDATA {
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync union
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync {
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync struct VBOXVDMACMD_CHROMIUM_CMD *pHgsmiCmd;
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync struct VBOXCMDVBVA_CRCMD_CMD *pVbvaCmd;
775247134cd742acfd3ddecc523a5ae1d1369644vboxsync const void *pvCmd;
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync };
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync int *pCmdRc;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync char *pWriteback;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync unsigned int *pcbWriteback;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync unsigned int cbWriteback;
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync bool fHgsmiCmd;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync} CRVBOXHGSMI_CMDDATA, *PCRVBOXHGSMI_CMDDATA;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#ifdef DEBUG
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData) do { \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync CRASSERT(!(_pData)->pvCmd == !(_pData)->pCmdRc); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->pWriteback == !(_pData)->pcbWriteback); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->pWriteback == !(_pData)->cbWriteback); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync if ((_pData)->pWriteback) \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync { \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync CRASSERT((_pData)->pvCmd); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData) do { \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync CRASSERT(!(_pData)->pvCmd); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->pCmdRc); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->pWriteback); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->pcbWriteback); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(!(_pData)->cbWriteback); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(CRVBOXHGSMI_CMDDATA_IS_SET(_pData)); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSETWB(_pData) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRASSERT(CRVBOXHGSMI_CMDDATA_IS_SETWB(_pData)); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#else
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync# define CRVBOXHGSMI_CMDDATA_ASSERT_ISSETWB(_pData) do { } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#endif
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync#define CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData) (!!(_pData)->fHgsmiCmd)
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync#define CRVBOXHGSMI_CMDDATA_IS_SET(_pData) (!!(_pData)->pvCmd)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRVBOXHGSMI_CMDDATA_IS_SETWB(_pData) (!!(_pData)->pWriteback)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRVBOXHGSMI_CMDDATA_CLEANUP(_pData) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync crMemset(_pData, 0, sizeof (CRVBOXHGSMI_CMDDATA)); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync#define CRVBOXHGSMI_CMDDATA_SET(_pData, _pCmd, _pHdr, _fHgsmiCmd) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(_pData); \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync (_pData)->pvCmd = (_pCmd); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync (_pData)->pCmdRc = &(_pHdr)->result; \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync (_pData)->fHgsmiCmd = (_fHgsmiCmd); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync#define CRVBOXHGSMI_CMDDATA_SETWB(_pData, _pCmd, _pHdr, _pWb, _cbWb, _pcbWb, _fHgsmiCmd) do { \
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync CRVBOXHGSMI_CMDDATA_SET(_pData, _pCmd, _pHdr, _fHgsmiCmd); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync (_pData)->pWriteback = (_pWb); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync (_pData)->pcbWriteback = (_pcbWb); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync (_pData)->cbWriteback = (_cbWb); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA_ASSERT_CONSISTENT(_pData); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#define CRVBOXHGSMI_CMDDATA_RC(_pData, _rc) do { \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync *(_pData)->pCmdRc = (_rc); \
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync } while (0)
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#endif
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageType type;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int conn_id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageHeader;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageOpcodes {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int numOpcodes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageOpcodes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageRedirPtr {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader* pMessage;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#ifdef VBOX_WITH_CRHGSMI
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync CRVBOXHGSMI_CMDDATA CmdData;
b0d3e712c0bf759a686c718a55896f19804cfa75vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageRedirPtr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageWriteback {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRNetworkPointer writeback_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageWriteback;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageReadback {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRNetworkPointer writeback_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRNetworkPointer readback_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageReadback;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageMulti {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageMulti;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageFlowControl {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int credits;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageFlowControl;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageReadPixels {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int width, height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int bytes_per_row;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int stride;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int skipRows;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int skipPixels;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int rowLength;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int format;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int type;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRNetworkPointer pixels;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageReadPixels;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageNewClient {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageNewClient;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRMessageGather {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long offset;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessageGather;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef union {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageHeader header;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageOpcodes opcodes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageRedirPtr redirptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageWriteback writeback;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageReadback readback;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageReadPixels readPixels;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageMulti multi;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageFlowControl flowControl;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageNewClient newclient;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMessageGather gather;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRMessage;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crNetworkPointerWrite( CRNetworkPointer *dst, void *src );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_PROTOCOL_H */