[host] all: pass back the desktop rotation to the client

This commit is contained in:
Geoffrey McRae 2021-01-18 13:53:29 +11:00
parent 842bb59955
commit f5587b6b6b
6 changed files with 104 additions and 31 deletions

View File

@ -38,6 +38,15 @@ typedef enum FrameType
} }
FrameType; FrameType;
typedef enum FrameRotation
{
FRAME_ROT_0,
FRAME_ROT_90,
FRAME_ROT_180,
FRAME_ROT_270
}
FrameRotation;
extern const char * FrameTypeStr[FRAME_TYPE_MAX]; extern const char * FrameTypeStr[FRAME_TYPE_MAX];
enum enum
@ -57,7 +66,7 @@ typedef enum CursorType
CursorType; CursorType;
#define KVMFR_MAGIC "KVMFR---" #define KVMFR_MAGIC "KVMFR---"
#define KVMFR_VERSION 6 #define KVMFR_VERSION 7
typedef struct KVMFR typedef struct KVMFR
{ {
@ -84,6 +93,7 @@ typedef struct KVMFRFrame
FrameType type; // the frame data type FrameType type; // the frame data type
uint32_t width; // the width uint32_t width; // the width
uint32_t height; // the height uint32_t height; // the height
FrameRotation rotation; // the frame rotation
uint32_t stride; // the row stride (zero if compressed data) uint32_t stride; // the row stride (zero if compressed data)
uint32_t pitch; // the row pitch (stride in bytes or the compressed frame size) uint32_t pitch; // the row pitch (stride in bytes or the compressed frame size)
uint32_t offset; // offset from the start of this header to the FrameBuffer header uint32_t offset; // offset from the start of this header to the FrameBuffer header

View File

@ -50,6 +50,15 @@ typedef enum CaptureFormat
} }
CaptureFormat; CaptureFormat;
typedef enum CaptureRotation
{
CAPTURE_ROT_0,
CAPTURE_ROT_90,
CAPTURE_ROT_180,
CAPTURE_ROT_270
}
CaptureRotation;
typedef struct CaptureFrame typedef struct CaptureFrame
{ {
unsigned int formatVer; unsigned int formatVer;
@ -58,6 +67,7 @@ typedef struct CaptureFrame
unsigned int pitch; unsigned int pitch;
unsigned int stride; unsigned int stride;
CaptureFormat format; CaptureFormat format;
CaptureRotation rotation;
} }
CaptureFrame; CaptureFrame;

View File

@ -208,6 +208,7 @@ static CaptureResult xcb_waitFrame(CaptureFrame * frame)
frame->pitch = this->width * 4; frame->pitch = this->width * 4;
frame->stride = this->width; frame->stride = this->width;
frame->format = CAPTURE_FMT_BGRA; frame->format = CAPTURE_FMT_BGRA;
frame->rotation = CAPTURE_ROT_0;
return CAPTURE_RESULT_OK; return CAPTURE_RESULT_OK;
} }

View File

@ -99,6 +99,7 @@ struct iface
unsigned int pitch; unsigned int pitch;
unsigned int stride; unsigned int stride;
CaptureFormat format; CaptureFormat format;
CaptureRotation rotation;
unsigned int dpi; unsigned int dpi;
int lastPointerX, lastPointerY; int lastPointerX, lastPointerY;
@ -371,8 +372,45 @@ static bool dxgi_init(void)
DXGI_ADAPTER_DESC1 adapterDesc; DXGI_ADAPTER_DESC1 adapterDesc;
IDXGIAdapter1_GetDesc1(this->adapter, &adapterDesc); IDXGIAdapter1_GetDesc1(this->adapter, &adapterDesc);
this->width = outputDesc.DesktopCoordinates.right - outputDesc.DesktopCoordinates.left;
this->height = outputDesc.DesktopCoordinates.bottom - outputDesc.DesktopCoordinates.top; switch(outputDesc.Rotation)
{
case DXGI_MODE_ROTATION_ROTATE90:
case DXGI_MODE_ROTATION_ROTATE270:
this->width = outputDesc.DesktopCoordinates.bottom -
outputDesc.DesktopCoordinates.top;
this->height = outputDesc.DesktopCoordinates.right -
outputDesc.DesktopCoordinates.left;
break;
default:
this->width = outputDesc.DesktopCoordinates.right -
outputDesc.DesktopCoordinates.left;
this->height = outputDesc.DesktopCoordinates.bottom -
outputDesc.DesktopCoordinates.top;
break;
}
switch(outputDesc.Rotation)
{
case DXGI_MODE_ROTATION_ROTATE90:
this->rotation = CAPTURE_ROT_90;
break;
case DXGI_MODE_ROTATION_ROTATE180:
this->rotation = CAPTURE_ROT_180;
break;
case DXGI_MODE_ROTATION_ROTATE270:
this->rotation = CAPTURE_ROT_270;
break;
default:
this->rotation = CAPTURE_ROT_0;
break;
}
this->dpi = monitor_dpi(outputDesc.Monitor); this->dpi = monitor_dpi(outputDesc.Monitor);
++this->formatVer; ++this->formatVer;
@ -928,6 +966,7 @@ static CaptureResult dxgi_waitFrame(CaptureFrame * frame)
frame->pitch = this->pitch; frame->pitch = this->pitch;
frame->stride = this->stride; frame->stride = this->stride;
frame->format = this->format; frame->format = this->format;
frame->rotation = this->rotation;
atomic_fetch_sub_explicit(&this->texReady, 1, memory_order_release); atomic_fetch_sub_explicit(&this->texReady, 1, memory_order_release);
return CAPTURE_RESULT_OK; return CAPTURE_RESULT_OK;

View File

@ -312,6 +312,7 @@ static CaptureResult nvfbc_waitFrame(CaptureFrame * frame)
frame->height = this->grabHeight; frame->height = this->grabHeight;
frame->pitch = this->grabStride * 4; frame->pitch = this->grabStride * 4;
frame->stride = this->grabStride; frame->stride = this->grabStride;
frame->rotation = CAPTURE_ROT_0;
#if 0 #if 0
//NvFBC never sets bIsHDR so instead we check for any data in the alpha channel //NvFBC never sets bIsHDR so instead we check for any data in the alpha channel

View File

@ -186,6 +186,18 @@ static int frameThread(void * opaque)
continue; continue;
} }
switch(frame.rotation)
{
case CAPTURE_ROT_0 : fi->rotation = FRAME_ROT_0 ; break;
case CAPTURE_ROT_90 : fi->rotation = FRAME_ROT_90 ; break;
case CAPTURE_ROT_180: fi->rotation = FRAME_ROT_180; break;
case CAPTURE_ROT_270: fi->rotation = FRAME_ROT_270; break;
default:
DEBUG_WARN("Unsupported frame rotation %d", frame.rotation);
fi->rotation = FRAME_ROT_0;
break;
}
fi->formatVer = frame.formatVer; fi->formatVer = frame.formatVer;
fi->width = frame.width; fi->width = frame.width;
fi->height = frame.height; fi->height = frame.height;