diff --git a/xorg/server/module/Makefile b/xorg/server/module/Makefile index 329322be..6de97c05 100644 --- a/xorg/server/module/Makefile +++ b/xorg/server/module/Makefile @@ -8,7 +8,7 @@ rdpCursor.o rdpMain.o rdpRandR.o rdpMisc.o rdpReg.o \ rdpComposite.o rdpGlyphs.o rdpPixmap.o rdpInput.o rdpClientCon.o rdpCapture.o \ rdpTrapezoids.o rdpXv.o -;OBJS += i420_to_rgb32_x86_sse2.o yv12_to_rgb32_x86_sse2.o yuy2_to_rgb32_x86_sse2.o uyvy_to_rgb32_x86_sse2.o +;OBJS += cpuid_x86.o i420_to_rgb32_x86_sse2.o yv12_to_rgb32_x86_sse2.o yuy2_to_rgb32_x86_sse2.o uyvy_to_rgb32_x86_sse2.o ;OBJS += i420_to_rgb32_amd64_sse2.o yv12_to_rgb32_amd64_sse2.o yuy2_to_rgb32_amd64_sse2.o uyvy_to_rgb32_amd64_sse2.o CFLAGS = -g -O2 -Wall -fPIC -I/usr/include/xorg -I/usr/include/pixman-1 \ @@ -26,6 +26,9 @@ libxorgxrdp.so: $(OBJS) Makefile clean: rm -f $(OBJS) libxorgxrdp.so +cpuid_x86.o: x86/cpuid_x86.asm + yasm -f elf32 -g dwarf2 x86/cpuid_x86.asm + i420_to_rgb32_x86_sse2.o: x86/i420_to_rgb32_x86_sse2.asm yasm -f elf32 -g dwarf2 x86/i420_to_rgb32_x86_sse2.asm diff --git a/xorg/server/module/rdpXv.c b/xorg/server/module/rdpXv.c index dc6d5418..be44542f 100644 --- a/xorg/server/module/rdpXv.c +++ b/xorg/server/module/rdpXv.c @@ -50,7 +50,9 @@ XVideo int g_xv_use_accel = 1; /* use simd, compile time, if zero, g_xv_use_accel does not matter */ +#if !defined(XV_USE_ACCEL) #define XV_USE_ACCEL 0 +#endif #define T_NUM_ENCODINGS 1 static XF86VideoEncodingRec g_xrdpVidEncodings[T_NUM_ENCODINGS] = @@ -611,6 +613,7 @@ xrdpVidQueryImageAttributes(ScrnInfoPtr pScrn, int id, return size; } +#if XV_USE_ACCEL #if defined(__x86_64__) || defined(__AMD64__) || defined (_M_AMD64) int yv12_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs); @@ -622,6 +625,8 @@ int uyvy_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs); #elif defined(__x86__) || defined(_M_IX86) || defined(__i386__) int +cpuid_x86(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx); +int yv12_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs); int i420_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs); @@ -630,6 +635,7 @@ yuy2_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs); int uyvy_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs); #endif +#endif /*****************************************************************************/ Bool @@ -695,11 +701,26 @@ rdpXvInit(ScreenPtr pScreen, ScrnInfoPtr pScrn) dev->uyvy_to_rgb32 = uyvy_to_rgb32_amd64_sse2; LLOGLN(0, ("rdpXvInit: sse amd64 yuv functions assigned")); #elif defined(__x86__) || defined(_M_IX86) || defined(__i386__) - dev->yv12_to_rgb32 = yv12_to_rgb32_x86_sse2; - dev->i420_to_rgb32 = i420_to_rgb32_x86_sse2; - dev->yuy2_to_rgb32 = yuy2_to_rgb32_x86_sse2; - dev->uyvy_to_rgb32 = uyvy_to_rgb32_x86_sse2; - LLOGLN(0, ("rdpXvInit: sse x86 yuv functions assigned")); + int ax, bx, cx, dx; + cpuid_x86(1, 0, &ax, &bx, &cx, &dx); + LLOGLN(0, ("rdpXvInit: cpuid eax 1 ecx 0 return eax 0x%8.8x ebx " + "0x%8.8x ecx 0x%8.8x edx 0x%8.8x", ax, bx, cx, dx)); + if (dx & (1 << 26)) /* SSE 2 */ + { + dev->yv12_to_rgb32 = yv12_to_rgb32_x86_sse2; + dev->i420_to_rgb32 = i420_to_rgb32_x86_sse2; + dev->yuy2_to_rgb32 = yuy2_to_rgb32_x86_sse2; + dev->uyvy_to_rgb32 = uyvy_to_rgb32_x86_sse2; + LLOGLN(0, ("rdpXvInit: sse x86 yuv functions assigned")); + } + else + { + dev->yv12_to_rgb32 = YV12_to_RGB32; + dev->i420_to_rgb32 = I420_to_RGB32; + dev->yuy2_to_rgb32 = YUY2_to_RGB32; + dev->uyvy_to_rgb32 = UYVY_to_RGB32; + LLOGLN(0, ("rdpXvInit: warning, c yuv functions assigned")); + } #else dev->yv12_to_rgb32 = YV12_to_RGB32; dev->i420_to_rgb32 = I420_to_RGB32; diff --git a/xorg/server/module/x86/cpuid_x86.asm b/xorg/server/module/x86/cpuid_x86.asm new file mode 100644 index 00000000..45b81b09 --- /dev/null +++ b/xorg/server/module/x86/cpuid_x86.asm @@ -0,0 +1,33 @@ + +SECTION .text + +%macro PROC 1 + align 16 + global %1 + %1: +%endmacro + +;int +;cpuid_x86(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx) + +PROC cpuid_x86 + ; save registers + push ebx + push ecx + push edx + ; cpuid + mov eax, [esp + 16] + mov ecx, [esp + 20] + cpuid + mov [esp + 24], eax + mov [esp + 28], ebx + mov [esp + 32], ecx + mov [esp + 36], edx + mov eax, 0 + ; restore registers + pop edx + pop ecx + pop ebx + ret; + align 16 +