Skip to content

Commit

Permalink
Ignore screen size changes which don't change anything (neutrinolabs#203
Browse files Browse the repository at this point in the history
)

* Only reallocate shared memory if the size changes
Co-authored-by: Nexarian <[email protected]>
  • Loading branch information
matt335672 authored and metalefty committed Sep 6, 2022
1 parent 6a14034 commit 21d8048
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 27 deletions.
61 changes: 34 additions & 27 deletions module/rdpClientCon.c
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,37 @@ rdpClientConProcessMsgVersion(rdpPtr dev, rdpClientCon *clientCon,
return 0;
}

/**************************************************************************//**
* Allocate shared memory
*
* This memory is shared with the xup driver in xrdp which avoids a lot
* of unnecessary copying
*
* @param clientCon Client connection
* @param bytes Size of area to attach
*/
static void
rdpClientConAllocateSharedMemory(rdpClientCon *clientCon, int bytes)
{
if (clientCon->shmemptr != NULL && clientCon->shmem_bytes == bytes)
{
LLOGLN(0, ("rdpClientConAllocateSharedMemory: reusing shmemid %d",
clientCon->shmemid));
return;
}

if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
clientCon->shmem_bytes = bytes;
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConAllocateSharedMemory: shmemid %d shmemptr %p bytes %d",
clientCon->shmemid, clientCon->shmemptr,
clientCon->shmem_bytes));
}
/******************************************************************************/
/*
this from miScreenInit
Expand Down Expand Up @@ -727,17 +758,9 @@ rdpClientConProcessScreenSizeMsg(rdpPtr dev, rdpClientCon *clientCon,

clientCon->cap_stride_bytes = clientCon->rdp_width * clientCon->rdp_Bpp;

if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->rdp_width * clientCon->rdp_height *
clientCon->rdp_Bpp;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessScreenSizeMsg: shmemid %d shmemptr %p",
clientCon->shmemid, clientCon->shmemptr));
rdpClientConAllocateSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->rdp_width;

if (clientCon->shmRegion != 0)
Expand Down Expand Up @@ -868,17 +891,9 @@ rdpClientConProcessMsgClientInfo(rdpPtr dev, rdpClientCon *clientCon)
clientCon->cap_height = RDPALIGN(clientCon->rdp_height, 64);
LLOGLN(0, (" cap_width %d cap_height %d",
clientCon->cap_width, clientCon->cap_height));
if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->cap_width * clientCon->cap_height *
clientCon->rdp_Bpp;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessMsgClientInfo: shmemid %d shmemptr %p "
"bytes %d", clientCon->shmemid, clientCon->shmemptr, bytes));
rdpClientConAllocateSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->cap_width;
clientCon->cap_stride_bytes = clientCon->cap_width * 4;
shmemstatus = SHM_RFX_ACTIVE;
Expand All @@ -890,16 +905,8 @@ rdpClientConProcessMsgClientInfo(rdpPtr dev, rdpClientCon *clientCon)
clientCon->cap_height = clientCon->rdp_height;
LLOGLN(0, (" cap_width %d cap_height %d",
clientCon->cap_width, clientCon->cap_height));
if (clientCon->shmemptr != 0)
{
shmdt(clientCon->shmemptr);
}
bytes = clientCon->cap_width * clientCon->cap_height * 2;
clientCon->shmemid = shmget(IPC_PRIVATE, bytes, IPC_CREAT | 0777);
clientCon->shmemptr = shmat(clientCon->shmemid, 0, 0);
shmctl(clientCon->shmemid, IPC_RMID, NULL);
LLOGLN(0, ("rdpClientConProcessMsgClientInfo: shmemid %d shmemptr %p "
"bytes %d", clientCon->shmemid, clientCon->shmemptr, bytes));
rdpClientConAllocateSharedMemory(clientCon, bytes);
clientCon->shmem_lineBytes = clientCon->rdp_Bpp * clientCon->cap_width;
clientCon->cap_stride_bytes = clientCon->cap_width * 4;
shmemstatus = SHM_H264_ACTIVE;
Expand Down
1 change: 1 addition & 0 deletions module/rdpClientCon.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ struct _rdpClientCon

uint8_t *shmemptr;
int shmemid;
int shmem_bytes;
int shmem_lineBytes;
RegionPtr shmRegion;
int rect_id;
Expand Down

0 comments on commit 21d8048

Please sign in to comment.