Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Glamor support for hardware accel #151

Merged
merged 30 commits into from
Nov 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
52b8555
start work on glamor
jsorg71 Feb 3, 2018
7294a09
work on glamor, load module, setup dri3
jsorg71 Feb 3, 2018
f876b96
glamor: use gpu pixmap for screen
jsorg71 Feb 4, 2018
ff7f597
glamor: track xv put image screen changes
jsorg71 Mar 3, 2018
e8090b3
work on glamor
jsorg71 Mar 9, 2018
b6ff8e5
glamor: add conf file option for DRM device
jsorg71 Mar 18, 2018
f01f139
Merge remote-tracking branch 'upstream/devel' into glamor
jsorg71 May 7, 2018
f62c066
work on glamor
jsorg71 May 8, 2018
df2b48f
add --enable-glamor configure option
jsorg71 May 9, 2018
bd330b5
move dri2 and dri3 to own file
jsorg71 May 10, 2018
eda7d36
glamor: work on dri
jsorg71 May 11, 2018
a59a2f7
xorg.conf DRI3 option, check xorg version if glamor configured
jsorg71 May 15, 2018
ee4a9b6
add DRI2 config option
jsorg71 May 21, 2018
d35cef9
working on dri2
jsorg71 Jun 9, 2018
dd83bb0
Merge remote-tracking branch 'upstream/devel' into glamor
jsorg71 Oct 23, 2019
4f94609
glamor: add EGL files
jsorg71 Oct 23, 2019
42828cc
glamor: add rdpEglCaptureRfx
jsorg71 Oct 24, 2019
5b3db05
glamor: work on rdpEglCaptureRfx
jsorg71 Oct 25, 2019
4bfcca3
glamor: work on rdpEglCaptureRfx
jsorg71 Oct 25, 2019
95dab34
glamor: work on rdpEglCaptureRfx
jsorg71 Oct 25, 2019
45a4159
glamor: got rfx rbg to yuv working
jsorg71 Oct 27, 2019
bf62fed
glamor: add rdpEglRfxYuvToYuvlp
jsorg71 Oct 29, 2019
0254755
glamor: add crc shader
jsorg71 Oct 30, 2019
4d1674a
glamor: minor fixes and log
jsorg71 Oct 30, 2019
7c2e5e9
Makefile.am change
jsorg71 Oct 31, 2019
a2979fb
fix typo
jsorg71 Oct 31, 2019
4795933
glamor: add crc check for gpu calc
jsorg71 Oct 31, 2019
4c9341f
glamor: configure.ac fix
jsorg71 Oct 31, 2019
17a8543
make distcheck fix
jsorg71 Oct 31, 2019
a89df53
glamor: fix for non rfx clients when glamor is running
jsorg71 Nov 2, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ AX_GCC_FUNC_ATTRIBUTE([format])

PKG_CHECK_MODULES([XORG_SERVER], [xorg-server >= 0], [],
[AC_MSG_ERROR([please install xserver-xorg-dev, xorg-x11-server-sdk or xorg-x11-server-devel])])
if test "x${enable_glamor}" = "xyes"; then
PKG_CHECK_MODULES([XORG_SERVER_GLAMOR], [xorg-server >= 1.19.0])
fi

if test "x$XRDP_CFLAGS" = "x"; then
PKG_CHECK_MODULES([XRDP], [xrdp >= 0.9.0])
Expand Down Expand Up @@ -68,6 +71,11 @@ if test "x${with_simd}" != "xno"; then
fi
fi

AC_ARG_ENABLE(glamor, AS_HELP_STRING([--enable-glamor],
[Use glamor (default: no)]),
[], [enable_glamor=no])
AM_CONDITIONAL(WITH_GLAMOR, [test x$enable_glamor = xyes])

AM_CONDITIONAL(WITH_SIMD_AMD64, [test x$simd_arch = xx86_64])
AM_CONDITIONAL(WITH_SIMD_X86, [test x$simd_arch = xi386])

Expand Down
20 changes: 17 additions & 3 deletions module/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
EXTRA_DIST = common.asm nasm_lt.sh
EXTRA_FLAGS =
EXTRA_SOURCES =
EXTRA_HEADERS =
SUBDIRS =
ASMLIB =
EGLLIB =

if WITH_SIMD_AMD64
EXTRA_FLAGS += -DSIMD_USE_ACCEL=1
Expand All @@ -15,6 +18,13 @@ SUBDIRS += x86
ASMLIB += x86/libxorgxrdp-asm.la
endif

