mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-22 07:01:30 +00:00
[common] input: define per-client streams
Extend input status with eight exported client-to-host stream endpoints, matching the maximum number of LGMP clients. Publish each endpoint descriptor, client binding, epoch, and lifecycle flags. Require every input activation to keep its ordered records on a single transport. Retain the queue transport as a fallback and bump the input and KVMFR protocol versions for the expanded status layout.
This commit is contained in:
@@ -32,7 +32,7 @@
|
|||||||
#include "KVMFRInput.h"
|
#include "KVMFRInput.h"
|
||||||
|
|
||||||
#define KVMFR_MAGIC "KVMFR---"
|
#define KVMFR_MAGIC "KVMFR---"
|
||||||
#define KVMFR_VERSION 33
|
#define KVMFR_VERSION 34
|
||||||
|
|
||||||
// Fallback used by producers that cannot report the source display's SDR
|
// Fallback used by producers that cannot report the source display's SDR
|
||||||
// white level. IDD frames override this with IDDCX_METADATA2::SdrWhiteLevel.
|
// white level. IDD frames override this with IDDCX_METADATA2::SdrWhiteLevel.
|
||||||
|
|||||||
@@ -23,10 +23,16 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "KVMFRStream.h"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define KVMFR_INPUT_VERSION 1
|
#define KVMFR_INPUT_VERSION 2
|
||||||
|
#define KVMFR_INPUT_STREAM_VERSION 1
|
||||||
|
#define KVMFR_INPUT_STREAM_ENDPOINT_COUNT 8
|
||||||
|
#define KVMFR_INPUT_STREAM_SLOT_COUNT 128
|
||||||
|
#define KVMFR_INPUT_STREAM_SLOT_SIZE 64
|
||||||
#define KVMFR_INPUT_MOUSE_BUTTON_COUNT 32
|
#define KVMFR_INPUT_MOUSE_BUTTON_COUNT 32
|
||||||
#define KVMFR_INPUT_MOUSE_ABSOLUTE_MAX 32767
|
#define KVMFR_INPUT_MOUSE_ABSOLUTE_MAX 32767
|
||||||
#define KVMFR_INPUT_KEYBOARD_KEY_COUNT 6
|
#define KVMFR_INPUT_KEYBOARD_KEY_COUNT 6
|
||||||
@@ -87,6 +93,12 @@ enum
|
|||||||
|
|
||||||
typedef uint32_t KVMFRInputMessageType;
|
typedef uint32_t KVMFRInputMessageType;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* One activation must remain on one ordered transport. CLAIM is sequence one,
|
||||||
|
* reports, KEEPALIVE and RESET increment the sequence, and RELEASE is the
|
||||||
|
* final record. A sender must start a new generation instead of moving an
|
||||||
|
* active sequence between the queue fallback and a stream endpoint.
|
||||||
|
*/
|
||||||
typedef struct KVMFRInputMessage
|
typedef struct KVMFRInputMessage
|
||||||
{
|
{
|
||||||
KVMFRInputMessageType type;
|
KVMFRInputMessageType type;
|
||||||
@@ -117,6 +129,37 @@ enum
|
|||||||
|
|
||||||
typedef uint32_t KVMFRInputStatusFlags;
|
typedef uint32_t KVMFRInputStatusFlags;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
KVMFR_INPUT_TRANSPORT_QUEUE = 0x1,
|
||||||
|
KVMFR_INPUT_TRANSPORT_STREAM = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef uint32_t KVMFRInputTransportFlags;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
KVMFR_INPUT_STREAM_ENDPOINT_AVAILABLE = 0x1,
|
||||||
|
KVMFR_INPUT_STREAM_ENDPOINT_BOUND = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef uint32_t KVMFRInputStreamEndpointFlags;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A bound endpoint is usable only by boundClientID for bindingGeneration. The
|
||||||
|
* host changes bindingGeneration before reusing an endpoint so stale writers
|
||||||
|
* can never be accepted as a new client.
|
||||||
|
*/
|
||||||
|
typedef struct KVMFRInputStreamEndpoint
|
||||||
|
{
|
||||||
|
KVMFRStreamDescriptor stream;
|
||||||
|
uint32_t boundClientID;
|
||||||
|
uint32_t bindingGeneration;
|
||||||
|
KVMFRInputStreamEndpointFlags flags;
|
||||||
|
uint32_t reserved;
|
||||||
|
}
|
||||||
|
KVMFRInputStreamEndpoint;
|
||||||
|
|
||||||
typedef struct KVMFRInputStatus
|
typedef struct KVMFRInputStatus
|
||||||
{
|
{
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
@@ -128,6 +171,13 @@ typedef struct KVMFRInputStatus
|
|||||||
// Input ownership lease duration in milliseconds.
|
// Input ownership lease duration in milliseconds.
|
||||||
uint32_t lease;
|
uint32_t lease;
|
||||||
uint32_t maxButtons;
|
uint32_t maxButtons;
|
||||||
|
KVMFRInputTransportFlags transports;
|
||||||
|
uint32_t streamVersion;
|
||||||
|
uint32_t streamEndpointCount;
|
||||||
|
uint32_t streamGeneration;
|
||||||
|
uint32_t streamReserved[4];
|
||||||
|
KVMFRInputStreamEndpoint streamEndpoint[
|
||||||
|
KVMFR_INPUT_STREAM_ENDPOINT_COUNT];
|
||||||
}
|
}
|
||||||
KVMFRInputStatus;
|
KVMFRInputStatus;
|
||||||
|
|
||||||
@@ -144,7 +194,13 @@ static_assert(offsetof(KVMFRInputMessage, payload) == 16,
|
|||||||
"KVMFR input message header layout changed");
|
"KVMFR input message header layout changed");
|
||||||
static_assert(sizeof(KVMFRInputMessage) == 32,
|
static_assert(sizeof(KVMFRInputMessage) == 32,
|
||||||
"KVMFR input message layout changed");
|
"KVMFR input message layout changed");
|
||||||
static_assert(sizeof(KVMFRInputStatus) == 32,
|
static_assert(sizeof(KVMFRInputStreamEndpoint) == 48,
|
||||||
|
"KVMFR input stream endpoint layout changed");
|
||||||
|
static_assert(offsetof(KVMFRInputStatus, transports) == 32,
|
||||||
|
"KVMFR input status transport layout changed");
|
||||||
|
static_assert(offsetof(KVMFRInputStatus, streamEndpoint) == 64,
|
||||||
|
"KVMFR input stream discovery layout changed");
|
||||||
|
static_assert(sizeof(KVMFRInputStatus) == 448,
|
||||||
"KVMFR input status layout changed");
|
"KVMFR input status layout changed");
|
||||||
static_assert(sizeof(KVMFRInputMessage) <= 64,
|
static_assert(sizeof(KVMFRInputMessage) <= 64,
|
||||||
"KVMFR input message must fit in one LGMP control message");
|
"KVMFR input message must fit in one LGMP control message");
|
||||||
@@ -161,7 +217,13 @@ _Static_assert(offsetof(KVMFRInputMessage, payload) == 16,
|
|||||||
"KVMFR input message header layout changed");
|
"KVMFR input message header layout changed");
|
||||||
_Static_assert(sizeof(KVMFRInputMessage) == 32,
|
_Static_assert(sizeof(KVMFRInputMessage) == 32,
|
||||||
"KVMFR input message layout changed");
|
"KVMFR input message layout changed");
|
||||||
_Static_assert(sizeof(KVMFRInputStatus) == 32,
|
_Static_assert(sizeof(KVMFRInputStreamEndpoint) == 48,
|
||||||
|
"KVMFR input stream endpoint layout changed");
|
||||||
|
_Static_assert(offsetof(KVMFRInputStatus, transports) == 32,
|
||||||
|
"KVMFR input status transport layout changed");
|
||||||
|
_Static_assert(offsetof(KVMFRInputStatus, streamEndpoint) == 64,
|
||||||
|
"KVMFR input stream discovery layout changed");
|
||||||
|
_Static_assert(sizeof(KVMFRInputStatus) == 448,
|
||||||
"KVMFR input status layout changed");
|
"KVMFR input status layout changed");
|
||||||
_Static_assert(sizeof(KVMFRInputMessage) <= 64,
|
_Static_assert(sizeof(KVMFRInputMessage) <= 64,
|
||||||
"KVMFR input message must fit in one LGMP control message");
|
"KVMFR input message must fit in one LGMP control message");
|
||||||
|
|||||||
Reference in New Issue
Block a user