if WITH_GLAMOR
EXTRA_FLAGS += -DXORGXRDP_GLAMOR -DGLAMOR_FOR_XORG
EXTRA_SOURCES += rdpEgl.c
EXTRA_HEADERS += rdpEgl.h
EGLLIB += -lepoxy
endif

AM_CFLAGS = \
$(XORG_SERVER_CFLAGS) \
$(XRDP_CFLAGS) \
Expand Down Expand Up @@ -62,9 +72,12 @@ noinst_HEADERS = \
rdpSetSpans.h \
rdpSimd.h \
rdpTrapezoids.h \
rdpTriangles.h \
rdpCompositeRects.h \
rdpXv.h \
amd64/funcs_amd64.h \
x86/funcs_x86.h
x86/funcs_x86.h \
$(EXTRA_HEADERS)

libxorgxrdp_la_LTLIBRARIES = libxorgxrdp.la

Expand All @@ -79,6 +92,7 @@ rdpFillPolygon.c rdpPolyFillRect.c rdpPolyFillArc.c rdpPolyText8.c \
rdpPolyText16.c rdpImageText8.c rdpImageText16.c rdpImageGlyphBlt.c \
rdpPolyGlyphBlt.c rdpPushPixels.c rdpCursor.c rdpMain.c rdpRandR.c \
rdpMisc.c rdpReg.c rdpComposite.c rdpGlyphs.c rdpPixmap.c rdpInput.c \
rdpClientCon.c rdpCapture.c rdpTrapezoids.c rdpXv.c rdpSimd.c
rdpClientCon.c rdpCapture.c rdpTrapezoids.c rdpTriangles.c \
rdpCompositeRects.c rdpXv.c rdpSimd.c $(EXTRA_SOURCES)

libxorgxrdp_la_LIBADD = $(ASMLIB)
libxorgxrdp_la_LIBADD = $(ASMLIB) $(EGLLIB)
18 changes: 16 additions & 2 deletions module/rdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define XRDP_KEYB_NAME "XRDPKEYB"
#define XRDP_VERSION 1000

#define RDP_MAX_TILES 4096

#define COLOR8(r, g, b) \
((((r) >> 5) << 0) | (((g) >> 5) << 3) | (((b) >> 6) << 6))
#define COLOR15(r, g, b) \
Expand Down Expand Up @@ -201,7 +203,9 @@ struct _rdpCounts
CARD32 rdpCompositeCallCount;
CARD32 rdpCopyWindowCallCount; /* 22 */
CARD32 rdpTrapezoidsCallCount;
CARD32 callCount[64 - 23];
CARD32 rdpTrianglesCallCount;
CARD32 rdpCompositeRectsCallCount;
CARD32 callCount[64 - 25];
};

typedef int (*yuv_to_rgb32_proc)(const uint8_t *yuvs, int width, int height, int *rgbs);
Expand Down Expand Up @@ -242,6 +246,9 @@ struct _rdpRec
CompositeProcPtr Composite;
GlyphsProcPtr Glyphs;
TrapezoidsProcPtr Trapezoids;
CreateScreenResourcesProcPtr CreateScreenResources;
TrianglesProcPtr Triangles;
CompositeRectsProcPtr CompositeRects;

/* keyboard and mouse */
miPointerScreenFuncPtr pCursorFuncs;
Expand Down Expand Up @@ -308,7 +315,14 @@ struct _rdpRec
struct monitor_info minfo[16]; /* client monitor data */
int doMultimon;
int monitorCount;

/* glamor */
Bool glamor;
PixmapPtr screenSwPixmap;
void *xvPutImage;
/* dri */
int fd;
/* egl */
void *egl;
};
typedef struct _rdpRec rdpRec;
typedef struct _rdpRec * rdpPtr;
Expand Down
155 changes: 80 additions & 75 deletions module/rdpCapture.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,64 +45,15 @@ capture
#include "rdpMisc.h"
#include "rdpCapture.h"

#if defined(XORGXRDP_GLAMOR)
#include "rdpEgl.h"
#include <glamor.h>
#endif

#define LOG_LEVEL 1
#define LLOGLN(_level, _args) \
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)

#define RDP_MAX_TILES 4096

static const unsigned int g_crc_table[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};

#define CRC_START(in_crc) (in_crc) = 0xFFFFFFFF
#define CRC_PASS(in_pixel, in_crc) \
(in_crc) = g_crc_table[((in_crc) ^ (in_pixel)) & 0xff] ^ ((in_crc) >> 8)
#define CRC_END(in_crc) (in_crc) = ((in_crc) ^ 0xFFFFFFFF)

/******************************************************************************/
/* copy rects with no error checking */
static int
Expand Down Expand Up @@ -847,21 +798,6 @@ rdpCapture1(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,
return rv;
}

/******************************************************************************/
static int
rdpCaptureCrcMem(const uint8_t *in_mem, int in_num_bytes, int in_crc)
{
int index;

index = 0;
while (index < in_num_bytes)
{
CRC_PASS(in_mem[index], in_crc);
index++;
}
return in_crc;
}

/******************************************************************************/
static Bool
rdpCapture2(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,
Expand Down Expand Up @@ -926,7 +862,7 @@ rdpCapture2(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,

if (rcode != rgnOUT)
{
CRC_START(crc);
crc = crc_start();
if (rcode == rgnPART)
{
LLOGLN(10, ("rdpCapture2: rgnPART"));
Expand All @@ -935,9 +871,8 @@ rdpCapture2(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,
rdpRegionIntersect(&tile_reg, in_reg, &tile_reg);
rects = REGION_RECTS(&tile_reg);
num_rects = REGION_NUM_RECTS(&tile_reg);
crc = rdpCaptureCrcMem((uint8_t *) rects,
num_rects * sizeof(BoxRec),
crc);
crc = crc_process_data(crc, rects,
num_rects * sizeof(BoxRec));
rdpCopyBox_a8r8g8b8_to_yuvalp(x, y,
src, src_stride,
dst, dst_stride,
Expand All @@ -953,8 +888,8 @@ rdpCapture2(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,
&rect, 1);
}
crc_dst = dst + (y << 8) * (dst_stride >> 8) + (x << 8);
crc = rdpCaptureCrcMem(crc_dst, 64 * 64 * 4, crc);
CRC_END(crc);
crc = crc_process_data(crc, crc_dst, 64 * 64 * 4);
crc = crc_end(crc);
crc_offset = (y / 64) * crc_stride + (x / 64);
LLOGLN(10, ("rdpCapture2: crc 0x%8.8x 0x%8.8x",
crc, clientCon->rfx_crcs[crc_offset]));
Expand Down Expand Up @@ -1064,6 +999,65 @@ rdpCapture3(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,
return rv;
}

#if defined(XORGXRDP_GLAMOR)
/******************************************************************************/
static int
copy_vmem(rdpPtr dev, RegionPtr in_reg)
{
PixmapPtr hwPixmap;
PixmapPtr swPixmap;
BoxPtr pbox;
ScreenPtr pScreen;
GCPtr copyGC;
ChangeGCVal tmpval[1];
int count;
int index;
int left;
int top;
int width;
int height;

/* copy the dirty area from the screen hw pixmap to a sw pixmap
this should do a dma */
pScreen = dev->pScreen;
hwPixmap = pScreen->GetScreenPixmap(pScreen);
swPixmap = dev->screenSwPixmap;
copyGC = GetScratchGC(dev->depth, pScreen);
if (copyGC != NULL)
{
tmpval[0].val = GXcopy;
ChangeGC(NullClient, copyGC, GCFunction, tmpval);
ValidateGC(&(hwPixmap->drawable), copyGC);
count = REGION_NUM_RECTS(in_reg);
pbox = REGION_RECTS(in_reg);
for (index = 0; index < count; index++)
{
left = pbox[index].x1;
top = pbox[index].y1;
width = pbox[index].x2 - pbox[index].x1;
height = pbox[index].y2 - pbox[index].y1;
if ((width > 0) && (height > 0))
{
LLOGLN(10, ("copy_vmem: hwPixmap tex 0x%8.8x "
"swPixmap tex 0x%8.8x",
glamor_get_pixmap_texture(hwPixmap),
glamor_get_pixmap_texture(swPixmap)));
copyGC->ops->CopyArea(&(hwPixmap->drawable),
&(swPixmap->drawable),
copyGC, left, top,
width, height, left, top);
}
}
FreeScratchGC(copyGC);
}
else
{
return 1;
}
return 0;
}
#endif

/**
* Copy an array of rectangles from one memory area to another
*****************************************************************************/
Expand All @@ -1075,6 +1069,17 @@ rdpCapture(rdpClientCon *clientCon, RegionPtr in_reg, BoxPtr *out_rects,

LLOGLN(10, ("rdpCapture:"));
mode = clientCon->client_info.capture_code;
if (clientCon->dev->glamor)
{
#if defined(XORGXRDP_GLAMOR)
if (mode == 2)
{
return rdpEglCaptureRfx(clientCon, in_reg, out_rects,
num_out_rects, id);
}
copy_vmem(clientCon->dev, in_reg);
#endif
}
switch (mode)
{
case 0:
Expand Down
Loading