Merge branch 'master'
This commit is contained in:
commit
15a81b6325
56
GL/glx/glxbyteorder.h
Normal file
56
GL/glx/glxbyteorder.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* (C) Copyright IBM Corporation 2006, 2007
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sub license,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, THE AUTHORS, AND/OR THEIR SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file glxbyteorder.h
|
||||
* Platform glue for handling byte-ordering issues in GLX protocol.
|
||||
*
|
||||
* \author Ian Romanick <idr@us.ibm.com>
|
||||
*/
|
||||
#if !defined(__GLXBYTEORDER_H__)
|
||||
#define __GLXBYTEORDER_H__
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_BYTESWAP_H
|
||||
#include <byteswap.h>
|
||||
#elif defined(USE_SYS_ENDIAN_H)
|
||||
#include <sys/endian.h>
|
||||
#else
|
||||
#define bswap_16(value) \
|
||||
((((value) & 0xff) << 8) | ((value) >> 8))
|
||||
|
||||
#define bswap_32(value) \
|
||||
(((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
|
||||
(uint32_t)bswap_16((uint16_t)((value) >> 16)))
|
||||
|
||||
#define bswap_64(value) \
|
||||
(((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
|
||||
<< 32) | \
|
||||
(uint64_t)bswap_32((uint32_t)((value) >> 32)))
|
||||
#endif
|
||||
|
||||
#endif /* !defined(__GLXBYTEORDER_H__) */
|
|
@ -864,6 +864,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
|||
int api_ver = COPY_SUB_BUFFER_INTERNAL_VERSION;
|
||||
drm_magic_t magic;
|
||||
drmVersionPtr version;
|
||||
int newlyopened;
|
||||
char *driverName;
|
||||
drm_handle_t hFB;
|
||||
int junk;
|
||||
|
@ -914,10 +915,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
|||
goto handle_error;
|
||||
}
|
||||
|
||||
fd = drmOpen(NULL, BusID);
|
||||
fd = drmOpenOnce(NULL, BusID, &newlyopened);
|
||||
|
||||
if (fd < 0) {
|
||||
LogMessage(X_ERROR, "AIGLX error: drmOpen failed (%s)\n",
|
||||
LogMessage(X_ERROR, "AIGLX error: drmOpenOnce failed (%s)\n",
|
||||
strerror(-fd));
|
||||
goto handle_error;
|
||||
}
|
||||
|
@ -940,7 +941,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
|||
drm_version.patch = -1;
|
||||
}
|
||||
|
||||
if (!DRIAuthConnection(pScreen, magic)) {
|
||||
if (newlyopened && !DRIAuthConnection(pScreen, magic)) {
|
||||
LogMessage(X_ERROR, "AIGLX error: DRIAuthConnection failed\n");
|
||||
goto handle_error;
|
||||
}
|
||||
|
@ -1082,7 +1083,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
|||
xfree(dev_priv);
|
||||
|
||||
if (fd >= 0)
|
||||
drmClose(fd);
|
||||
drmCloseOnce(fd);
|
||||
|
||||
DRICloseConnection(pScreen);
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "indirect_size_get.h"
|
||||
#include "indirect_dispatch.h"
|
||||
#include "glxserver.h"
|
||||
#include "glxbyteorder.h"
|
||||
#include "indirect_util.h"
|
||||
#include "singlesize.h"
|
||||
#include "glapitable.h"
|
||||
|
|
|
@ -28,24 +28,12 @@
|
|||
#include <X11/Xmd.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glxproto.h>
|
||||
#if defined(__linux__) || defined (__GLIBC__) || defined(__GNU__)
|
||||
#include <byteswap.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 __swap16
|
||||
#define bswap_32 __swap32
|
||||
#define bswap_64 __swap64
|
||||
#else
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif
|
||||
#include <inttypes.h>
|
||||
#include "indirect_size.h"
|
||||
#include "indirect_size_get.h"
|
||||
#include "indirect_dispatch.h"
|
||||
#include "glxserver.h"
|
||||
#include "glxbyteorder.h"
|
||||
#include "indirect_util.h"
|
||||
#include "singlesize.h"
|
||||
#include "glapitable.h"
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#endif
|
||||
|
||||
#include "glxserver.h"
|
||||
#include "glxbyteorder.h"
|
||||
#include "glxext.h"
|
||||
#include "singlesize.h"
|
||||
#include "unpack.h"
|
||||
|
@ -46,20 +47,6 @@
|
|||
#include "dispatch.h"
|
||||
#include "glapioffsets.h"
|
||||
|
||||
#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
|
||||
#include <byteswap.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 __swap16
|
||||
#define bswap_32 __swap32
|
||||
#define bswap_64 __swap64
|
||||
#else
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif
|
||||
|
||||
static int DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte *pc,
|
||||
unsigned get_programiv_offset, unsigned get_program_string_offset,
|
||||
Bool do_swap);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -83,14 +83,15 @@ extern PURE HIDDEN int __glXConvolutionParameterivReqSize(const GLbyte *pc, Bool
|
|||
extern PURE HIDDEN int __glXSeparableFilter2DReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXTexImage3DReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXTexSubImage3DReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage1DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage2DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage3DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage1DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage2DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage3DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramStringARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXDrawBuffersARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXPointParameterfvEXTReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage3DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage2DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexImage1DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage3DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage2DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXCompressedTexSubImage1DARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXLoadProgramNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramParameters4dvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramParameters4fvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
|
@ -109,11 +110,10 @@ extern PURE HIDDEN int __glXVertexAttribs4fvNVReqSize(const GLbyte *pc, Bool swa
|
|||
extern PURE HIDDEN int __glXVertexAttribs4svNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXVertexAttribs4ubvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXPointParameterivNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramStringARBReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramNamedParameter4fvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramNamedParameter4dvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXDeleteRenderbuffersEXTReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXProgramNamedParameter4fvNVReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXDeleteFramebuffersEXTReqSize(const GLbyte *pc, Bool swap);
|
||||
extern PURE HIDDEN int __glXDeleteRenderbuffersEXTReqSize(const GLbyte *pc, Bool swap);
|
||||
|
||||
# undef HIDDEN
|
||||
# undef PURE
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#endif
|
||||
|
||||
#include "glxserver.h"
|
||||
#include "glxbyteorder.h"
|
||||
#include "glxext.h"
|
||||
#include "singlesize.h"
|
||||
#include "unpack.h"
|
||||
|
@ -39,20 +40,6 @@
|
|||
#include "glthread.h"
|
||||
#include "dispatch.h"
|
||||
|
||||
#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
|
||||
#include <byteswap.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 __swap16
|
||||
#define bswap_32 __swap32
|
||||
#define bswap_64 __swap64
|
||||
#else
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif
|
||||
|
||||
int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *pc)
|
||||
{
|
||||
xGLXSingleReq * const req = (xGLXSingleReq *) pc;
|
||||
|
|
|
@ -23,29 +23,21 @@
|
|||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <X11/Xmd.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glxproto.h>
|
||||
#if defined(__linux__) || defined (__GLIBC__) || defined(__GNU__)
|
||||
#include <byteswap.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 __swap16
|
||||
#define bswap_32 __swap32
|
||||
#define bswap_64 __swap64
|
||||
#else
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif
|
||||
#include <inttypes.h>
|
||||
#include "indirect_size.h"
|
||||
#include "indirect_size_get.h"
|
||||
#include "indirect_dispatch.h"
|
||||
#include "glxserver.h"
|
||||
#include "glxbyteorder.h"
|
||||
#include "singlesize.h"
|
||||
#include "glapitable.h"
|
||||
#include "glapi.h"
|
||||
|
|
|
@ -39,20 +39,7 @@
|
|||
#include "glthread.h"
|
||||
#include "dispatch.h"
|
||||
#include "glapioffsets.h"
|
||||
|
||||
#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
|
||||
#include <byteswap.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 __swap16
|
||||
#define bswap_32 __swap32
|
||||
#define bswap_64 __swap64
|
||||
#else
|
||||
#include <sys/endian.h>
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif
|
||||
#include "glxbyteorder.h"
|
||||
|
||||
static int DoSwapInterval(__GLXclientState *cl, GLbyte *pc, int do_swap);
|
||||
|
||||
|
|
|
@ -78,6 +78,7 @@ typedef struct __GLXMESAdrawable __GLXMESAdrawable;
|
|||
struct __GLXMESAscreen {
|
||||
__GLXscreen base;
|
||||
int index;
|
||||
int num_vis;
|
||||
XMesaVisual *xm_vis;
|
||||
};
|
||||
|
||||
|
@ -280,7 +281,7 @@ __glXMesaScreenDestroy(__GLXscreen *screen)
|
|||
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < screen->numVisuals; i++) {
|
||||
for (i = 0; i < mesaScreen->num_vis; i++) {
|
||||
if (mesaScreen->xm_vis[i])
|
||||
XMesaDestroyVisual(mesaScreen->xm_vis[i]);
|
||||
}
|
||||
|
@ -389,6 +390,7 @@ static void init_screen_visuals(__GLXMESAscreen *screen)
|
|||
|
||||
xfree(used);
|
||||
|
||||
screen->num_vis = pScreen->numVisuals;
|
||||
screen->xm_vis = pXMesaVisual;
|
||||
}
|
||||
|
||||
|
|
|
@ -946,10 +946,10 @@ SecurityAuditResourceIDAccess(
|
|||
* rtype is its type or class.
|
||||
* access_mode represents the intended use of the resource; see
|
||||
* resource.h.
|
||||
* rval is a pointer to the resource structure for this resource.
|
||||
* res is a pointer to the resource structure for this resource.
|
||||
*
|
||||
* Returns:
|
||||
* If access is granted, the value of rval that was passed in, else NULL.
|
||||
* If access is granted, the value of rval that was passed in, else FALSE.
|
||||
*
|
||||
* Side Effects:
|
||||
* Disallowed resource accesses are audited.
|
||||
|
|
|
@ -32,10 +32,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <X11/X.h>
|
||||
#include <X11/Xmd.h>
|
||||
#include "servermd.h"
|
||||
#if defined(XFREE86) || ( defined(__OpenBSD__) && defined(__alpha__) ) \
|
||||
|| (defined(__bsdi__))
|
||||
#include "compiler.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ==========================================================================
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#define DBUS_API_SUBJECT_TO_CHANGE
|
||||
#include <dbus/dbus.h>
|
||||
#include <string.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
#include <X11/X.h>
|
||||
|
||||
|
|
92
configure.ac
92
configure.ac
|
@ -99,6 +99,64 @@ fi
|
|||
|
||||
AC_TYPE_PID_T
|
||||
|
||||
# Checks for headers/macros for byte swapping
|
||||
# Known variants:
|
||||
# <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc)
|
||||
# <sys/endian.h> __swap16, __swap32, __swap64 (OpenBSD)
|
||||
# <sys/endian.h> bswap16, bswap32, bswap64 (other BSD's)
|
||||
# and a fallback to local macros if none of the above are found
|
||||
|
||||
# if <byteswap.h> is found, assume it's the correct version
|
||||
AC_CHECK_HEADERS([byteswap.h])
|
||||
|
||||
# if <sys/endian.h> is found, have to check which version
|
||||
AC_CHECK_HEADER([sys/endian.h], [HAVE_SYS_ENDIAN_H="yes"], [HAVE_SYS_ENDIAN_H="no"])
|
||||
|
||||
if test "x$HAVE_SYS_ENDIAN_H" = "xyes" ; then
|
||||
AC_MSG_CHECKING([for __swap16 variant of <sys/endian.h> byteswapping macros])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||
#include <sys/endian.h>
|
||||
], [
|
||||
int a = 1, b;
|
||||
b = __swap16(a);
|
||||
])
|
||||
], [SYS_ENDIAN__SWAP='yes'], [SYS_ENDIAN__SWAP='no'])
|
||||
AC_MSG_RESULT([$SYS_ENDIAN__SWAP])
|
||||
|
||||
AC_MSG_CHECKING([for bswap_16 variant of <sys/endian.h> byteswapping macros])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||
#include <sys/endian.h>
|
||||
], [
|
||||
int a = 1, b;
|
||||
b = bswap_16(a);
|
||||
])
|
||||
], [SYS_ENDIAN_BSWAP='yes'], [SYS_ENDIAN_BSWAP='no'])
|
||||
AC_MSG_RESULT([$SYS_ENDIAN_BSWAP])
|
||||
|
||||
if test "$SYS_ENDIAN_BSWAP" = "yes" ; then
|
||||
USE_SYS_ENDIAN_H=yes
|
||||
BSWAP=bswap_
|
||||
else
|
||||
if test "$SYS_ENDIAN__SWAP" = "yes" ; then
|
||||
USE_SYS_ENDIAN_H=yes
|
||||
BSWAP=__swap
|
||||
else
|
||||
USE_SYS_ENDIAN_H=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$USE_SYS_ENDIAN_H" = "yes" ; then
|
||||
AC_DEFINE([USE_SYS_ENDIAN_H], 1,
|
||||
[Define to use byteswap macros from <sys/endian.h>])
|
||||
AC_DEFINE_UNQUOTED([bswap_16], ${BSWAP}16,
|
||||
[Define to 16-bit byteswap macro])
|
||||
AC_DEFINE_UNQUOTED([bswap_32], ${BSWAP}32,
|
||||
[Define to 32-bit byteswap macro])
|
||||
AC_DEFINE_UNQUOTED([bswap_64], ${BSWAP}64,
|
||||
[Define to 64-bit byteswap macro])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_FUNC_VPRINTF
|
||||
AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
|
||||
|
@ -295,6 +353,9 @@ case $host_os in
|
|||
DRI=yes
|
||||
KDRIVE_HW=yes
|
||||
;;
|
||||
*solaris*)
|
||||
PKG_CHECK_EXISTS(libdrm, DRI=yes, DRI=no)
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL(KDRIVE_HW, test "x$KDRIVE_HW" = xyes)
|
||||
|
||||
|
@ -305,6 +366,8 @@ if test "x$use_x86_asm" = xyes && test "x$GCC" = xyes ; then
|
|||
#error Not supported
|
||||
#endif
|
||||
], mmx_capable=yes, mmx_capable=no)
|
||||
else
|
||||
mmx_capable=no
|
||||
fi
|
||||
AC_MSG_RESULT([$mmx_capable])
|
||||
AM_CONDITIONAL(MMX_CAPABLE, [test "x$mmx_capable" = xyes])
|
||||
|
@ -335,11 +398,11 @@ AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],
|
|||
AC_ARG_WITH(int10, AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: vm86, x86emu or stub]),
|
||||
[INT10="$withval"],
|
||||
[INT10="$DEFAULT_INT10"])
|
||||
AC_ARG_WITH(vendor-name, AS_HELP_STRING([--with-vendor-string=VENDOR],
|
||||
AC_ARG_WITH(vendor-name, AS_HELP_STRING([--with-vendor-name=VENDOR],
|
||||
[Vendor string reported by the server]),
|
||||
[ VENDOR_STRING="$withval" ],
|
||||
[ VENDOR_STRING="$DEFAULT_VENDOR_NAME" ])
|
||||
AC_ARG_WITH(vendor-name-short, AS_HELP_STRING([--with-vendor-string-short=VENDOR],
|
||||
AC_ARG_WITH(vendor-name-short, AS_HELP_STRING([--with-vendor-name-short=VENDOR],
|
||||
[Short version of vendor string reported by the server]),
|
||||
[ VENDOR_STRING_SHORT="$withval" ],
|
||||
[ VENDOR_STRING_SHORT="$DEFAULT_VENDOR_NAME_SHORT" ])
|
||||
|
@ -544,7 +607,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
|
|||
XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
|
||||
|
||||
dnl Core modules for most extensions, et al.
|
||||
REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]"
|
||||
REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]"
|
||||
REQUIRED_LIBS="xfont xau fontenc"
|
||||
|
||||
if test "x$DBUS" = xauto; then
|
||||
|
@ -615,7 +678,7 @@ fi
|
|||
|
||||
if test "x$GLX" = xyes && ! test "x$MESA_SOURCE" = x; then
|
||||
PKG_CHECK_MODULES([XLIB], [x11])
|
||||
PKG_CHECK_MODULES([GL], [glproto >= 1.4.7])
|
||||
PKG_CHECK_MODULES([GL], [glproto >= 1.4.8])
|
||||
AC_SUBST(XLIB_CFLAGS)
|
||||
AC_DEFINE(GLXEXT, 1, [Build GLX extension])
|
||||
GLX_LIBS='$(top_builddir)/GL/glx/libglx.la $(top_builddir)/GL/mesa/libGLcore.la'
|
||||
|
@ -1693,20 +1756,13 @@ AC_SUBST(XKB_COMPILED_DIR)
|
|||
dnl and the rest of these are generic, so they're in config.h
|
||||
AC_DEFINE(XResExtension, 1, [Build XRes extension])
|
||||
|
||||
dnl CYGWIN does not define fd_set if _POSIX_SOURCE is defined
|
||||
dnl _*_SOURCE on Solaris restricts to the standards, and removes non-standard
|
||||
dnl functions which X uses
|
||||
case $host_os in
|
||||
cygwin*) ;;
|
||||
solaris*) ;;
|
||||
darwin*) ;;
|
||||
freebsd*|netbsd*|openbsd*) ;;
|
||||
*)
|
||||
AC_DEFINE(_POSIX_SOURCE, 1, [POSIX-compliant source])
|
||||
AC_DEFINE(_XOPEN_SOURCE, 500, [X/Open-compliant source])
|
||||
AC_DEFINE(_BSD_SOURCE, 1, [BSD-compliant source])
|
||||
;;
|
||||
esac
|
||||
AC_TRY_COMPILE([
|
||||
#include <features.h>
|
||||
#ifndef __GLIBC__
|
||||
#error not glibc
|
||||
#endif
|
||||
], [], [AC_DEFINE(_GNU_SOURCE, 1,
|
||||
[ Enable GNU and other extensions to the C environment for glibc])])
|
||||
|
||||
AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix])
|
||||
|
||||
|
|
|
@ -279,10 +279,35 @@ ProcDamageSubtract (ClientPtr client)
|
|||
return (client->noClientException);
|
||||
}
|
||||
|
||||
static int
|
||||
ProcDamageAdd (ClientPtr client)
|
||||
{
|
||||
REQUEST(xDamageAddReq);
|
||||
DrawablePtr pDrawable;
|
||||
RegionPtr pRegion;
|
||||
int rc;
|
||||
|
||||
REQUEST_SIZE_MATCH(xDamageAddReq);
|
||||
VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
|
||||
rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
|
||||
DixReadAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
/* The region is relative to the drawable origin, so translate it out to
|
||||
* screen coordinates like damage expects.
|
||||
*/
|
||||
REGION_TRANSLATE(pScreen, pRegion, pDrawable->x, pDrawable->y);
|
||||
DamageDamageRegion(pDrawable, pRegion);
|
||||
REGION_TRANSLATE(pScreen, pRegion, -pDrawable->x, -pDrawable->y);
|
||||
|
||||
return (client->noClientException);
|
||||
}
|
||||
|
||||
/* Major version controls available requests */
|
||||
static const int version_requests[] = {
|
||||
X_DamageQueryVersion, /* before client sends QueryVersion */
|
||||
X_DamageSubtract, /* Version 1 */
|
||||
X_DamageAdd, /* Version 1 */
|
||||
};
|
||||
|
||||
#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
|
||||
|
@ -293,6 +318,8 @@ int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
|
|||
ProcDamageCreate,
|
||||
ProcDamageDestroy,
|
||||
ProcDamageSubtract,
|
||||
/*************** Version 1.1 ****************/
|
||||
ProcDamageAdd,
|
||||
};
|
||||
|
||||
|
||||
|
@ -361,12 +388,27 @@ SProcDamageSubtract (ClientPtr client)
|
|||
return (*ProcDamageVector[stuff->damageReqType]) (client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcDamageAdd (ClientPtr client)
|
||||
{
|
||||
register int n;
|
||||
REQUEST(xDamageAddReq);
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xDamageSubtractReq);
|
||||
swapl (&stuff->drawable, n);
|
||||
swapl (&stuff->region, n);
|
||||
return (*ProcDamageVector[stuff->damageReqType]) (client);
|
||||
}
|
||||
|
||||
int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
|
||||
/*************** Version 1 ******************/
|
||||
SProcDamageQueryVersion,
|
||||
SProcDamageCreate,
|
||||
SProcDamageDestroy,
|
||||
SProcDamageSubtract,
|
||||
/*************** Version 1.1 ****************/
|
||||
SProcDamageAdd,
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
34
dbe/dbe.c
34
dbe/dbe.c
|
@ -39,6 +39,11 @@
|
|||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#if HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#elif !defined(UINT32_MAX)
|
||||
#define UINT32_MAX 0xffffffffU
|
||||
#endif
|
||||
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
|
@ -711,11 +716,14 @@ ProcDbeSwapBuffers(ClientPtr client)
|
|||
return(Success);
|
||||
}
|
||||
|
||||
if (nStuff > UINT32_MAX / sizeof(DbeSwapInfoRec))
|
||||
return BadAlloc;
|
||||
|
||||
/* Get to the swap info appended to the end of the request. */
|
||||
dbeSwapInfo = (xDbeSwapInfo *)&stuff[1];
|
||||
|
||||
/* Allocate array to record swap information. */
|
||||
swapInfo = (DbeSwapInfoPtr)ALLOCATE_LOCAL(nStuff * sizeof(DbeSwapInfoRec));
|
||||
swapInfo = (DbeSwapInfoPtr)Xalloc(nStuff * sizeof(DbeSwapInfoRec));
|
||||
if (swapInfo == NULL)
|
||||
{
|
||||
return(BadAlloc);
|
||||
|
@ -730,14 +738,14 @@ ProcDbeSwapBuffers(ClientPtr client)
|
|||
error = dixLookupWindow(&pWin, dbeSwapInfo[i].window, client,
|
||||
DixWriteAccess);
|
||||
if (error != Success) {
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Each window must be double-buffered - BadMatch. */
|
||||
if (DBE_WINDOW_PRIV(pWin) == NULL)
|
||||
{
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return(BadMatch);
|
||||
}
|
||||
|
||||
|
@ -746,7 +754,7 @@ ProcDbeSwapBuffers(ClientPtr client)
|
|||
{
|
||||
if (dbeSwapInfo[i].window == dbeSwapInfo[j].window)
|
||||
{
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return(BadMatch);
|
||||
}
|
||||
}
|
||||
|
@ -757,7 +765,7 @@ ProcDbeSwapBuffers(ClientPtr client)
|
|||
(dbeSwapInfo[i].swapAction != XdbeUntouched ) &&
|
||||
(dbeSwapInfo[i].swapAction != XdbeCopied ))
|
||||
{
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return(BadValue);
|
||||
}
|
||||
|
||||
|
@ -787,12 +795,12 @@ ProcDbeSwapBuffers(ClientPtr client)
|
|||
error = (*pDbeScreenPriv->SwapBuffers)(client, &nStuff, swapInfo);
|
||||
if (error != Success)
|
||||
{
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return(error);
|
||||
}
|
||||
}
|
||||
|
||||
DEALLOCATE_LOCAL(swapInfo);
|
||||
Xfree(swapInfo);
|
||||
return(Success);
|
||||
|
||||
} /* ProcDbeSwapBuffers() */
|
||||
|
@ -874,10 +882,12 @@ ProcDbeGetVisualInfo(ClientPtr client)
|
|||
|
||||
REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq);
|
||||
|
||||
if (stuff->n > UINT32_MAX / sizeof(DrawablePtr))
|
||||
return BadAlloc;
|
||||
/* Make sure any specified drawables are valid. */
|
||||
if (stuff->n != 0)
|
||||
{
|
||||
if (!(pDrawables = (DrawablePtr *)ALLOCATE_LOCAL(stuff->n *
|
||||
if (!(pDrawables = (DrawablePtr *)Xalloc(stuff->n *
|
||||
sizeof(DrawablePtr))))
|
||||
{
|
||||
return(BadAlloc);
|
||||
|
@ -890,7 +900,7 @@ ProcDbeGetVisualInfo(ClientPtr client)
|
|||
rc = dixLookupDrawable(pDrawables+i, drawables[i], client, 0,
|
||||
DixReadAccess);
|
||||
if (rc != Success) {
|
||||
DEALLOCATE_LOCAL(pDrawables);
|
||||
Xfree(pDrawables);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
@ -902,7 +912,7 @@ ProcDbeGetVisualInfo(ClientPtr client)
|
|||
{
|
||||
if (pDrawables)
|
||||
{
|
||||
DEALLOCATE_LOCAL(pDrawables);
|
||||
Xfree(pDrawables);
|
||||
}
|
||||
|
||||
return(BadAlloc);
|
||||
|
@ -929,7 +939,7 @@ ProcDbeGetVisualInfo(ClientPtr client)
|
|||
/* Free pDrawables if we needed to allocate it above. */
|
||||
if (pDrawables)
|
||||
{
|
||||
DEALLOCATE_LOCAL(pDrawables);
|
||||
Xfree(pDrawables);
|
||||
}
|
||||
|
||||
return(BadAlloc);
|
||||
|
@ -1010,7 +1020,7 @@ ProcDbeGetVisualInfo(ClientPtr client)
|
|||
|
||||
if (pDrawables)
|
||||
{
|
||||
DEALLOCATE_LOCAL(pDrawables);
|
||||
Xfree(pDrawables);
|
||||
}
|
||||
|
||||
return(client->noClientException);
|
||||
|
|
|
@ -3752,6 +3752,8 @@ InitClientPrivates(ClientPtr client)
|
|||
client->devPrivates = ppriv;
|
||||
sizes = clientPrivateSizes;
|
||||
ptr = (char *)(ppriv + clientPrivateLen);
|
||||
if (ppriv)
|
||||
bzero(ppriv, totalClientSize - sizeof(ClientRec));
|
||||
for (i = clientPrivateLen; --i >= 0; ppriv++, sizes++)
|
||||
{
|
||||
if ( (size = *sizes) )
|
||||
|
|
|
@ -219,7 +219,7 @@ dixLookupDrawable(DrawablePtr *pDraw, XID id, ClientPtr client,
|
|||
pTmp = client->lastDrawable;
|
||||
|
||||
/* an access check is required for cached drawables */
|
||||
rtype = (pTmp->type | M_WINDOW) ? RT_WINDOW : RT_PIXMAP;
|
||||
rtype = (type & M_WINDOW) ? RT_WINDOW : RT_PIXMAP;
|
||||
if (!XaceHook(XACE_RESOURCE_ACCESS, client, id, rtype, access, pTmp))
|
||||
return BadDrawable;
|
||||
} else
|
||||
|
@ -227,10 +227,10 @@ dixLookupDrawable(DrawablePtr *pDraw, XID id, ClientPtr client,
|
|||
access);
|
||||
if (!pTmp)
|
||||
return BadDrawable;
|
||||
if (!((1 << pTmp->type) | (type ? type : M_DRAWABLE)))
|
||||
if (!((1 << pTmp->type) & (type ? type : M_DRAWABLE)))
|
||||
return BadMatch;
|
||||
|
||||
if (pTmp->type | M_DRAWABLE) {
|
||||
if (type & M_DRAWABLE) {
|
||||
client->lastDrawable = pTmp;
|
||||
client->lastDrawableID = id;
|
||||
client->lastGCID = INVALID;
|
||||
|
|
|
@ -549,11 +549,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
|
|||
y = valuators[1 - first_valuator];
|
||||
}
|
||||
else {
|
||||
<<<<<<< HEAD/dix/getevents.c
|
||||
y = pointer->valuator->lasty;
|
||||
=======
|
||||
y = pointer->valuator->lasty;
|
||||
>>>>>>> ca5ebe3971d8ebcfed00c5ebcd026cdd0ce0c6ba/dix/getevents.c
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -100,11 +100,6 @@ specifies a file which contains a collection of authorization records used
|
|||
to authenticate access. See also the \fIxdm\fP(1) and
|
||||
\fIXsecurity\fP(__miscmansuffix__) manual pages.
|
||||
.TP 8
|
||||
.B bc
|
||||
disables certain kinds of error checking, for bug compatibility with
|
||||
previous releases (e.g., to work around bugs in R2 and R3 xterms and toolkits).
|
||||
Deprecated.
|
||||
.TP 8
|
||||
.B \-bs
|
||||
disables backing store support on all screens.
|
||||
.TP 8
|
||||
|
@ -266,6 +261,10 @@ required by the X protocol, which allows the server to exceed the
|
|||
client's backing store expectations but does not provide a way to tell
|
||||
the client that it is doing so.
|
||||
.TP 8
|
||||
.B \-wr
|
||||
sets the default root window to solid white instead of the standard root weave
|
||||
pattern.
|
||||
.TP 8
|
||||
.B \-x \fIextension\fP
|
||||
loads the specified extension at init.
|
||||
This is a no-op for most implementations.
|
||||
|
@ -398,20 +397,14 @@ base directory for keyboard layout files. This option is not available
|
|||
for setuid X servers (i.e., when the X server's real and effective uids
|
||||
are different).
|
||||
.TP 8
|
||||
.B \-ar1 \fImilliseconds\fP
|
||||
.B \-ardelay \fImilliseconds\fP
|
||||
sets the autorepeat delay (length of time in milliseconds that a key must
|
||||
be depressed before autorepeat starts).
|
||||
.TP 8
|
||||
.B \-ar2 \fImilliseconds\fP
|
||||
.B \-arinterval \fImilliseconds\fP
|
||||
sets the autorepeat interval (length of time in milliseconds that should
|
||||
elapse between autorepeat-generated keystrokes).
|
||||
.TP 8
|
||||
.B \-noloadxkb
|
||||
disables loading of an XKB keymap description on server startup.
|
||||
.TP 8
|
||||
.B \-xkbdb \fIfilename\fP
|
||||
uses \fIfilename\fP for default keyboard keymaps.
|
||||
.TP 8
|
||||
.B \-xkbmap \fIfilename\fP
|
||||
loads keyboard description in \fIfilename\fP on server startup.
|
||||
.SH SECURITY EXTENSION OPTIONS
|
||||
|
|
141
exa/exa.c
141
exa/exa.c
|
@ -32,6 +32,10 @@
|
|||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifdef MITSHM
|
||||
#include "shmint.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "exa_priv.h"
|
||||
|
@ -117,18 +121,78 @@ exaGetDrawablePixmap(DrawablePtr pDrawable)
|
|||
return (PixmapPtr) pDrawable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the offsets to add to coordinates to make them address the same bits in
|
||||
* the backing drawable. These coordinates are nonzero only for redirected
|
||||
* windows.
|
||||
*/
|
||||
static void
|
||||
exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
|
||||
int *xp, int *yp)
|
||||
{
|
||||
#ifdef COMPOSITE
|
||||
if (pDrawable->type == DRAWABLE_WINDOW) {
|
||||
*xp = -pPixmap->screen_x;
|
||||
*yp = -pPixmap->screen_y;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
*xp = 0;
|
||||
*yp = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* exaPixmapDirty() marks a pixmap as dirty, allowing for
|
||||
* optimizations in pixmap migration when no changes have occurred.
|
||||
*/
|
||||
void
|
||||
exaPixmapDirty (PixmapPtr pPix, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
ExaPixmapPriv(pPix);
|
||||
BoxRec box;
|
||||
RegionPtr pDamageReg;
|
||||
RegionRec region;
|
||||
|
||||
if (!pExaPixmap)
|
||||
return;
|
||||
|
||||
box.x1 = max(x1, 0);
|
||||
box.y1 = max(y1, 0);
|
||||
box.x2 = min(x2, pPix->drawable.width);
|
||||
box.y2 = min(y2, pPix->drawable.height);
|
||||
|
||||
if (box.x1 >= box.x2 || box.y1 >= box.y2)
|
||||
return;
|
||||
|
||||
pDamageReg = DamageRegion(pExaPixmap->pDamage);
|
||||
|
||||
REGION_INIT(pScreen, ®ion, &box, 1);
|
||||
REGION_UNION(pScreen, pDamageReg, pDamageReg, ®ion);
|
||||
REGION_UNINIT(pScreen, ®ion);
|
||||
}
|
||||
|
||||
/**
|
||||
* exaDrawableDirty() marks a pixmap backing a drawable as dirty, allowing for
|
||||
* optimizations in pixmap migration when no changes have occurred.
|
||||
*/
|
||||
void
|
||||
exaDrawableDirty (DrawablePtr pDrawable)
|
||||
exaDrawableDirty (DrawablePtr pDrawable, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
ExaPixmapPrivPtr pExaPixmap;
|
||||
PixmapPtr pPix = exaGetDrawablePixmap(pDrawable);
|
||||
int xoff, yoff;
|
||||
|
||||
pExaPixmap = ExaGetPixmapPriv(exaGetDrawablePixmap (pDrawable));
|
||||
if (pExaPixmap != NULL)
|
||||
pExaPixmap->dirty = TRUE;
|
||||
x1 = max(x1, pDrawable->x);
|
||||
y1 = max(y1, pDrawable->y);
|
||||
x2 = min(x2, pDrawable->x + pDrawable->width);
|
||||
y2 = min(y2, pDrawable->y + pDrawable->height);
|
||||
|
||||
if (x1 >= x2 || y1 >= y2)
|
||||
return;
|
||||
|
||||
exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
|
||||
|
||||
exaPixmapDirty(pPix, x1 + xoff, y1 + yoff, x2 + xoff, y2 + yoff);
|
||||
}
|
||||
|
||||
static Bool
|
||||
|
@ -149,6 +213,7 @@ exaDestroyPixmap (PixmapPtr pPixmap)
|
|||
pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr;
|
||||
pPixmap->devKind = pExaPixmap->sys_pitch;
|
||||
}
|
||||
REGION_UNINIT(pPixmap->drawable.pScreen, &pExaPixmap->validReg);
|
||||
}
|
||||
return fbDestroyPixmap (pPixmap);
|
||||
}
|
||||
|
@ -216,7 +281,20 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
pExaPixmap->dirty = FALSE;
|
||||
/* Set up damage tracking */
|
||||
pExaPixmap->pDamage = DamageCreate (NULL, NULL, DamageReportNone, TRUE,
|
||||
pScreen, pPixmap);
|
||||
|
||||
if (pExaPixmap->pDamage == NULL) {
|
||||
fbDestroyPixmap (pPixmap);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DamageRegister (&pPixmap->drawable, pExaPixmap->pDamage);
|
||||
DamageSetReportAfterOp (pExaPixmap->pDamage, TRUE);
|
||||
|
||||
/* None of the pixmap bits are valid initially */
|
||||
REGION_NULL(pScreen, &pExaPixmap->validReg);
|
||||
|
||||
return pPixmap;
|
||||
}
|
||||
|
@ -261,32 +339,14 @@ exaDrawableIsOffscreen (DrawablePtr pDrawable)
|
|||
/**
|
||||
* Returns the pixmap which backs a drawable, and the offsets to add to
|
||||
* coordinates to make them address the same bits in the backing drawable.
|
||||
* These coordinates are nonzero only for redirected windows.
|
||||
*/
|
||||
PixmapPtr
|
||||
exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp)
|
||||
{
|
||||
PixmapPtr pPixmap;
|
||||
int x, y;
|
||||
PixmapPtr pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
exaGetDrawableDeltas (pDrawable, pPixmap, xp, yp);
|
||||
|
||||
if (pDrawable->type == DRAWABLE_WINDOW) {
|
||||
pPixmap = (*pDrawable->pScreen->GetWindowPixmap) ((WindowPtr) pDrawable);
|
||||
#ifdef COMPOSITE
|
||||
x = -pPixmap->screen_x;
|
||||
y = -pPixmap->screen_y;
|
||||
#else
|
||||
x = 0;
|
||||
y = 0;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
pPixmap = (PixmapPtr) pDrawable;
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
*xp = x;
|
||||
*yp = y;
|
||||
if (exaPixmapIsOffscreen (pPixmap))
|
||||
return pPixmap;
|
||||
else
|
||||
|
@ -334,8 +394,7 @@ exaPrepareAccess(DrawablePtr pDrawable, int index)
|
|||
/**
|
||||
* exaFinishAccess() is EXA's wrapper for the driver's FinishAccess() handler.
|
||||
*
|
||||
* It deals with marking drawables as dirty, and calling the driver's
|
||||
* FinishAccess() only if necessary.
|
||||
* It deals with calling the driver's FinishAccess() only if necessary.
|
||||
*/
|
||||
void
|
||||
exaFinishAccess(DrawablePtr pDrawable, int index)
|
||||
|
@ -345,9 +404,6 @@ exaFinishAccess(DrawablePtr pDrawable, int index)
|
|||
PixmapPtr pPixmap;
|
||||
ExaPixmapPrivPtr pExaPixmap;
|
||||
|
||||
if (index == EXA_PREPARE_DEST)
|
||||
exaDrawableDirty (pDrawable);
|
||||
|
||||
pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
pExaPixmap = ExaGetPixmapPriv(pPixmap);
|
||||
|
@ -373,7 +429,7 @@ exaFinishAccess(DrawablePtr pDrawable, int index)
|
|||
* accelerated or may sync the card and fall back to fb.
|
||||
*/
|
||||
static void
|
||||
exaValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
|
||||
exaValidateGC (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
|
||||
{
|
||||
/* fbValidateGC will do direct access to pixmaps if the tiling has changed.
|
||||
* Preempt fbValidateGC by doing its work and masking the change out, so
|
||||
|
@ -404,6 +460,7 @@ exaValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
|
|||
exaPrepareAccess(&pOldTile->drawable, EXA_PREPARE_SRC);
|
||||
pNewTile = fb24_32ReformatTile (pOldTile,
|
||||
pDrawable->bitsPerPixel);
|
||||
exaPixmapDirty(pNewTile, 0, 0, pNewTile->drawable.width, pNewTile->drawable.height);
|
||||
exaFinishAccess(&pOldTile->drawable, EXA_PREPARE_SRC);
|
||||
}
|
||||
if (pNewTile)
|
||||
|
@ -419,9 +476,14 @@ exaValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
|
|||
if (!pGC->tileIsPixel && FbEvenTile (pGC->tile.pixmap->drawable.width *
|
||||
pDrawable->bitsPerPixel))
|
||||
{
|
||||
exaPrepareAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
|
||||
/* XXX This fixes corruption with tiled pixmaps, but may just be a
|
||||
* workaround for broken drivers
|
||||
*/
|
||||
exaMoveOutPixmap(pGC->tile.pixmap);
|
||||
fbPadPixmap (pGC->tile.pixmap);
|
||||
exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
|
||||
exaPixmapDirty(pGC->tile.pixmap, 0, 0,
|
||||
pGC->tile.pixmap->drawable.width,
|
||||
pGC->tile.pixmap->drawable.height);
|
||||
}
|
||||
/* Mask out the GCTile change notification, now that we've done FB's
|
||||
* job for it.
|
||||
|
@ -560,7 +622,7 @@ exaDriverInit (ScreenPtr pScreen,
|
|||
|
||||
pScreen->devPrivates[exaScreenPrivateIndex].ptr = (pointer) pExaScr;
|
||||
|
||||
pExaScr->migration = ExaMigrationSmart;
|
||||
pExaScr->migration = ExaMigrationAlways;
|
||||
|
||||
exaDDXDriverInit(pScreen);
|
||||
|
||||
|
@ -610,6 +672,13 @@ exaDriverInit (ScreenPtr pScreen,
|
|||
miDisableCompositeWrapper(pScreen);
|
||||
#endif
|
||||
|
||||
#ifdef MITSHM
|
||||
/* Re-register with the MI funcs, which don't allow shared pixmaps.
|
||||
* Shared pixmaps are almost always a performance loss for us, but this
|
||||
* still allows for SHM PutImage.
|
||||
*/
|
||||
ShmRegisterFuncs(pScreen, NULL);
|
||||
#endif
|
||||
/*
|
||||
* Hookup offscreen pixmaps
|
||||
*/
|
||||
|
|
12
exa/exa.h
12
exa/exa.h
|
@ -39,7 +39,7 @@
|
|||
#include "fb.h"
|
||||
|
||||
#define EXA_VERSION_MAJOR 2
|
||||
#define EXA_VERSION_MINOR 0
|
||||
#define EXA_VERSION_MINOR 1
|
||||
#define EXA_VERSION_RELEASE 0
|
||||
|
||||
typedef struct _ExaOffscreenArea ExaOffscreenArea;
|
||||
|
@ -73,8 +73,8 @@ struct _ExaOffscreenArea {
|
|||
typedef struct _ExaDriver {
|
||||
/**
|
||||
* exa_major and exa_minor should be set by the driver to the version of
|
||||
* EXA which the driver was compiled for (or configures itself at runtime to
|
||||
* support). This allows EXA to extend the structure for new features
|
||||
* EXA which the driver was compiled for (or configures itself at runtime
|
||||
* to support). This allows EXA to extend the structure for new features
|
||||
* without breaking ABI for drivers compiled against older versions.
|
||||
*/
|
||||
int exa_major, exa_minor;
|
||||
|
@ -716,6 +716,12 @@ exaGetPixmapSize(PixmapPtr pPix);
|
|||
void
|
||||
exaEnableDisableFBAccess (int index, Bool enable);
|
||||
|
||||
void
|
||||
exaMoveInPixmap (PixmapPtr pPixmap);
|
||||
|
||||
void
|
||||
exaMoveOutPixmap (PixmapPtr pPixmap);
|
||||
|
||||
/**
|
||||
* Returns TRUE if the given planemask covers all the significant bits in the
|
||||
* pixel values for pDrawable.
|
||||
|
|
159
exa/exa_accel.c
159
exa/exa_accel.c
|
@ -20,6 +20,11 @@
|
|||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Eric Anholt <eric@anholt.net>
|
||||
* Michel Dänzer <michel@tungstengraphics.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
|
@ -49,12 +54,12 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
|
||||
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
if (pExaScr->swappedOut ||
|
||||
pGC->fillStyle != FillSolid ||
|
||||
pDrawable->width > pExaScr->info->maxX ||
|
||||
pDrawable->height > pExaScr->info->maxY)
|
||||
pPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pPixmap->drawable.height > pExaScr->info->maxY)
|
||||
{
|
||||
exaDoMigration (pixmaps, 1, FALSE);
|
||||
ExaCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted);
|
||||
|
@ -104,6 +109,8 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
(*pExaScr->info->Solid) (pPixmap,
|
||||
fullX1 + off_x, fullY1 + off_y,
|
||||
fullX2 + off_x, fullY1 + 1 + off_y);
|
||||
exaPixmapDirty (pPixmap, fullX1 + off_x, fullY1 + off_y,
|
||||
fullX2 + off_x, fullY1 + 1 + off_y);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -118,17 +125,19 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
partX2 = pbox->x2;
|
||||
if (partX2 > fullX2)
|
||||
partX2 = fullX2;
|
||||
if (partX2 > partX1)
|
||||
if (partX2 > partX1) {
|
||||
(*pExaScr->info->Solid) (pPixmap,
|
||||
partX1 + off_x, fullY1 + off_y,
|
||||
partX2 + off_x, fullY1 + 1 + off_y);
|
||||
exaPixmapDirty (pPixmap, partX1 + off_x, fullY1 + off_y,
|
||||
partX2 + off_x, fullY1 + 1 + off_y);
|
||||
}
|
||||
}
|
||||
pbox++;
|
||||
}
|
||||
}
|
||||
}
|
||||
(*pExaScr->info->DoneSolid) (pPixmap);
|
||||
exaDrawableDirty (pDrawable);
|
||||
exaMarkSync(pScreen);
|
||||
}
|
||||
|
||||
|
@ -222,8 +231,8 @@ exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
|
|||
|
||||
exaFinishAccess(pDrawable, EXA_PREPARE_DEST);
|
||||
}
|
||||
exaPixmapDirty(pPix, x1 + xoff, y1 + yoff, x2 + xoff, y2 + yoff);
|
||||
}
|
||||
exaDrawableDirty(pDrawable);
|
||||
|
||||
return;
|
||||
|
||||
|
@ -351,11 +360,12 @@ exaCopyNtoNTwoDir (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
|
|||
dst_off_y + pbox->y1 + i,
|
||||
pbox->x2 - pbox->x1, 1);
|
||||
}
|
||||
exaPixmapDirty(pDstPixmap, dst_off_x + pbox->x1, dst_off_y + pbox->y1,
|
||||
dst_off_x + pbox->x2, dst_off_y + pbox->y2);
|
||||
}
|
||||
if (dirsetup != 0)
|
||||
pExaScr->info->DoneCopy(pDstPixmap);
|
||||
exaMarkSync(pDstDrawable->pScreen);
|
||||
exaDrawableDirty(pDstDrawable);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -380,19 +390,19 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
|
|||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDstDrawable);
|
||||
pixmaps[0].pPix = pDstPixmap = exaGetDrawablePixmap (pDstDrawable);
|
||||
pixmaps[1].as_dst = FALSE;
|
||||
pixmaps[1].as_src = TRUE;
|
||||
pixmaps[1].pPix = exaGetDrawablePixmap (pSrcDrawable);
|
||||
pixmaps[1].pPix = pSrcPixmap = exaGetDrawablePixmap (pSrcDrawable);
|
||||
|
||||
/* Respect maxX/maxY in a trivial way: don't set up drawing when we might
|
||||
* violate the limits. The proper solution would be a temporary pixmap
|
||||
* adjusted so that the drawing happened within limits.
|
||||
*/
|
||||
if (pSrcDrawable->width > pExaScr->info->maxX ||
|
||||
pSrcDrawable->height > pExaScr->info->maxY ||
|
||||
pDstDrawable->width > pExaScr->info->maxX ||
|
||||
pDstDrawable->height > pExaScr->info->maxY)
|
||||
if (pSrcPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pSrcPixmap->drawable.height > pExaScr->info->maxY ||
|
||||
pDstPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pDstPixmap->drawable.height > pExaScr->info->maxY)
|
||||
{
|
||||
exaDoMigration (pixmaps, 2, FALSE);
|
||||
goto fallback;
|
||||
|
@ -401,7 +411,8 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
|
|||
}
|
||||
|
||||
/* Mixed directions must be handled specially if the card is lame */
|
||||
if (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS && (dx*dy) < 0) {
|
||||
if (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS &&
|
||||
reverse != upsidedown) {
|
||||
if (!exaCopyNtoNTwoDir(pSrcDrawable, pDstDrawable, pGC, pbox, nbox,
|
||||
dx, dy))
|
||||
goto fallback;
|
||||
|
@ -411,7 +422,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
|
|||
if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) &&
|
||||
(pDstPixmap = exaGetOffscreenPixmap (pDstDrawable, &dst_off_x, &dst_off_y)) &&
|
||||
(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap,
|
||||
dx, dy,
|
||||
reverse ? -1 : 1, upsidedown ? -1 : 1,
|
||||
pGC ? pGC->alu : GXcopy,
|
||||
pGC ? pGC->planemask : FB_ALLONES))
|
||||
{
|
||||
|
@ -423,11 +434,13 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
|
|||
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||
pbox->x2 - pbox->x1,
|
||||
pbox->y2 - pbox->y1);
|
||||
exaPixmapDirty (pDstPixmap,
|
||||
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
|
||||
pbox++;
|
||||
}
|
||||
(*pExaScr->info->DoneCopy) (pDstPixmap);
|
||||
exaMarkSync(pDstDrawable->pScreen);
|
||||
exaDrawableDirty (pDstDrawable);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -442,6 +455,11 @@ fallback:
|
|||
bitplane, closure);
|
||||
exaFinishAccess (pSrcDrawable, EXA_PREPARE_SRC);
|
||||
exaFinishAccess (pDstDrawable, EXA_PREPARE_DEST);
|
||||
while (nbox--)
|
||||
{
|
||||
exaDrawableDirty (pDstDrawable, pbox->x1, pbox->y1, pbox->x2, pbox->y2);
|
||||
pbox++;
|
||||
}
|
||||
}
|
||||
|
||||
RegionPtr
|
||||
|
@ -621,12 +639,12 @@ exaPolyFillRect(DrawablePtr pDrawable,
|
|||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
|
||||
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
if (pExaScr->swappedOut ||
|
||||
pGC->fillStyle != FillSolid ||
|
||||
pDrawable->width > pExaScr->info->maxX ||
|
||||
pDrawable->height > pExaScr->info->maxY)
|
||||
pPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pPixmap->drawable.height > pExaScr->info->maxY)
|
||||
{
|
||||
exaDoMigration (pixmaps, 1, FALSE);
|
||||
ExaCheckPolyFillRect (pDrawable, pGC, nrect, prect);
|
||||
|
@ -681,6 +699,8 @@ exaPolyFillRect(DrawablePtr pDrawable,
|
|||
(*pExaScr->info->Solid) (pPixmap,
|
||||
fullX1 + xoff, fullY1 + yoff,
|
||||
fullX2 + xoff, fullY2 + yoff);
|
||||
exaPixmapDirty (pPixmap, fullX1 + xoff, fullY1 + yoff,
|
||||
fullX2 + xoff, fullY2 + yoff);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -706,15 +726,17 @@ exaPolyFillRect(DrawablePtr pDrawable,
|
|||
|
||||
pbox++;
|
||||
|
||||
if (partX1 < partX2 && partY1 < partY2)
|
||||
if (partX1 < partX2 && partY1 < partY2) {
|
||||
(*pExaScr->info->Solid) (pPixmap,
|
||||
partX1 + xoff, partY1 + yoff,
|
||||
partX2 + xoff, partY2 + yoff);
|
||||
exaPixmapDirty (pPixmap, partX1 + xoff, partY1 + yoff,
|
||||
partX2 + xoff, partY2 + yoff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
(*pExaScr->info->DoneSolid) (pPixmap);
|
||||
exaDrawableDirty (pDrawable);
|
||||
exaMarkSync(pDrawable->pScreen);
|
||||
}
|
||||
|
||||
|
@ -735,14 +757,15 @@ exaSolidBoxClipped (DrawablePtr pDrawable,
|
|||
int xoff, yoff;
|
||||
int partX1, partX2, partY1, partY2;
|
||||
ExaMigrationRec pixmaps[1];
|
||||
Bool fallback = FALSE;
|
||||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
if (pExaScr->swappedOut ||
|
||||
pDrawable->width > pExaScr->info->maxX ||
|
||||
pDrawable->height > pExaScr->info->maxY)
|
||||
pPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pPixmap->drawable.height > pExaScr->info->maxY)
|
||||
{
|
||||
exaDoMigration (pixmaps, 1, FALSE);
|
||||
goto fallback;
|
||||
|
@ -750,19 +773,21 @@ exaSolidBoxClipped (DrawablePtr pDrawable,
|
|||
exaDoMigration (pixmaps, 1, TRUE);
|
||||
}
|
||||
|
||||
if (!(pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff)) ||
|
||||
pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff);
|
||||
|
||||
if (!pPixmap ||
|
||||
!(*pExaScr->info->PrepareSolid) (pPixmap, GXcopy, pm, fg))
|
||||
{
|
||||
fallback:
|
||||
EXA_FALLBACK(("to %p (%c)\n", pDrawable,
|
||||
exaDrawableLocation(pDrawable)));
|
||||
fallback = TRUE;
|
||||
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
fg = fbReplicatePixel (fg, pDrawable->bitsPerPixel);
|
||||
fbSolidBoxClipped (pDrawable, pClip, x1, y1, x2, y2,
|
||||
fbAnd (GXcopy, fg, pm),
|
||||
fbXor (GXcopy, fg, pm));
|
||||
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
return;
|
||||
}
|
||||
for (nbox = REGION_NUM_RECTS(pClip), pbox = REGION_RECTS(pClip);
|
||||
nbox--;
|
||||
|
@ -790,12 +815,20 @@ fallback:
|
|||
if (partY2 <= partY1)
|
||||
continue;
|
||||
|
||||
(*pExaScr->info->Solid) (pPixmap,
|
||||
partX1 + xoff, partY1 + yoff,
|
||||
partX2 + xoff, partY2 + yoff);
|
||||
if (!fallback) {
|
||||
(*pExaScr->info->Solid) (pPixmap,
|
||||
partX1 + xoff, partY1 + yoff,
|
||||
partX2 + xoff, partY2 + yoff);
|
||||
exaPixmapDirty (pPixmap, partX1 + xoff, partY1 + yoff,
|
||||
partX2 + xoff, partY2 + yoff);
|
||||
} else
|
||||
exaDrawableDirty (pDrawable, partX1, partY1, partX2, partY2);
|
||||
}
|
||||
|
||||
if (fallback)
|
||||
return;
|
||||
|
||||
(*pExaScr->info->DoneSolid) (pPixmap);
|
||||
exaDrawableDirty (pDrawable);
|
||||
exaMarkSync(pDrawable->pScreen);
|
||||
}
|
||||
|
||||
|
@ -908,12 +941,17 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
|
|||
pPriv->fg,
|
||||
gx + dstXoff,
|
||||
gHeight);
|
||||
exaDrawableDirty (pDrawable, gx, gy, gx + gWidth, gy + gHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
RegionPtr pClip = fbGetCompositeClip(pGC);
|
||||
int nbox;
|
||||
BoxPtr pbox;
|
||||
|
||||
gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
|
||||
fbPutXYImage (pDrawable,
|
||||
fbGetCompositeClip(pGC),
|
||||
pClip,
|
||||
pPriv->fg,
|
||||
pPriv->bg,
|
||||
pPriv->pm,
|
||||
|
@ -927,6 +965,18 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
|
|||
(FbStip *) pglyph,
|
||||
gStride,
|
||||
0);
|
||||
|
||||
for (nbox = REGION_NUM_RECTS(pClip), pbox = REGION_RECTS(pClip);
|
||||
nbox--; pbox++) {
|
||||
int x1 = max(gx, pbox->x1), x2 = min(gx + gWidth, pbox->x2);
|
||||
int y1 = max(gy, pbox->y1), y2 = min(gy + gHeight, pbox->y2);
|
||||
|
||||
if (x1 >= x2 || y1 >= y2)
|
||||
continue;
|
||||
|
||||
exaDrawableDirty (pDrawable, gx, gy, gx + gWidth,
|
||||
gy + gHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
x += pci->metrics.characterWidth;
|
||||
|
@ -994,13 +1044,15 @@ exaFillRegionSolid (DrawablePtr pDrawable,
|
|||
PixmapPtr pPixmap;
|
||||
int xoff, yoff;
|
||||
ExaMigrationRec pixmaps[1];
|
||||
int nbox = REGION_NUM_RECTS (pRegion);
|
||||
BoxPtr pBox = REGION_RECTS (pRegion);
|
||||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
|
||||
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
|
||||
if (pDrawable->width > pExaScr->info->maxX ||
|
||||
pDrawable->height > pExaScr->info->maxY)
|
||||
if (pPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pPixmap->drawable.height > pExaScr->info->maxY)
|
||||
{
|
||||
exaDoMigration (pixmaps, 1, FALSE);
|
||||
goto fallback;
|
||||
|
@ -1011,19 +1063,17 @@ exaFillRegionSolid (DrawablePtr pDrawable,
|
|||
if ((pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff)) &&
|
||||
(*pExaScr->info->PrepareSolid) (pPixmap, GXcopy, FB_ALLONES, pixel))
|
||||
{
|
||||
int nbox = REGION_NUM_RECTS (pRegion);
|
||||
BoxPtr pBox = REGION_RECTS (pRegion);
|
||||
|
||||
while (nbox--)
|
||||
{
|
||||
(*pExaScr->info->Solid) (pPixmap,
|
||||
pBox->x1 + xoff, pBox->y1 + yoff,
|
||||
pBox->x2 + xoff, pBox->y2 + yoff);
|
||||
exaPixmapDirty (pPixmap, pBox->x1 + xoff, pBox->y1 + yoff,
|
||||
pBox->x2 + xoff, pBox->y2 + yoff);
|
||||
pBox++;
|
||||
}
|
||||
(*pExaScr->info->DoneSolid) (pPixmap);
|
||||
exaMarkSync(pDrawable->pScreen);
|
||||
exaDrawableDirty (pDrawable);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1034,6 +1084,11 @@ fallback:
|
|||
fbFillRegionSolid (pDrawable, pRegion, 0,
|
||||
fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
|
||||
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
while (nbox--)
|
||||
{
|
||||
exaDrawableDirty (pDrawable, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
|
||||
pBox++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1047,9 +1102,11 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
|||
{
|
||||
ExaScreenPriv(pDrawable->pScreen);
|
||||
PixmapPtr pPixmap;
|
||||
int xoff, yoff;
|
||||
int xoff, yoff, tileXoff, tileYoff;
|
||||
int tileWidth, tileHeight;
|
||||
ExaMigrationRec pixmaps[2];
|
||||
int nbox = REGION_NUM_RECTS (pRegion);
|
||||
BoxPtr pBox = REGION_RECTS (pRegion);
|
||||
|
||||
tileWidth = pTile->drawable.width;
|
||||
tileHeight = pTile->drawable.height;
|
||||
|
@ -1064,13 +1121,13 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
|||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
|
||||
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
|
||||
pixmaps[1].as_dst = FALSE;
|
||||
pixmaps[1].as_src = TRUE;
|
||||
pixmaps[1].pPix = pTile;
|
||||
|
||||
if (pDrawable->width > pExaScr->info->maxX ||
|
||||
pDrawable->height > pExaScr->info->maxY ||
|
||||
if (pPixmap->drawable.width > pExaScr->info->maxX ||
|
||||
pPixmap->drawable.height > pExaScr->info->maxY ||
|
||||
tileWidth > pExaScr->info->maxX ||
|
||||
tileHeight > pExaScr->info->maxY)
|
||||
{
|
||||
|
@ -1081,18 +1138,16 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
|||
}
|
||||
|
||||
pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff);
|
||||
|
||||
if (!pPixmap)
|
||||
goto fallback;
|
||||
|
||||
if (!exaPixmapIsOffscreen(pTile))
|
||||
goto fallback;
|
||||
|
||||
if ((*pExaScr->info->PrepareCopy) (pTile, pPixmap, 0, 0, GXcopy,
|
||||
if ((*pExaScr->info->PrepareCopy) (exaGetOffscreenPixmap((DrawablePtr)pTile, &tileXoff, &tileYoff), pPixmap, 0, 0, GXcopy,
|
||||
FB_ALLONES))
|
||||
{
|
||||
int nbox = REGION_NUM_RECTS (pRegion);
|
||||
BoxPtr pBox = REGION_RECTS (pRegion);
|
||||
|
||||
while (nbox--)
|
||||
{
|
||||
int height = pBox->y2 - pBox->y1;
|
||||
|
@ -1118,7 +1173,7 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
|||
width -= w;
|
||||
|
||||
(*pExaScr->info->Copy) (pPixmap,
|
||||
tileX, tileY,
|
||||
tileX + tileXoff, tileY + tileYoff,
|
||||
dstX + xoff, dstY + yoff,
|
||||
w, h);
|
||||
dstX += w;
|
||||
|
@ -1127,11 +1182,12 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
|||
dstY += h;
|
||||
tileY = 0;
|
||||
}
|
||||
exaPixmapDirty (pPixmap, pBox->x1 + xoff, pBox->y1 + yoff,
|
||||
pBox->x2 + xoff, pBox->y2 + yoff);
|
||||
pBox++;
|
||||
}
|
||||
(*pExaScr->info->DoneCopy) (pPixmap);
|
||||
exaMarkSync(pDrawable->pScreen);
|
||||
exaDrawableDirty (pDrawable);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1144,6 +1200,11 @@ fallback:
|
|||
fbFillRegionTiled (pDrawable, pRegion, pTile);
|
||||
exaFinishAccess ((DrawablePtr)pTile, EXA_PREPARE_SRC);
|
||||
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
while (nbox--)
|
||||
{
|
||||
exaDrawableDirty (pDrawable, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
|
||||
pBox++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
*
|
||||
* Authors:
|
||||
* Eric Anholt <eric@anholt.net>
|
||||
* Michel Dänzer <michel@tungstengraphics.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -57,6 +58,27 @@ exaPixmapIsPinned (PixmapPtr pPix)
|
|||
return pExaPixmap == NULL || pExaPixmap->score == EXA_PIXMAP_SCORE_PINNED;
|
||||
}
|
||||
|
||||
/**
|
||||
* The fallback path for UTS/DFS failing is to just memcpy. exaCopyDirtyToSys
|
||||
* and exaCopyDirtyToFb both needed to do this loop.
|
||||
*/
|
||||
static void
|
||||
exaMemcpyBox (PixmapPtr pPixmap, BoxPtr pbox, CARD8 *src, int src_pitch,
|
||||
CARD8 *dst, int dst_pitch)
|
||||
{
|
||||
int i, cpp = pPixmap->drawable.bitsPerPixel / 8;
|
||||
int bytes = (pbox->x2 - pbox->x1) * cpp;
|
||||
|
||||
src += pbox->y1 * src_pitch + pbox->x1 * cpp;
|
||||
dst += pbox->y1 * dst_pitch + pbox->x1 * cpp;
|
||||
|
||||
for (i = pbox->y2 - pbox->y1; i; i--) {
|
||||
memcpy (dst, src, bytes);
|
||||
src += src_pitch;
|
||||
dst += dst_pitch;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the pixmap is dirty (has been modified in its current
|
||||
* location compared to the other), or lacks a private for tracking
|
||||
|
@ -67,7 +89,8 @@ exaPixmapIsDirty (PixmapPtr pPix)
|
|||
{
|
||||
ExaPixmapPriv (pPix);
|
||||
|
||||
return pExaPixmap == NULL || pExaPixmap->dirty == TRUE;
|
||||
return pExaPixmap == NULL ||
|
||||
REGION_NOTEMPTY (pScreen, DamageRegion(pExaPixmap->pDamage));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -98,54 +121,62 @@ exaCopyDirtyToSys (PixmapPtr pPixmap)
|
|||
{
|
||||
ExaScreenPriv (pPixmap->drawable.pScreen);
|
||||
ExaPixmapPriv (pPixmap);
|
||||
RegionPtr pRegion = DamageRegion (pExaPixmap->pDamage);
|
||||
CARD8 *save_ptr;
|
||||
int save_pitch;
|
||||
|
||||
if (!pExaPixmap->dirty)
|
||||
return;
|
||||
BoxPtr pBox = REGION_RECTS(pRegion);
|
||||
int nbox = REGION_NUM_RECTS(pRegion);
|
||||
Bool do_sync = FALSE;
|
||||
|
||||
save_ptr = pPixmap->devPrivate.ptr;
|
||||
save_pitch = pPixmap->devKind;
|
||||
pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr;
|
||||
pPixmap->devKind = pExaPixmap->fb_pitch;
|
||||
|
||||
if (pExaScr->info->DownloadFromScreen == NULL ||
|
||||
!pExaScr->info->DownloadFromScreen (pPixmap,
|
||||
0,
|
||||
0,
|
||||
pPixmap->drawable.width,
|
||||
pPixmap->drawable.height,
|
||||
pExaPixmap->sys_ptr,
|
||||
pExaPixmap->sys_pitch))
|
||||
{
|
||||
char *src, *dst;
|
||||
int src_pitch, dst_pitch, i, bytes;
|
||||
while (nbox--) {
|
||||
pBox->x1 = max(pBox->x1, 0);
|
||||
pBox->y1 = max(pBox->y1, 0);
|
||||
pBox->x2 = min(pBox->x2, pPixmap->drawable.width);
|
||||
pBox->y2 = min(pBox->y2, pPixmap->drawable.height);
|
||||
|
||||
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
if (pBox->x1 >= pBox->x2 || pBox->y1 >= pBox->y2)
|
||||
continue;
|
||||
|
||||
dst = pExaPixmap->sys_ptr;
|
||||
dst_pitch = pExaPixmap->sys_pitch;
|
||||
src = pExaPixmap->fb_ptr;
|
||||
src_pitch = pExaPixmap->fb_pitch;
|
||||
bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch;
|
||||
|
||||
for (i = 0; i < pPixmap->drawable.height; i++) {
|
||||
memcpy (dst, src, bytes);
|
||||
dst += dst_pitch;
|
||||
src += src_pitch;
|
||||
if (pExaScr->info->DownloadFromScreen == NULL ||
|
||||
!pExaScr->info->DownloadFromScreen (pPixmap,
|
||||
pBox->x1, pBox->y1,
|
||||
pBox->x2 - pBox->x1,
|
||||
pBox->y2 - pBox->y1,
|
||||
pExaPixmap->sys_ptr
|
||||
+ pBox->y1 * pExaPixmap->sys_pitch
|
||||
+ pBox->x1 * pPixmap->drawable.bitsPerPixel / 8,
|
||||
pExaPixmap->sys_pitch))
|
||||
{
|
||||
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
exaMemcpyBox (pPixmap, pBox,
|
||||
pExaPixmap->fb_ptr, pExaPixmap->fb_pitch,
|
||||
pExaPixmap->sys_ptr, pExaPixmap->sys_pitch);
|
||||
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
}
|
||||
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
else
|
||||
do_sync = TRUE;
|
||||
|
||||
pBox++;
|
||||
}
|
||||
|
||||
/* Make sure the bits have actually landed, since we don't necessarily sync
|
||||
* when accessing pixmaps in system memory.
|
||||
*/
|
||||
exaWaitSync (pPixmap->drawable.pScreen);
|
||||
if (do_sync)
|
||||
exaWaitSync (pPixmap->drawable.pScreen);
|
||||
|
||||
pPixmap->devPrivate.ptr = save_ptr;
|
||||
pPixmap->devKind = save_pitch;
|
||||
|
||||
pExaPixmap->dirty = FALSE;
|
||||
/* The previously damaged bits are now no longer damaged but valid */
|
||||
REGION_UNION(pPixmap->drawable.pScreen,
|
||||
&pExaPixmap->validReg, &pExaPixmap->validReg, pRegion);
|
||||
DamageEmpty (pExaPixmap->pDamage);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -158,49 +189,59 @@ exaCopyDirtyToFb (PixmapPtr pPixmap)
|
|||
{
|
||||
ExaScreenPriv (pPixmap->drawable.pScreen);
|
||||
ExaPixmapPriv (pPixmap);
|
||||
RegionPtr pRegion = DamageRegion (pExaPixmap->pDamage);
|
||||
CARD8 *save_ptr;
|
||||
int save_pitch;
|
||||
|
||||
if (!pExaPixmap->dirty)
|
||||
return;
|
||||
BoxPtr pBox = REGION_RECTS(pRegion);
|
||||
int nbox = REGION_NUM_RECTS(pRegion);
|
||||
Bool do_sync = FALSE;
|
||||
|
||||
save_ptr = pPixmap->devPrivate.ptr;
|
||||
save_pitch = pPixmap->devKind;
|
||||
pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr;
|
||||
pPixmap->devKind = pExaPixmap->fb_pitch;
|
||||
|
||||
if (pExaScr->info->UploadToScreen == NULL ||
|
||||
!pExaScr->info->UploadToScreen (pPixmap,
|
||||
0,
|
||||
0,
|
||||
pPixmap->drawable.width,
|
||||
pPixmap->drawable.height,
|
||||
pExaPixmap->sys_ptr,
|
||||
pExaPixmap->sys_pitch))
|
||||
{
|
||||
char *src, *dst;
|
||||
int src_pitch, dst_pitch, i, bytes;
|
||||
while (nbox--) {
|
||||
pBox->x1 = max(pBox->x1, 0);
|
||||
pBox->y1 = max(pBox->y1, 0);
|
||||
pBox->x2 = min(pBox->x2, pPixmap->drawable.width);
|
||||
pBox->y2 = min(pBox->y2, pPixmap->drawable.height);
|
||||
|
||||
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_DEST);
|
||||
if (pBox->x1 >= pBox->x2 || pBox->y1 >= pBox->y2)
|
||||
continue;
|
||||
|
||||
dst = pExaPixmap->fb_ptr;
|
||||
dst_pitch = pExaPixmap->fb_pitch;
|
||||
src = pExaPixmap->sys_ptr;
|
||||
src_pitch = pExaPixmap->sys_pitch;
|
||||
bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch;
|
||||
|
||||
for (i = 0; i < pPixmap->drawable.height; i++) {
|
||||
memcpy (dst, src, bytes);
|
||||
dst += dst_pitch;
|
||||
src += src_pitch;
|
||||
if (pExaScr->info->UploadToScreen == NULL ||
|
||||
!pExaScr->info->UploadToScreen (pPixmap,
|
||||
pBox->x1, pBox->y1,
|
||||
pBox->x2 - pBox->x1,
|
||||
pBox->y2 - pBox->y1,
|
||||
pExaPixmap->sys_ptr
|
||||
+ pBox->y1 * pExaPixmap->sys_pitch
|
||||
+ pBox->x1 * pPixmap->drawable.bitsPerPixel / 8,
|
||||
pExaPixmap->sys_pitch))
|
||||
{
|
||||
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_DEST);
|
||||
exaMemcpyBox (pPixmap, pBox,
|
||||
pExaPixmap->sys_ptr, pExaPixmap->sys_pitch,
|
||||
pExaPixmap->fb_ptr, pExaPixmap->fb_pitch);
|
||||
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_DEST);
|
||||
}
|
||||
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_DEST);
|
||||
else
|
||||
do_sync = TRUE;
|
||||
|
||||
pBox++;
|
||||
}
|
||||
|
||||
if (do_sync)
|
||||
exaMarkSync (pPixmap->drawable.pScreen);
|
||||
|
||||
pPixmap->devPrivate.ptr = save_ptr;
|
||||
pPixmap->devKind = save_pitch;
|
||||
|
||||
pExaPixmap->dirty = FALSE;
|
||||
/* The previously damaged bits are now no longer damaged but valid */
|
||||
REGION_UNION(pPixmap->drawable.pScreen,
|
||||
&pExaPixmap->validReg, &pExaPixmap->validReg, pRegion);
|
||||
DamageEmpty (pExaPixmap->pDamage);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -208,11 +249,12 @@ exaCopyDirtyToFb (PixmapPtr pPixmap)
|
|||
* Called when the memory manager decides it's time to kick the pixmap out of
|
||||
* framebuffer entirely.
|
||||
*/
|
||||
static void
|
||||
void
|
||||
exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area)
|
||||
{
|
||||
PixmapPtr pPixmap = area->privData;
|
||||
ExaPixmapPriv(pPixmap);
|
||||
RegionPtr pDamageReg = DamageRegion(pExaPixmap->pDamage);
|
||||
|
||||
DBG_MIGRATE (("Save %p (%p) (%dx%d) (%c)\n", pPixmap,
|
||||
(void*)(ExaGetPixmapPriv(pPixmap)->area ?
|
||||
|
@ -231,10 +273,9 @@ exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area)
|
|||
pExaPixmap->fb_ptr = NULL;
|
||||
pExaPixmap->area = NULL;
|
||||
|
||||
/* Mark it dirty now, to say that there is important data in the
|
||||
* system-memory copy.
|
||||
*/
|
||||
pExaPixmap->dirty = TRUE;
|
||||
/* Mark all valid bits as damaged, so they'll get copied to FB next time */
|
||||
REGION_UNION(pPixmap->drawable.pScreen, pDamageReg, pDamageReg,
|
||||
&pExaPixmap->validReg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -413,32 +454,57 @@ exaMigrateTowardSys (PixmapPtr pPixmap)
|
|||
* If the pixmap has both a framebuffer and system memory copy, this function
|
||||
* asserts that both of them are the same.
|
||||
*/
|
||||
static void
|
||||
static Bool
|
||||
exaAssertNotDirty (PixmapPtr pPixmap)
|
||||
{
|
||||
ExaPixmapPriv (pPixmap);
|
||||
CARD8 *dst, *src;
|
||||
int dst_pitch, src_pitch, data_row_bytes, y;
|
||||
RegionPtr pValidReg = &pExaPixmap->validReg;
|
||||
int dst_pitch, src_pitch, cpp, y, nbox = REGION_NUM_RECTS(pValidReg);
|
||||
BoxPtr pBox = REGION_RECTS(pValidReg);
|
||||
Bool ret = TRUE;
|
||||
|
||||
if (pExaPixmap == NULL || pExaPixmap->fb_ptr == NULL)
|
||||
return;
|
||||
return ret;
|
||||
|
||||
dst = pExaPixmap->sys_ptr;
|
||||
dst_pitch = pExaPixmap->sys_pitch;
|
||||
src = pExaPixmap->fb_ptr;
|
||||
src_pitch = pExaPixmap->fb_pitch;
|
||||
data_row_bytes = pPixmap->drawable.width *
|
||||
pPixmap->drawable.bitsPerPixel / 8;
|
||||
cpp = pPixmap->drawable.bitsPerPixel / 8;
|
||||
|
||||
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
for (y = 0; y < pPixmap->drawable.height; y++) {
|
||||
if (memcmp(dst, src, data_row_bytes) != 0) {
|
||||
abort();
|
||||
}
|
||||
dst += dst_pitch;
|
||||
src += src_pitch;
|
||||
while (nbox--) {
|
||||
int rowbytes;
|
||||
|
||||
pBox->x1 = max(pBox->x1, 0);
|
||||
pBox->y1 = max(pBox->y1, 0);
|
||||
pBox->x2 = min(pBox->x2, pPixmap->drawable.width);
|
||||
pBox->y2 = min(pBox->y2, pPixmap->drawable.height);
|
||||
|
||||
if (pBox->x1 >= pBox->x2 || pBox->y1 >= pBox->y2)
|
||||
continue;
|
||||
|
||||
rowbytes = (pBox->x2 - pBox->x1) * cpp;
|
||||
src += pBox->y1 * src_pitch + pBox->x1 * cpp;
|
||||
dst += pBox->y1 * dst_pitch + pBox->x1 * cpp;
|
||||
|
||||
for (y = pBox->y2 - pBox->y1; y; y--) {
|
||||
if (memcmp(dst + pBox->y1 * dst_pitch + pBox->x1 * cpp,
|
||||
src + pBox->y1 * src_pitch + pBox->x1 * cpp,
|
||||
(pBox->x2 - pBox->x1) * cpp) != 0) {
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
src += src_pitch;
|
||||
dst += dst_pitch;
|
||||
}
|
||||
src -= pBox->y1 * src_pitch + pBox->x1 * cpp;
|
||||
dst -= pBox->y1 * dst_pitch + pBox->x1 * cpp;
|
||||
}
|
||||
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -462,8 +528,9 @@ exaDoMigration (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel)
|
|||
*/
|
||||
if (pExaScr->checkDirtyCorrectness) {
|
||||
for (i = 0; i < npixmaps; i++) {
|
||||
if (!exaPixmapIsDirty (pixmaps[i].pPix))
|
||||
exaAssertNotDirty (pixmaps[i].pPix);
|
||||
if (!exaPixmapIsDirty (pixmaps[i].pPix) &&
|
||||
!exaAssertNotDirty (pixmaps[i].pPix))
|
||||
ErrorF("%s: Pixmap %d dirty but not marked as such!\n", __func__, i);
|
||||
}
|
||||
}
|
||||
/* If anything is pinned in system memory, we won't be able to
|
||||
|
|
|
@ -81,15 +81,14 @@ ExaOffscreenKickOut (ScreenPtr pScreen, ExaOffscreenArea *area)
|
|||
* @param save callback for when the area is evicted from memory
|
||||
* @param privdata private data for the save callback.
|
||||
*
|
||||
* Allocates offscreen memory from the device associated with pScreen. size and
|
||||
* align deteremine where and how large the allocated area is, and locked will
|
||||
* mark whether it should be held in card memory. privdata may be any pointer
|
||||
* for the save callback when the area is removed.
|
||||
* Allocates offscreen memory from the device associated with pScreen. size
|
||||
* and align deteremine where and how large the allocated area is, and locked
|
||||
* will mark whether it should be held in card memory. privdata may be any
|
||||
* pointer for the save callback when the area is removed.
|
||||
*
|
||||
* Note that locked areas do get evicted on VT switch, because during that time
|
||||
* all offscreen memory becomes inaccessible. This may change in the future,
|
||||
* but drivers should be aware of this and provide a callback to mark that their
|
||||
* locked allocation was evicted, and then restore it if necessary on EnterVT.
|
||||
* Note that locked areas do get evicted on VT switch unless the driver
|
||||
* requested version 2.1 or newer behavior. In that case, the save callback is
|
||||
* still called.
|
||||
*/
|
||||
ExaOffscreenArea *
|
||||
exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||
|
@ -256,6 +255,9 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
|||
return area;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ejects all offscreen areas, and uninitializes the offscreen memory manager.
|
||||
*/
|
||||
void
|
||||
ExaOffscreenSwapOut (ScreenPtr pScreen)
|
||||
{
|
||||
|
@ -283,12 +285,56 @@ ExaOffscreenSwapOut (ScreenPtr pScreen)
|
|||
ExaOffscreenFini (pScreen);
|
||||
}
|
||||
|
||||
/** Ejects all pixmaps managed by EXA. */
|
||||
static void
|
||||
ExaOffscreenEjectPixmaps (ScreenPtr pScreen)
|
||||
{
|
||||
ExaScreenPriv (pScreen);
|
||||
|
||||
ExaOffscreenValidate (pScreen);
|
||||
/* loop until a single free area spans the space */
|
||||
for (;;)
|
||||
{
|
||||
ExaOffscreenArea *area;
|
||||
|
||||
for (area = pExaScr->info->offScreenAreas; area != NULL;
|
||||
area = area->next)
|
||||
{
|
||||
if (area->state == ExaOffscreenRemovable &&
|
||||
area->save == exaPixmapSave)
|
||||
{
|
||||
(void) ExaOffscreenKickOut (pScreen, area);
|
||||
ExaOffscreenValidate (pScreen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (area == NULL)
|
||||
break;
|
||||
}
|
||||
ExaOffscreenValidate (pScreen);
|
||||
}
|
||||
|
||||
void
|
||||
ExaOffscreenSwapIn (ScreenPtr pScreen)
|
||||
{
|
||||
exaOffscreenInit (pScreen);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares EXA for disabling of FB access, or restoring it.
|
||||
*
|
||||
* In version 2.1, the disabling results in pixmaps being ejected, while other
|
||||
* allocations remain. With this plus the prevention of migration while
|
||||
* swappedOut is set, EXA by itself should not cause any access of the
|
||||
* framebuffer to occur while swapped out. Any remaining issues are the
|
||||
* responsibility of the driver.
|
||||
*
|
||||
* Prior to version 2.1, all allocations, including locked ones, are ejected
|
||||
* when access is disabled, and the allocator is torn down while swappedOut
|
||||
* is set. This is more drastic, and caused implementation difficulties for
|
||||
* many drivers that could otherwise handle the lack of FB access while
|
||||
* swapped out.
|
||||
*/
|
||||
void
|
||||
exaEnableDisableFBAccess (int index, Bool enable)
|
||||
{
|
||||
|
@ -296,10 +342,14 @@ exaEnableDisableFBAccess (int index, Bool enable)
|
|||
ExaScreenPriv (pScreen);
|
||||
|
||||
if (!enable) {
|
||||
ExaOffscreenSwapOut (pScreen);
|
||||
if (pExaScr->info->exa_minor < 1)
|
||||
ExaOffscreenSwapOut (pScreen);
|
||||
else
|
||||
ExaOffscreenEjectPixmaps (pScreen);
|
||||
pExaScr->swappedOut = TRUE;
|
||||
} else {
|
||||
ExaOffscreenSwapIn (pScreen);
|
||||
if (pExaScr->info->exa_minor < 1)
|
||||
ExaOffscreenSwapIn (pScreen);
|
||||
pExaScr->swappedOut = FALSE;
|
||||
}
|
||||
}
|
||||
|
@ -390,6 +440,7 @@ ExaOffscreenMarkUsed (PixmapPtr pPixmap)
|
|||
if (area->state == ExaOffscreenRemovable)
|
||||
area->score = (area->score * 7) / 8;
|
||||
}
|
||||
iter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#ifdef RENDER
|
||||
#include "fbpict.h"
|
||||
#endif
|
||||
#include "damage.h"
|
||||
|
||||
#define DEBUG_TRACE_FALL 0
|
||||
#define DEBUG_MIGRATE 0
|
||||
|
@ -160,16 +161,16 @@ typedef struct {
|
|||
unsigned int fb_size; /**< size of pixmap in framebuffer memory */
|
||||
|
||||
/**
|
||||
* If area is NULL, then dirty == TRUE means that the pixmap has been
|
||||
* modified, so the contents are defined. Used to avoid uploads of
|
||||
* undefined data.
|
||||
*
|
||||
* If area is non-NULL, then dirty == TRUE means that the pixmap data at
|
||||
* pPixmap->devPrivate.ptr (either fb_ptr or sys_ptr) has been changed
|
||||
* compared to the copy in the other location. This is used to avoid
|
||||
* uploads/downloads of unmodified data.
|
||||
* The damage record contains the areas of the pixmap's current location
|
||||
* (framebuffer or system) that have been damaged compared to the other
|
||||
* location.
|
||||
*/
|
||||
Bool dirty;
|
||||
DamagePtr pDamage;
|
||||
/**
|
||||
* The valid region marks the valid bits of a drawable (at least, as it's
|
||||
* derived from damage, which may be overreported).
|
||||
*/
|
||||
RegionRec validReg;
|
||||
} ExaPixmapPrivRec, *ExaPixmapPrivPtr;
|
||||
|
||||
typedef struct _ExaMigrationRec {
|
||||
|
@ -315,7 +316,7 @@ ExaCheckComposite (CARD8 op,
|
|||
CARD16 height);
|
||||
#endif
|
||||
|
||||
/* exaoffscreen.c */
|
||||
/* exa_offscreen.c */
|
||||
void
|
||||
ExaOffscreenMarkUsed (PixmapPtr pPixmap);
|
||||
|
||||
|
@ -339,7 +340,10 @@ void
|
|||
exaFinishAccess(DrawablePtr pDrawable, int index);
|
||||
|
||||
void
|
||||
exaDrawableDirty(DrawablePtr pDrawable);
|
||||
exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
|
||||
|
||||
void
|
||||
exaDrawableDirty(DrawablePtr pDrawable, int x1, int y1, int x2, int y2);
|
||||
|
||||
Bool
|
||||
exaDrawableIsOffscreen (DrawablePtr pDrawable);
|
||||
|
@ -409,9 +413,6 @@ void
|
|||
exaDoMigration (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
|
||||
|
||||
void
|
||||
exaMoveInPixmap (PixmapPtr pPixmap);
|
||||
|
||||
void
|
||||
exaMoveOutPixmap (PixmapPtr pPixmap);
|
||||
exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area);
|
||||
|
||||
#endif /* EXAPRIV_H */
|
||||
|
|
|
@ -302,12 +302,12 @@ exaTryDriverSolidFill(PicturePtr pSrc,
|
|||
(*pExaScr->info->Solid) (pDstPix,
|
||||
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
|
||||
exaPixmapDirty (pDstPix, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
|
||||
pbox++;
|
||||
}
|
||||
|
||||
(*pExaScr->info->DoneSolid) (pDstPix);
|
||||
exaMarkSync(pDst->pDrawable->pScreen);
|
||||
exaDrawableDirty (pDst->pDrawable);
|
||||
|
||||
REGION_UNINIT(pDst->pDrawable->pScreen, ®ion);
|
||||
return 1;
|
||||
|
@ -336,16 +336,21 @@ exaTryDriverComposite(CARD8 op,
|
|||
struct _Pixmap scratch;
|
||||
ExaMigrationRec pixmaps[3];
|
||||
|
||||
pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable);
|
||||
pDstPix = exaGetDrawablePixmap(pDst->pDrawable);
|
||||
if (pMask)
|
||||
pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
|
||||
|
||||
/* Bail if we might exceed coord limits by rendering from/to these. We
|
||||
* should really be making some scratch pixmaps with offsets and coords
|
||||
* adjusted to deal with this, but it hasn't been done yet.
|
||||
*/
|
||||
if (pSrc->pDrawable->width > pExaScr->info->maxX ||
|
||||
pSrc->pDrawable->height > pExaScr->info->maxY ||
|
||||
pDst->pDrawable->width > pExaScr->info->maxX ||
|
||||
pDst->pDrawable->height > pExaScr->info->maxY ||
|
||||
(pMask && (pMask->pDrawable->width > pExaScr->info->maxX ||
|
||||
pMask->pDrawable->height > pExaScr->info->maxY)))
|
||||
if (pSrcPix->drawable.width > pExaScr->info->maxX ||
|
||||
pSrcPix->drawable.height > pExaScr->info->maxY ||
|
||||
pDstPix->drawable.width > pExaScr->info->maxX ||
|
||||
pDstPix->drawable.height > pExaScr->info->maxY ||
|
||||
(pMask && (pMaskPix->drawable.width > pExaScr->info->maxX ||
|
||||
pMaskPix->drawable.height > pExaScr->info->maxY)))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -441,12 +446,12 @@ exaTryDriverComposite(CARD8 op,
|
|||
pbox->y1 + dst_off_y,
|
||||
pbox->x2 - pbox->x1,
|
||||
pbox->y2 - pbox->y1);
|
||||
exaPixmapDirty (pDstPix, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
|
||||
pbox++;
|
||||
}
|
||||
|
||||
(*pExaScr->info->DoneComposite) (pDstPix);
|
||||
exaMarkSync(pDst->pDrawable->pScreen);
|
||||
exaDrawableDirty (pDst->pDrawable);
|
||||
|
||||
REGION_UNINIT(pDst->pDrawable->pScreen, ®ion);
|
||||
return 1;
|
||||
|
@ -705,16 +710,19 @@ void
|
|||
exaRasterizeTrapezoid (PicturePtr pPicture, xTrapezoid *trap,
|
||||
int x_off, int y_off)
|
||||
{
|
||||
DrawablePtr pDraw = pPicture->pDrawable;
|
||||
ExaMigrationRec pixmaps[1];
|
||||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = TRUE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pPicture->pDrawable);
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDraw);
|
||||
exaDoMigration(pixmaps, 1, FALSE);
|
||||
|
||||
exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
|
||||
exaPrepareAccess(pDraw, EXA_PREPARE_DEST);
|
||||
fbRasterizeTrapezoid(pPicture, trap, x_off, y_off);
|
||||
exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
|
||||
exaDrawableDirty(pDraw, pDraw->x, pDraw->y,
|
||||
pDraw->x + pDraw->width, pDraw->y + pDraw->height);
|
||||
exaFinishAccess(pDraw, EXA_PREPARE_DEST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -725,16 +733,19 @@ void
|
|||
exaAddTriangles (PicturePtr pPicture, INT16 x_off, INT16 y_off, int ntri,
|
||||
xTriangle *tris)
|
||||
{
|
||||
DrawablePtr pDraw = pPicture->pDrawable;
|
||||
ExaMigrationRec pixmaps[1];
|
||||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = TRUE;
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pPicture->pDrawable);
|
||||
pixmaps[0].pPix = exaGetDrawablePixmap (pDraw);
|
||||
exaDoMigration(pixmaps, 1, FALSE);
|
||||
|
||||
exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
|
||||
exaPrepareAccess(pDraw, EXA_PREPARE_DEST);
|
||||
fbAddTriangles(pPicture, x_off, y_off, ntri, tris);
|
||||
exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
|
||||
exaDrawableDirty(pDraw, pDraw->x, pDraw->y,
|
||||
pDraw->x + pDraw->width, pDraw->y + pDraw->height);
|
||||
exaFinishAccess(pDraw, EXA_PREPARE_DEST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1023,10 +1034,11 @@ exaGlyphs (CARD8 op,
|
|||
|
||||
exaCopyArea (&pScratchPixmap->drawable, &pPixmap->drawable, pGC,
|
||||
0, 0, glyph->info.width, glyph->info.height, 0, 0);
|
||||
} else {
|
||||
exaDrawableDirty (&pPixmap->drawable);
|
||||
}
|
||||
|
||||
exaPixmapDirty (pPixmap, 0, 0,
|
||||
glyph->info.width, glyph->info.height);
|
||||
|
||||
if (maskFormat)
|
||||
{
|
||||
exaComposite (PictOpAdd, pPicture, NULL, pMask, 0, 0, 0, 0,
|
||||
|
|
|
@ -200,11 +200,33 @@ ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
|
|||
int nrect, xRectangle *prect)
|
||||
{
|
||||
EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
|
||||
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
exaPrepareAccessGC (pGC);
|
||||
fbPolyFillRect (pDrawable, pGC, nrect, prect);
|
||||
exaFinishAccessGC (pGC);
|
||||
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
|
||||
if (nrect) {
|
||||
int x1 = max(prect->x, 0), y1 = max(prect->y, 0);
|
||||
int x2 = min(prect->x + prect->width, pDrawable->width);
|
||||
int y2 = min(prect->y + prect->height, pDrawable->height);
|
||||
|
||||
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
exaPrepareAccessGC (pGC);
|
||||
fbPolyFillRect (pDrawable, pGC, nrect, prect);
|
||||
exaFinishAccessGC (pGC);
|
||||
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
|
||||
|
||||
/* Only track bounding box of damage, as this path can degenerate to
|
||||
* zillions of damage boxes
|
||||
*/
|
||||
while (--nrect)
|
||||
{
|
||||
prect++;
|
||||
x1 = min(x1, prect->x);
|
||||
x2 = max(x2, prect->x + prect->width);
|
||||
y1 = min(y1, prect->y);
|
||||
y2 = max(y2, prect->y + prect->height);
|
||||
}
|
||||
|
||||
exaDrawableDirty (pDrawable, pDrawable->x + x1, pDrawable->y + y1,
|
||||
pDrawable->x + x2, pDrawable->y + y2);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -105,9 +105,6 @@ fbCanGetSolid(PicturePtr pict)
|
|||
}
|
||||
}
|
||||
|
||||
#define fbCanGetSolid(pict) \
|
||||
(pict->pDrawable != NULL && pict->pDrawable->width == 1 && pict->pDrawable->height == 1)
|
||||
|
||||
#define fbComposeGetSolid(pict, bits, fmt) { \
|
||||
FbBits *__bits__; \
|
||||
FbStride __stride__; \
|
||||
|
|
|
@ -84,7 +84,7 @@ typedef enum {
|
|||
* mask is 0xFFFF0000.
|
||||
*/
|
||||
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 3)
|
||||
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(1, 1)
|
||||
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(1, 2)
|
||||
#define ABI_XINPUT_VERSION SET_ABI_VERSION(1, 0)
|
||||
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(0, 3)
|
||||
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 5)
|
||||
|
|
|
@ -368,10 +368,8 @@ AllocateArea(
|
|||
/* look through the free boxes */
|
||||
for(i = 0; i < num; i++, boxp++) {
|
||||
x = boxp->x1;
|
||||
if(granularity) {
|
||||
int tmp = x % granularity;
|
||||
if(tmp) x += (granularity - tmp);
|
||||
}
|
||||
if (granularity > 1)
|
||||
x = ((x + granularity - 1) / granularity) * granularity;
|
||||
|
||||
if(((boxp->y2 - boxp->y1) < h) || ((boxp->x2 - x) < w))
|
||||
continue;
|
||||
|
@ -398,10 +396,8 @@ AllocateArea(
|
|||
|
||||
boxp = &(link->area.box);
|
||||
x = boxp->x1;
|
||||
if(granularity) {
|
||||
int tmp = x % granularity;
|
||||
if(tmp) x += (granularity - tmp);
|
||||
}
|
||||
if (granularity > 1)
|
||||
x = ((x + granularity - 1) / granularity) * granularity;
|
||||
|
||||
if(((boxp->y2 - boxp->y1) < h) || ((boxp->x2 - x) < w)) {
|
||||
link = link->next;
|
||||
|
@ -685,10 +681,8 @@ localQueryLargestOffscreenArea(
|
|||
|
||||
while(nbox--) {
|
||||
x = pbox->x1;
|
||||
if(granularity) {
|
||||
int tmp = x % granularity;
|
||||
if(tmp) x += (granularity - tmp);
|
||||
}
|
||||
if (granularity > 1)
|
||||
x = ((x + granularity - 1) / granularity) * granularity;
|
||||
|
||||
w = pbox->x2 - x;
|
||||
h = pbox->y2 - pbox->y1;
|
||||
|
@ -845,7 +839,9 @@ AllocateLinear(
|
|||
while (linear) {
|
||||
/* Make sure we get a free area that's not an XY fallback case */
|
||||
if (!linear->area && linear->free) {
|
||||
offset = (linear->linear.offset + granularity) & ~granularity;
|
||||
offset = linear->linear.offset;
|
||||
if (granularity > 1)
|
||||
offset = ((offset + granularity - 1) / granularity) * granularity;
|
||||
end = offset+size;
|
||||
if (end <= (linear->linear.offset + linear->linear.size))
|
||||
break;
|
||||
|
@ -935,17 +931,20 @@ localAllocateOffscreenLinear(
|
|||
extents = REGION_EXTENTS(pScreen, offman->InitialBoxes);
|
||||
pitch = extents->x2 - extents->x1;
|
||||
|
||||
if (gran && gran > pitch) {
|
||||
/* we can't match the specified alignment with XY allocations */
|
||||
xfree(link);
|
||||
return NULL;
|
||||
}
|
||||
if (gran && (pitch % gran)) {
|
||||
/* pitch and granularity aren't a perfect match, let's allocate
|
||||
* a bit more so we can align later on
|
||||
*/
|
||||
length += gran - 1;
|
||||
}
|
||||
if (gran > 1) {
|
||||
if (gran > pitch) {
|
||||
/* we can't match the specified alignment with XY allocations */
|
||||
xfree(link);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pitch % gran) {
|
||||
/* pitch and granularity aren't a perfect match, let's allocate
|
||||
* a bit more so we can align later on
|
||||
*/
|
||||
length += gran - 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(length < pitch) { /* special case */
|
||||
w = length;
|
||||
|
@ -968,8 +967,8 @@ localAllocateOffscreenLinear(
|
|||
linear->pScreen = pScreen;
|
||||
linear->size = h * w;
|
||||
linear->offset = (pitch * area->box.y1) + area->box.x1;
|
||||
if (gran && linear->offset % gran)
|
||||
linear->offset += gran - (linear->offset % gran);
|
||||
if (gran > 1)
|
||||
linear->offset += ((linear->offset + gran - 1) / gran) * gran;
|
||||
linear->granularity = gran;
|
||||
linear->MoveLinearCallback = moveCB;
|
||||
linear->RemoveLinearCallback = removeCB;
|
||||
|
@ -1435,9 +1434,12 @@ xf86AllocateLinearOffscreenArea (
|
|||
extents = REGION_EXTENTS(pScreen, offman->InitialBoxes);
|
||||
w = extents->x2 - extents->x1;
|
||||
|
||||
if(gran && ((gran > w) || (w % gran))) {
|
||||
/* we can't match the specified alignment with XY allocations */
|
||||
return NULL;
|
||||
if (gran > 1) {
|
||||
if (gran > w)
|
||||
return NULL;
|
||||
|
||||
if (w % gran)
|
||||
length += gran - 1;
|
||||
}
|
||||
|
||||
if(length <= w) { /* special case */
|
||||
|
|
|
@ -649,7 +649,7 @@ being
|
|||
that are passed to the module when it is loaded.
|
||||
.PP
|
||||
Example: the extmod module (which contains a miscellaneous group of
|
||||
server extensions) can be loaded, with the __xservername__-DGA extension
|
||||
server extensions) can be loaded, with the XFree86-DGA extension
|
||||
disabled by using the following entry:
|
||||
.PP
|
||||
.RS 4
|
||||
|
|
|
@ -35,6 +35,6 @@ Default: No.
|
|||
Chooses an alternate pixmap migration heuristic, for debugging purposes. The
|
||||
default is intended to be the best performing one for general use, though others
|
||||
may help with specific use cases. Available options include \*qalways\*q,
|
||||
\*qgreedy\*q, and \*qsmart\*q. Default: smart.
|
||||
\*qgreedy\*q, and \*qsmart\*q. Default: always.
|
||||
.SH AUTHORS
|
||||
Authors include: Keith Packard, Eric Anholt, Zack Rusin, and Michel Dänzer
|
||||
|
|
|
@ -183,12 +183,20 @@ print_xfree_mode(char *txt, DisplayModePtr mode)
|
|||
static void
|
||||
xfree2fbdev_fblayout(ScrnInfoPtr pScrn, struct fb_var_screeninfo *var)
|
||||
{
|
||||
var->xres_virtual = pScrn->virtualX;
|
||||
var->xres_virtual = pScrn->displayWidth ? pScrn->displayWidth :
|
||||
pScrn->virtualX;
|
||||
var->yres_virtual = pScrn->virtualY;
|
||||
var->bits_per_pixel = pScrn->bitsPerPixel;
|
||||
var->red.length = pScrn->weight.red;
|
||||
var->green.length = pScrn->weight.green;
|
||||
var->blue.length = pScrn->weight.blue;
|
||||
if (pScrn->defaultVisual == TrueColor ||
|
||||
pScrn->defaultVisual == DirectColor) {
|
||||
var->red.length = pScrn->weight.red;
|
||||
var->green.length = pScrn->weight.green;
|
||||
var->blue.length = pScrn->weight.blue;
|
||||
} else {
|
||||
var->red.length = 8;
|
||||
var->green.length = 8;
|
||||
var->blue.length = 8;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -227,6 +235,26 @@ xfree2fbdev_timing(DisplayModePtr mode, struct fb_var_screeninfo *var)
|
|||
var->vmode = FB_VMODE_NONINTERLACED;
|
||||
}
|
||||
|
||||
static Bool
|
||||
fbdev_modes_equal(struct fb_var_screeninfo *set, struct fb_var_screeninfo *req)
|
||||
{
|
||||
return (set->xres_virtual >= req->xres_virtual &&
|
||||
set->yres_virtual == req->yres_virtual &&
|
||||
set->bits_per_pixel == req->bits_per_pixel &&
|
||||
set->red.length == req->red.length &&
|
||||
set->green.length == req->green.length &&
|
||||
set->blue.length == req->blue.length &&
|
||||
set->xres == req->xres && set->yres == req->yres &&
|
||||
set->pixclock == req->pixclock &&
|
||||
set->right_margin == req->right_margin &&
|
||||
set->hsync_len == req->hsync_len &&
|
||||
set->left_margin == req->left_margin &&
|
||||
set->lower_margin == req->lower_margin &&
|
||||
set->vsync_len == req->vsync_len &&
|
||||
set->upper_margin == req->upper_margin &&
|
||||
set->sync == req->sync && set->vmode == req->vmode);
|
||||
}
|
||||
|
||||
static void
|
||||
fbdev2xfree_timing(struct fb_var_screeninfo *var, DisplayModePtr mode)
|
||||
{
|
||||
|
@ -470,13 +498,53 @@ fbdevHWGetVidmem(ScrnInfoPtr pScrn)
|
|||
return fPtr->fix.smem_len;
|
||||
}
|
||||
|
||||
static Bool
|
||||
fbdevHWSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool check)
|
||||
{
|
||||
fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
|
||||
struct fb_var_screeninfo req_var = fPtr->var, set_var;
|
||||
|
||||
TRACE_ENTER("SetMode");
|
||||
|
||||
xfree2fbdev_fblayout(pScrn, &req_var);
|
||||
xfree2fbdev_timing(mode, &req_var);
|
||||
|
||||
#if DEBUG
|
||||
print_xfree_mode("init", mode);
|
||||
print_fbdev_mode("init", &req_var);
|
||||
#endif
|
||||
|
||||
set_var = req_var;
|
||||
|
||||
if (check)
|
||||
set_var.activate = FB_ACTIVATE_TEST;
|
||||
|
||||
if (0 != ioctl(fPtr->fd, FBIOPUT_VSCREENINFO, (void*)(&set_var))) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||
"FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!fbdev_modes_equal(&set_var, &req_var)) {
|
||||
if (!check)
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||
"FBIOPUT_VSCREENINFO succeeded but modified "
|
||||
"mode\n");
|
||||
#if DEBUG
|
||||
print_fbdev_mode("returned", &set_var);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!check)
|
||||
fPtr->var = set_var;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
|
||||
{
|
||||
fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
|
||||
int virtX = pScrn->display->virtualX;
|
||||
int virtY = pScrn->display->virtualY;
|
||||
struct fb_var_screeninfo var;
|
||||
char **modename;
|
||||
DisplayModePtr mode,this,last = pScrn->modes;
|
||||
|
||||
|
@ -484,6 +552,9 @@ fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
|
|||
if (NULL == pScrn->display->modes)
|
||||
return;
|
||||
|
||||
pScrn->virtualX = pScrn->display->virtualX;
|
||||
pScrn->virtualY = pScrn->display->virtualY;
|
||||
|
||||
for (modename = pScrn->display->modes; *modename != NULL; modename++) {
|
||||
for (mode = pScrn->monitor->Modes; mode != NULL; mode = mode->next)
|
||||
if (0 == strcmp(mode->name,*modename))
|
||||
|
@ -493,27 +564,20 @@ fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
|
|||
"\tmode \"%s\" not found\n", *modename);
|
||||
continue;
|
||||
}
|
||||
memset(&var,0,sizeof(var));
|
||||
xfree2fbdev_timing(mode,&var);
|
||||
var.xres_virtual = virtX;
|
||||
var.yres_virtual = virtY;
|
||||
var.bits_per_pixel = pScrn->bitsPerPixel;
|
||||
var.red.length = pScrn->weight.red;
|
||||
var.green.length = pScrn->weight.green;
|
||||
var.blue.length = pScrn->weight.blue;
|
||||
|
||||
var.activate = FB_ACTIVATE_TEST;
|
||||
if (var.xres_virtual < var.xres) var.xres_virtual = var.xres;
|
||||
if (var.yres_virtual < var.yres) var.yres_virtual = var.yres;
|
||||
if (-1 == ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&var))) {
|
||||
if (!fbdevHWSetMode(pScrn, mode, TRUE)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
|
||||
"\tmode \"%s\" test failed\n", *modename);
|
||||
continue;
|
||||
}
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
|
||||
"\tmode \"%s\" ok\n", *modename);
|
||||
if (virtX < var.xres) virtX = var.xres;
|
||||
if (virtY < var.yres) virtY = var.yres;
|
||||
|
||||
if (pScrn->virtualX < mode->HDisplay)
|
||||
pScrn->virtualX = mode->HDisplay;
|
||||
if (pScrn->virtualY < mode->VDisplay)
|
||||
pScrn->virtualY = mode->VDisplay;
|
||||
|
||||
if (NULL == pScrn->modes) {
|
||||
pScrn->modes = xnfalloc(sizeof(DisplayModeRec));
|
||||
this = pScrn->modes;
|
||||
|
@ -530,8 +594,6 @@ fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
|
|||
}
|
||||
last = this;
|
||||
}
|
||||
pScrn->virtualX = virtX;
|
||||
pScrn->virtualY = virtY;
|
||||
}
|
||||
|
||||
DisplayModePtr
|
||||
|
@ -673,21 +735,12 @@ fbdevHWModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
|
|||
{
|
||||
fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
|
||||
|
||||
TRACE_ENTER("ModeInit");
|
||||
xfree2fbdev_fblayout(pScrn, &fPtr->var);
|
||||
xfree2fbdev_timing(mode, &fPtr->var);
|
||||
#if DEBUG
|
||||
print_xfree_mode("init",mode);
|
||||
print_fbdev_mode("init",&fPtr->var);
|
||||
#endif
|
||||
pScrn->vtSema = TRUE;
|
||||
|
||||
/* set */
|
||||
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||
"FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
|
||||
if (!fbdevHWSetMode(pScrn, mode, FALSE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* read back */
|
||||
if (0 != ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||
|
@ -699,6 +752,20 @@ fbdevHWModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
|
|||
"FBIOGET_VSCREENINFO: %s\n", strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pScrn->defaultVisual == TrueColor ||
|
||||
pScrn->defaultVisual == DirectColor) {
|
||||
/* XXX: This is a hack, but it should be a NOP for all the setups that
|
||||
* worked before and actually seems to fix some others...
|
||||
*/
|
||||
pScrn->offset.red = fPtr->var.red.offset;
|
||||
pScrn->offset.green = fPtr->var.green.offset;
|
||||
pScrn->offset.blue = fPtr->var.blue.offset;
|
||||
pScrn->mask.red = ((1 << fPtr->var.red.length) - 1) << fPtr->var.red.offset;
|
||||
pScrn->mask.green = ((1 << fPtr->var.green.length) - 1) << fPtr->var.green.offset;
|
||||
pScrn->mask.blue = ((1 << fPtr->var.blue.length) - 1) << fPtr->var.blue.offset;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -767,18 +834,12 @@ ModeStatus
|
|||
fbdevHWValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||
fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
|
||||
struct fb_var_screeninfo var;
|
||||
|
||||
TRACE_ENTER("ValidMode");
|
||||
memcpy(&var,&fPtr->var,sizeof(var));
|
||||
xfree2fbdev_timing(mode, &var);
|
||||
var.activate = FB_ACTIVATE_TEST;
|
||||
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
|
||||
xf86DrvMsg(scrnIndex, X_ERROR,
|
||||
"FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
|
||||
|
||||
if (!fbdevHWSetMode(pScrn, mode, TRUE))
|
||||
return MODE_BAD;
|
||||
}
|
||||
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
|
@ -786,15 +847,12 @@ Bool
|
|||
fbdevHWSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||
fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
|
||||
|
||||
TRACE_ENTER("SwitchMode");
|
||||
xfree2fbdev_timing(mode, &fPtr->var);
|
||||
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
|
||||
xf86DrvMsg(scrnIndex, X_ERROR,
|
||||
"FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
|
||||
|
||||
if (!fbdevHWSetMode(pScrn, mode, FALSE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -113,6 +113,10 @@ DLFindSymbol(const char *name)
|
|||
DLModuleList *l;
|
||||
void *p;
|
||||
|
||||
p = dlsym(RTLD_DEFAULT, name);
|
||||
if (p != NULL)
|
||||
return p;
|
||||
|
||||
for (l = dlModuleList; l != NULL; l = l->next) {
|
||||
p = DLFindSymbolLocal(l->module, name);
|
||||
if (p)
|
||||
|
|
|
@ -903,7 +903,7 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
|
|||
* check the elements in the path
|
||||
*/
|
||||
if (PathIsAbsolute(module))
|
||||
xstrdup(module);
|
||||
found = xstrdup(module);
|
||||
path_elem = pathlist;
|
||||
while (!found && *path_elem != NULL) {
|
||||
found = FindModule(m, *path_elem, subdirlist, patterns);
|
||||
|
|
|
@ -570,7 +570,8 @@ linuxMapPci(int ScreenNum, int Flags, PCITAG Tag,
|
|||
|
||||
xf86InitVidMem();
|
||||
|
||||
if (((fd = linuxPciOpenFile(Tag ,FALSE)) < 0) ||
|
||||
prot = ((Flags & VIDMEM_READONLY) == 0);
|
||||
if (((fd = linuxPciOpenFile(Tag, prot)) < 0) ||
|
||||
(ioctl(fd, mmap_ioctl, 0) < 0))
|
||||
break;
|
||||
|
||||
|
|
|
@ -6,9 +6,14 @@ PLATFORM_DEFINES = -DOS_PROBE_PCI_CHIPSET=lnxProbePciChipset
|
|||
PLATFORM_INCLUDES = -I$(srcdir)/../shared
|
||||
endif
|
||||
if LINUX_ALPHA
|
||||
PLATFORM_PCI_SUPPORT = lnx_ev56.c \
|
||||
noinst_LTLIBRARIES += liblinuxev56.la
|
||||
PLATFORM_PCI_SUPPORT = \
|
||||
$(srcdir)/lnx_axp.c \
|
||||
$(srcdir)/../shared/xf86Axp.c
|
||||
|
||||
liblinuxev56_la_CFLAGS = -mcpu=ev56
|
||||
|
||||
liblinuxev56_la_SOURCES = lnx_ev56.c
|
||||
endif
|
||||
|
||||
if LNXACPI
|
||||
|
@ -48,3 +53,7 @@ EXTRA_DIST = \
|
|||
$(LNX_EXTRA_SRCS) \
|
||||
lnx.h \
|
||||
$(srcdir)/../shared/xf86Axp.h
|
||||
|
||||
if LINUX_ALPHA
|
||||
liblinux_la_LIBADD = liblinuxev56.la
|
||||
endif
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
/* This file has to be built with -mcpu=ev56 */
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
# This file can be distributed under either the GNU General Public License
|
||||
# (version 2 or higher) or the 3-clause BSD License.
|
||||
#
|
||||
# Daily snapshot on Wed 2006-12-06 02:05:02
|
||||
# Daily snapshot on Thu 2007-01-18 02:05:01
|
||||
#
|
||||
|
||||
# Vendors, devices and subsystems. Please keep sorted.
|
||||
|
@ -23,11 +23,28 @@
|
|||
|
||||
0000 Gammagraphx, Inc.
|
||||
001a Ascend Communications, Inc.
|
||||
001c PEAK-System Technik GmbH
|
||||
0001 PCAN-PCI CAN-Bus controller
|
||||
0033 Paradyne corp.
|
||||
003d Lockheed Martin-Marietta Corp
|
||||
# Real TJN ID is e159, but they got it wrong several times --mj
|
||||
0059 Tiger Jet Network Inc. (Wrong ID)
|
||||
0070 Hauppauge computer works Inc.
|
||||
0003 WinTV PVR-250
|
||||
0009 WinTV PVR-150
|
||||
0801 WinTV PVR-150
|
||||
0807 WinTV PVR-150
|
||||
4000 WinTV PVR-350
|
||||
4001 WinTV PVR-250 (v1)
|
||||
4009 WinTV PVR-250
|
||||
4800 WinTV PVR-350
|
||||
4801 WinTV PVR-250 MCE
|
||||
4803 WinTV PVR-250
|
||||
8003 WinTV PVR-150
|
||||
8801 WinTV PVR-150
|
||||
c801 WinTV PVR-150
|
||||
e807 WinTV PVR-500 MCE (1st tuner)
|
||||
e817 WinTV PVR-500 MCE (2nd tuner)
|
||||
0071 Nebula Electronics Ltd.
|
||||
0095 Silicon Image, Inc. (Wrong ID)
|
||||
0680 Ultra ATA/133 IDE RAID CONTROLLER CARD
|
||||
|
@ -51,6 +68,7 @@
|
|||
0315 SK-Electronics Co., Ltd.
|
||||
0357 TTTech AG
|
||||
000a TTP-Monitoring Card V2.0
|
||||
0403 Future Technology Devices International Ltd
|
||||
0432 SCM Microsystems, Inc.
|
||||
0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
|
||||
045e Microsoft
|
||||
|
@ -63,6 +81,7 @@
|
|||
001a FSD7000 802.11g PCI Wireless card
|
||||
0109 F5U409-CU USB/Serial Portable Adapter
|
||||
7050 F5D7050 802.11g Wireless USB Adapter
|
||||
705c F5D7050 v4
|
||||
05a9 OmniVision
|
||||
8519 OV519 series
|
||||
05e3 CyberDoor
|
||||
|
@ -78,23 +97,42 @@
|
|||
067b Prolific Technology, Inc.
|
||||
2303 PL-2303 USB-to-Serial Converter
|
||||
3507 PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller
|
||||
069d Hughes Network Systems (HNS)
|
||||
0721 Sapphire, Inc.
|
||||
07ca AVerMedia Technologies Inc.
|
||||
b808 AVerTV DVB-T Volar (USB 2.0)
|
||||
07e2 ELMEG Communication Systems GmbH
|
||||
0842 NPG, Personal Grand Technology
|
||||
08ff AuthenTec
|
||||
afe4 [Anchor] AF-S2 FingerLoc Sensor Module
|
||||
# Wrong ID used in subsystem ID of VIA USB controllers.
|
||||
0925 VIA Technologies, Inc. (Wrong ID)
|
||||
093a PixArt Imaging Inc.
|
||||
010e Innovage Mini Digital Camera
|
||||
010f SDC-300 Webcam
|
||||
2468 CIF Single Chip
|
||||
2603 Philips Webcam SPC500NC
|
||||
2608 Maxell MaxCam RotaWeb
|
||||
09c1 Arris
|
||||
0704 CM 200E Cable Modem
|
||||
0a89 BREA Technologies Inc
|
||||
0ace ZyDAS
|
||||
1211 ZD1211 IEEE 802.11b+g USB Adapter
|
||||
0b0b Rhino Equiment Corp.
|
||||
0105 Rhino R1T1
|
||||
0205 Rhino R4FXO
|
||||
0206 RCB4FXO 4-channel FXO analog telphony card
|
||||
0305 Rhino R4T1
|
||||
0405 Rhino R8FXX
|
||||
0406 RCB8FXX 8-channel modular analog telphony card
|
||||
0505 Rhino R24FXX
|
||||
0506 Rhino R2T1
|
||||
0506 RCB24FXS 24-Channel FXS analog telphony card
|
||||
0605 Rhino R2T1
|
||||
0705 Rhino R24FXS
|
||||
0706 RCB24FXO 24-Channel FXO analog telphony card
|
||||
0905 R1T3 Single T3 Digital Telephony Card
|
||||
0906 RCB24FXX 24-channel modular analog telphony card
|
||||
0a06 RCB672FXX 672-channel modular analog telphony card
|
||||
0b49 ASCII Corporation
|
||||
064f Trance Vibrator
|
||||
0ccd TerraTec Electronic GmbH
|
||||
|
@ -288,16 +326,33 @@
|
|||
0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
|
||||
0050 SAS1064 PCI-X Fusion-MPT SAS
|
||||
0054 SAS1068 PCI-X Fusion-MPT SAS
|
||||
0055 SAS1068 PCI-X Fusion-MPT SAS
|
||||
1033 8336 SAS1068
|
||||
0056 SAS1064E PCI-Express Fusion-MPT SAS
|
||||
0058 SAS1068E PCI-Express Fusion-MPT SAS
|
||||
005a SAS1066E PCI-Express Fusion-MPT SAS
|
||||
005c SAS1064A PCI-X Fusion-MPT SAS
|
||||
005e SAS1066 PCI-X Fusion-MPT SAS
|
||||
0060 MegaRAID SAS 1078
|
||||
1000 1006 MegaRAID SAS 8888ELP
|
||||
1000 100a MegaRAID SAS 8708ELP
|
||||
1000 100e MegaRAID SAS 8884E
|
||||
1000 100f MegaRAID SAS 8708E
|
||||
1000 1010 MegaRAID SATA 350-8ELP
|
||||
1000 1011 MegaRAID SATA 350-4ELP
|
||||
1000 1012 MegaRAID SAS 8704ELP
|
||||
1014 0363 MegaRAID SAS PCI Express ROMB
|
||||
1014 0364 SystemX MegaRAID SAS 8808E
|
||||
1014 0365 SystemX MegaRAID SAS 8884E
|
||||
1028 1f0a PERC 6/E Adapter RAID Controller
|
||||
1028 1f0b PERC 6/i Adapter RAID Controller
|
||||
1028 1f0c PERC 6/i Integrated RAID Controller
|
||||
1028 1f0d PERC 6/i Enhanced RAID Controller
|
||||
1028 1f0d CERC 6/i Adapter RAID Controller
|
||||
1028 1f11 CERC 6/i Adapter RAID Controller
|
||||
1043 824d MegaRAID SAS PCI Express ROMB
|
||||
1170 002f MegaRAID SAS PCI Express ROMB
|
||||
8086 34cc Integrated RAID Controller SROMBSAS28E
|
||||
8086 34cd Integrated RAID Controller SROMBSAS28E
|
||||
0062 SAS1078 PCI-Express Fusion-MPT SAS
|
||||
1000 0062 SAS1078 PCI-Express Fusion-MPT SAS
|
||||
008f 53c875J
|
||||
|
@ -317,6 +372,9 @@
|
|||
1025 004d MegaRAID ACER ROMB-2E RAID Controller
|
||||
1028 0001 PowerEdge RAID Controller PERC4e/SC
|
||||
1028 0002 PowerEdge RAID Controller PERC4e/DC
|
||||
1028 0012 PowerEdge RAID Controller RAC4
|
||||
1028 0015 PowerEdge RAID Controller PERC5
|
||||
1028 1f03 PowerEdge RAID Controller PERC5
|
||||
1734 1065 FSC MegaRAID PCI Express ROMB
|
||||
8086 0002 MegaRAID Intel RAID Controller SRCU42E
|
||||
0409 MegaRAID
|
||||
|
@ -330,6 +388,7 @@
|
|||
1000 1002 MegaRAID SAS 8480E
|
||||
1000 1003 MegaRAID SAS 8344ELP
|
||||
1000 1004 MegaRAID SAS 8308ELP
|
||||
1000 1008 MegaRAID SAS 84016E
|
||||
1000 100c MegaRAID SATA 300-12E
|
||||
1000 100d MegaRAID SATA 300-16E
|
||||
1000 2004 MegaRAID SATA 300-8ELP
|
||||
|
@ -338,8 +397,8 @@
|
|||
1054 3016 MegaRAID SAS RoMB Server
|
||||
1734 1081 MegaRAID SAS PCI Express ROMB
|
||||
1734 10a3 MegaRAID SAS PCI Express ROMB
|
||||
8086 1001 SRCSAS18E RAID Controller
|
||||
8086 1003 SRCSAS144E RAID Controller
|
||||
8086 1001 RAID Controller SRCSAS18E
|
||||
8086 1003 RAID Controller SRCSAS144E
|
||||
8086 3500 SROMBSAS18E RAID Controller
|
||||
8086 3501 SROMBSAS18E RAID Controller
|
||||
8086 3504 SROMBSAS18E RAID Controller
|
||||
|
@ -509,7 +568,11 @@
|
|||
103c 308b MX6125
|
||||
4379 ATI 4379 Serial ATA Controller
|
||||
437a ATI 437A Serial ATA Controller
|
||||
1002 4379 ATI 4379 Serial ATA Controller
|
||||
1002 437a ATI 437A Serial ATA Controller
|
||||
14f1 8800 Leadtek WinFast TV2000XP Expert
|
||||
437b SB450 HDA Audio
|
||||
1734 10b8 Realtek High Definition Audio
|
||||
4380 SB600 Non-Raid-5 SATA
|
||||
4381 SB600 Raid-5 SATA
|
||||
4382 SB600 AC97 Audio
|
||||
|
@ -584,6 +647,7 @@
|
|||
1734 007a Primergy RX300
|
||||
8086 3411 SDS2 Mainboard
|
||||
8086 3427 S875WP1-E mainboard
|
||||
8086 5744 S845WD1-E mainboard
|
||||
4753 Rage XC
|
||||
1002 4753 Rage XC
|
||||
4754 3D Rage I/II 215GT [Mach64 GT]
|
||||
|
@ -711,10 +775,12 @@
|
|||
1025 005a TravelMate 290
|
||||
103c 088c NC8000 laptop
|
||||
103c 0890 NC6000 laptop
|
||||
144d c00c P35 notebook
|
||||
1462 0311 MSI M510A
|
||||
1734 1055 Amilo M1420W
|
||||
4e51 M10 NQ [Radeon Mobility 9600]
|
||||
4e52 RV350 [Mobility Radeon 9600 M10]
|
||||
144d c00c P35 notebook
|
||||
4e53 M10 NS [Radeon Mobility 9600]
|
||||
4e54 M10 NT [FireGL Mobility T2]
|
||||
4e56 M11 NV [FireGL Mobility T2e]
|
||||
|
@ -900,7 +966,7 @@
|
|||
554d R430 [Radeon X800 XL] (PCIe)
|
||||
554f R430 [Radeon X800 (PCIE)]
|
||||
5550 R423 [Fire GL V7100]
|
||||
5551 R423 UQ [FireGL V7200 (PCIE)]
|
||||
5551 R423 [FireGL V5100 (PCIE)]
|
||||
5552 R423 UR [FireGL V5100 (PCIE)]
|
||||
5554 R423 UT [FireGL V7100 (PCIE)]
|
||||
5569 R423 UI [Radeon X800PRO (PCIE)] Secondary
|
||||
|
@ -936,6 +1002,7 @@
|
|||
1025 0080 Aspire 5024WLMMi
|
||||
103c 308b MX6125
|
||||
5951 ATI Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge
|
||||
5952 RD580 [CrossFire Xpress 3200] Chipset Host Bridge
|
||||
5954 RS480 [Radeon Xpress 200G Series]
|
||||
1002 5954 RV370 [Radeon Xpress 200G Series]
|
||||
5955 ATI Radeon XPRESS 200M 5955 (PCIE)
|
||||
|
@ -954,6 +1021,7 @@
|
|||
18bc 0053 Radeon 9200 Game Buster VIVO
|
||||
5962 RV280 [Radeon 9200]
|
||||
5964 RV280 [Radeon 9200 SE]
|
||||
1002 5964 ATI Radeon 9200 SE, 64-bit 128MB DDR, 200/166MHz
|
||||
1043 c006 ASUS Radeon 9200 SE / TD / 128M
|
||||
1458 4018 Radeon 9200 SE
|
||||
1458 4032 Radeon 9200 SE 128MB
|
||||
|
@ -966,11 +1034,12 @@
|
|||
18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
|
||||
5969 ES1000
|
||||
5974 RS482 [Radeon Xpress 200]
|
||||
5975 RS482 [Radeon Xpress 200M]
|
||||
5975 RS485 [Radeon Xpress 1100 IGP]
|
||||
5a33 Radeon Xpress 200 Host Bridge
|
||||
5a34 RS480 PCI-X Root Port
|
||||
# Comes in pair with 5a3f
|
||||
5a36 RS480 PCI Bridge
|
||||
5a37 RS480 PCI Bridge
|
||||
5a38 RS480 PCI Bridge
|
||||
# Comes in pair with 5a38
|
||||
5a39 RS480 PCI Bridge
|
||||
|
@ -998,6 +1067,7 @@
|
|||
5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]
|
||||
5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]
|
||||
1002 5c63 Apple iBook G4 2004
|
||||
144d c00c P30 notebook
|
||||
5d44 RV280 [Radeon 9200 SE] (Secondary)
|
||||
1458 4019 Radeon 9200 SE (Secondary)
|
||||
1458 4032 Radeon 9200 SE 128MB
|
||||
|
@ -1052,11 +1122,13 @@
|
|||
1002 0323 All-in-Wonder X1800XL (Secondary)
|
||||
1002 0d03 Radeon X1800 CrossFire Edition (Secondary)
|
||||
7140 RV515 [Radeon X1600]
|
||||
7142 RV515 [Radeon X1300]
|
||||
7142 RV515 PRO [ATI Radeon X1300/X1550 Series]
|
||||
1002 0322 All-in-Wonder 2006 PCI-E Edition
|
||||
7143 RV505 [Radeon X1550 Series]
|
||||
7145 Radeon Mobility X1400
|
||||
7146 RV515 [Radeon X1300]
|
||||
1002 0322 All-in-Wonder 2006 PCI-E Edition
|
||||
7147 RV505 [Radeon X1550 64-bit]
|
||||
7149 M52 [ATI Mobility Radeon X1300]
|
||||
714a M52 [ATI Mobility Radeon X1300]
|
||||
714b M52 [ATI Mobility Radeon X1300]
|
||||
|
@ -1064,28 +1136,47 @@
|
|||
714d RV515 [Radeon X1300]
|
||||
714e RV515 [Radeon X1300]
|
||||
7152 RV515 GL ATI FireGL V3300 Primary
|
||||
7153 RV515GL [FireGL V3350]
|
||||
715e RV515 [Radeon X1300]
|
||||
7162 RV515 [Radeon X1300] (Secondary)
|
||||
715f RV505 CE [Radeon X1550 64-bit]
|
||||
7162 RV515 PRO [ATI Radeon X1300/X1550 Series Secondary]
|
||||
1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
|
||||
7166 RV515 [Radeon X1300] (Secondary)
|
||||
1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
|
||||
7172 RV515 GL ATI FireGL V3300 Secondary
|
||||
7180 RV516 Radeon X1300 Series Primary
|
||||
7173 RV515GL [FireGL V3350 Secondary]
|
||||
7180 RV516 [ATI Radeon X1300/X1550 Series]
|
||||
7181 RV516 XT Radeon X1600 Series Primary
|
||||
71a0 RV516 Radeon X1300 Series Secondary
|
||||
7183 RV516 [ATI Radeon X1300/X1550 Series]
|
||||
7187 RV516 [ATI Radeon X1300/X1550 Series]
|
||||
7188 M64-S [ATI Mobility Radeon X2300]
|
||||
718a ATI Mobility Radeon X2300
|
||||
718c M62CSP64 [ATI Mobility Radeon X1350]
|
||||
718d M64CSP128 [ATI Mobility Radeon X1450]
|
||||
7193 RV516 [Radeon X1550 Series]
|
||||
719b FireMV 2250
|
||||
719f RV516LE [Radeon X1550 64-bit]
|
||||
71a0 RV516 [ATI Radeon X1300/X1550 Series Secondary]
|
||||
71a1 RV516 XT Radeon X1600 Series Secondary
|
||||
71a3 RV516 [ATI Radeon X1300 Pro Secondary]
|
||||
71a7 RV516 [ATI Radeon X1300/X1550 Series Secondary]
|
||||
71bb FireMV 2250 Secondary
|
||||
71c0 RV530 [Radeon X1600]
|
||||
71c2 RV530 [Radeon X1600]
|
||||
71c4 M56GL [ATI Mobility FireGL V5200]
|
||||
17aa 2007 ThinkPad T60p
|
||||
71c5 M56P [Radeon Mobility X1600]
|
||||
71c6 RV530LE [Radeon X1600]
|
||||
71c7 RV535 [Radeon X1650 Series]
|
||||
71ce RV530LE [Radeon X1600]
|
||||
71d5 M66-P ATI Mobility Radeon X1700
|
||||
71d6 M66-XT ATI Mobility Radeon X1700
|
||||
71de RV530LE [Radeon X1600]
|
||||
71e0 RV530 [Radeon X1600] (Secondary)
|
||||
71e2 RV530 [Radeon X1600] (Secondary)
|
||||
71e7 RV535 [Radeon X1650 Series]
|
||||
7210 M71 [ATI Mobility Radeon X2100]
|
||||
7211 M71 [ATI Mobility Radeon X2100 Secondary]
|
||||
7240 R580 [Radeon X1900]
|
||||
7241 R580 [Radeon X1900]
|
||||
7242 R580 [Radeon X1900]
|
||||
|
@ -1098,15 +1189,29 @@
|
|||
7249 R580 [Radeon X1900 XT] Primary
|
||||
724a R580 [Radeon X1900]
|
||||
724b R580 [Radeon X1900]
|
||||
1002 0b12 Radeon X1900 Primary Display Device
|
||||
1002 0b13 Radeon X1900 Secondary Display Device
|
||||
724c R580 [Radeon X1900]
|
||||
724d R580 [Radeon X1900]
|
||||
724e R580 [FireGL V7300/V7350] Primary (PCIE)
|
||||
724e R580 [AMD Stream Processor]
|
||||
7269 R580 [Radeon X1900 XT] Secondary
|
||||
726e R580 [FireGL V7300/V7350] Secondary (PCIE)
|
||||
726b R580 [Radeon X1900]
|
||||
726e R580 [AMD Stream Processor Secondary]
|
||||
7280 ATI Radeon X1950 Pro Primary (PCIE)
|
||||
7288 ATI Radeon X1950 GT
|
||||
7291 ATI Radeon X1650 XT Primary (PCIE)
|
||||
7293 Radeon X1650 Series
|
||||
72a0 ATI Radeon X1950 Pro Secondary (PCIE)
|
||||
72a8 ATI Radeon X1950 GT Secondary
|
||||
72b1 ATI Radeon X1650 XT Secondary (PCIE)
|
||||
72b3 ATI Radeon X1650 Series Secondary
|
||||
7833 Radeon 9100 IGP Host Bridge
|
||||
7834 Radeon 9100 PRO IGP
|
||||
7835 Radeon Mobility 9200 IGP
|
||||
7838 Radeon 9100 IGP PCI/AGP Bridge
|
||||
791e ATI Radeon Xpress 1200 Series
|
||||
791f ATI Radeon Xpress 1200 Series
|
||||
793f ATI Radeon Xpress 1200 Series Secondary
|
||||
7c37 RV350 AQ [Radeon 9600 SE]
|
||||
cab0 AGP Bridge [IGP 320M]
|
||||
cab2 RS200/RS200M AGP Bridge [IGP 340M]
|
||||
|
@ -1556,6 +1661,8 @@
|
|||
2003 Am 1771 MBW [Alchemy]
|
||||
2020 53c974 [PCscsi]
|
||||
2040 79c974
|
||||
# CS5536 [Geode companion] Host Bridge
|
||||
2080 Conrad Kostecki
|
||||
2081 Geode LX Video
|
||||
2082 Geode LX AES Security Block
|
||||
208f CS5536 GeodeLink PCI South Bridge
|
||||
|
@ -1742,13 +1849,21 @@
|
|||
1028 0001 PowerEdge 2400
|
||||
0002 PowerEdge Expandable RAID Controller 3/Di
|
||||
1028 0002 PowerEdge 4400
|
||||
1028 00d1 PERC 3/DiV [Viper]
|
||||
1028 00d9 PERC 3/DiL [Lexus]
|
||||
0003 PowerEdge Expandable RAID Controller 3/Si
|
||||
1028 0003 PowerEdge 2450
|
||||
# PowerEdge Codename Iguana
|
||||
0004 PowerEdge Expandable RAID Controller 3/Di [Iguana]
|
||||
1028 0004 PERC 3/DiF [Iguana]
|
||||
0006 PowerEdge Expandable RAID Controller 3/Di
|
||||
0007 Remote Access Card III
|
||||
0008 Remote Access Card III
|
||||
0009 Remote Access Card III: BMC/SMIC device not present
|
||||
000a PowerEdge Expandable RAID Controller 3/Di
|
||||
1028 0106 PERC 3/DiJ [Jaguar]
|
||||
1028 011b PERC 3/DiD [Dagger]
|
||||
1028 0121 PERC 3/DiB [Boxster]
|
||||
000c Embedded Remote Access or ERA/O
|
||||
000d Embedded Remote Access: BMC/SMIC device
|
||||
000e PowerEdge Expandable RAID controller 4/Di
|
||||
|
@ -1764,6 +1879,9 @@
|
|||
1028 0170 PowerEdge Expandable RAID Controller 4e/Di
|
||||
0014 Remote Access Card 4 Daughter Card SMIC interface
|
||||
0015 PowerEdge Expandable RAID controller 5i
|
||||
1028 1f01 PERC 5/E Adapter RAID Controller
|
||||
1028 1f02 PERC 5/i Adapter RAID Controller
|
||||
1f03 PERC 5/i
|
||||
1029 Siemens Nixdorf IS
|
||||
102a LSI Logic
|
||||
0000 HYDRA
|
||||
|
@ -1964,6 +2082,7 @@
|
|||
102f 00f8 ATM Meteor 155
|
||||
0030 TC35815CF PCI 10/100 Mbit Ethernet Controller
|
||||
0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
|
||||
0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939
|
||||
0105 TC86C001 [goku-s] IDE
|
||||
0106 TC86C001 [goku-s] USB 1.1 Host
|
||||
0107 TC86C001 [goku-s] USB Device Controller
|
||||
|
@ -2107,6 +2226,7 @@
|
|||
1019 0a14 K7S5A motherboard
|
||||
1039 0900 SiS900 10/100 Ethernet Adapter
|
||||
1043 8035 CUSI-FX motherboard
|
||||
1462 0900 MS-6701 motherboard
|
||||
0961 SiS961 [MuTIOL Media IO]
|
||||
0962 SiS962 [MuTIOL Media IO]
|
||||
0963 SiS963 [MuTIOL Media IO]
|
||||
|
@ -2129,6 +2249,7 @@
|
|||
1019 0970 P6STP-FL motherboard
|
||||
1039 5513 SiS5513 EIDE Controller (A,B step)
|
||||
1043 8035 CUSI-FX motherboard
|
||||
1462 7010 MS-6701 motherboard
|
||||
5517 5517
|
||||
5571 5571
|
||||
5581 5581 Pentium Chipset
|
||||
|
@ -2161,10 +2282,14 @@
|
|||
1019 0a14 K7S5A motherboard
|
||||
1039 7000 Onboard USB Controller
|
||||
1462 5470 K7SOM+ 5.2C Motherboard
|
||||
1462 7010 MS-6701 motherboard
|
||||
7002 USB 2.0 Controller
|
||||
1462 7010 MS-6701 motherboard
|
||||
1509 7002 Onboard USB Controller
|
||||
7007 FireWire Controller
|
||||
1462 701d MS-6701
|
||||
7012 AC'97 Sound Controller
|
||||
1462 7010 MS-6701 motherboard
|
||||
15bd 1001 DFI 661FX motherboard
|
||||
# There are may be different modem codecs here (Intel537 compatible and incompatible)
|
||||
7013 AC'97 Modem Controller
|
||||
|
@ -2252,10 +2377,13 @@
|
|||
12ee PCI-X 2.0 Local Bus Adapter
|
||||
12f8 Broadcom BCM4306 802.11b/g Wireless LAN
|
||||
12fa BCM4306 802.11b/g Wireless LAN Controller
|
||||
1302 RMP-3 Shared Memory Driver
|
||||
1303 RMP-3 (Remote Management Processor)
|
||||
2910 E2910A PCIBus Exerciser
|
||||
2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
|
||||
3080 Pavilion ze2028ea
|
||||
3085 Realtek RTL8139/8139C/8139C+
|
||||
30b5 Compaq Presario V3000Z
|
||||
3220 Smart Array P600
|
||||
103c 3225 3 Gb/s SAS RAID
|
||||
3230 Smart Array Controller
|
||||
|
@ -2292,8 +2420,10 @@
|
|||
80c5 nForce3 chipset motherboard [SK8N]
|
||||
80df v9520 Magic/T
|
||||
815a A8N-SLI Motherboard nForce4 SATA
|
||||
8168 Realtek PCI-E Gigabit Ethernet Controller (RTL8111B)
|
||||
8187 802.11a/b/g Wireless LAN Card
|
||||
8188 Tiger Hybrid TV Capture Device
|
||||
81f4 EN7300TC512/TD/128M/A(C262G) [Graphics Card EN7300TC512]
|
||||
1044 Adaptec (formerly DPT)
|
||||
1012 Domino RAID Engine
|
||||
a400 SmartCache/Raid I-IV Controller
|
||||
|
@ -2444,6 +2574,7 @@
|
|||
8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
|
||||
103c 088c NC8000 laptop
|
||||
1043 808b K8N4-E Mainboard
|
||||
1043 815b P5W DH Deluxe Motherboard
|
||||
8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
|
||||
8025 TSB82AA2 IEEE-1394b Link Layer Controller
|
||||
1458 1000 GA-K8N Ultra-9 Mainboard
|
||||
|
@ -2483,14 +2614,17 @@
|
|||
8038 PCI6515 SmartCard Controller
|
||||
8039 PCIxx12 Cardbus Controller
|
||||
103c 309f nx9420
|
||||
103c 30a1 NC2400
|
||||
803a PCIxx12 OHCI Compliant IEEE 1394 Host Controller
|
||||
103c 309f nx9420
|
||||
103c 30a1 NC2400
|
||||
803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)
|
||||
103c 309f nx9420
|
||||
803c PCIxx12 SDA Standard Compliant SD Host Controller
|
||||
103c 309f nx9420
|
||||
803d PCIxx12 GemCore based SmartCard controller
|
||||
103c 309f nx9420
|
||||
103c 30a1 NC2400
|
||||
8201 PCI1620 Firmware Loading Function
|
||||
8204 PCI7410,7510,7610 PCI Firmware Loading Function
|
||||
1028 0139 Latitude D400
|
||||
|
@ -2548,6 +2682,7 @@
|
|||
ac42 PCI4451 PC card Cardbus Controller
|
||||
1028 00e6 PCI4451 PC card CardBus Controller (Inspiron 8100)
|
||||
ac44 PCI4510 PC card Cardbus Controller
|
||||
1028 0149 Inspiron 5100
|
||||
1028 0163 Latitude D505
|
||||
1028 0196 Inspiron 5160
|
||||
1071 8160 MIM2000
|
||||
|
@ -2560,7 +2695,7 @@
|
|||
1028 0139 Latitude D400
|
||||
1028 014e Latitude D800
|
||||
ac50 PCI1410 PC card Cardbus Controller
|
||||
ac51 PCI1420
|
||||
ac51 PCI1420 PC card Cardbus Controller
|
||||
0e11 004e Evo N600c
|
||||
1014 0148 ThinkPad A20m
|
||||
1014 023b ThinkPad T23 (2647-4MG)
|
||||
|
@ -2588,6 +2723,7 @@
|
|||
ac8d PCI 7620
|
||||
ac8e PCI7420 CardBus Controller
|
||||
ac8f PCI7420/7620 Combo CardBus, 1394a-2000 OHCI and SD/MS-Pro Controller
|
||||
1028 018d Inspiron 700m
|
||||
fe00 FireWire Host Controller
|
||||
fe03 12C01A FireWire Host Controller
|
||||
104d Sony Corporation
|
||||
|
@ -2673,6 +2809,7 @@
|
|||
ecc0 0072 Mona rev.2
|
||||
18c0 MPC8265A/8266/8272
|
||||
18c1 MPC8271/MPC8272
|
||||
3052 SM56 Data Fax Modem
|
||||
3055 SM56 Data Fax Modem
|
||||
3410 DSP56361 Digital Signal Processor
|
||||
ecc0 0050 Gina24 rev.0
|
||||
|
@ -2721,6 +2858,7 @@
|
|||
1059 Teknor Industrial Computers Inc
|
||||
105a Promise Technology, Inc.
|
||||
0d30 PDC20265 (FastTrak100 Lite/Ultra100)
|
||||
1043 8042 ASUS AV7266-E South Bridge Promise RAID
|
||||
105a 4d33 Ultra100
|
||||
0d38 20263
|
||||
105a 4d39 Fasttrak66
|
||||
|
@ -2749,6 +2887,7 @@
|
|||
4d30 PDC20267 (FastTrak100/Ultra100)
|
||||
105a 4d33 Ultra100
|
||||
105a 4d39 FastTrak100
|
||||
8086 5744 S845WD1-E mainboard
|
||||
4d33 20246
|
||||
105a 4d33 20246 IDE Controller
|
||||
4d38 PDC20262 (FastTrak66/Ultra66)
|
||||
|
@ -2777,7 +2916,12 @@
|
|||
7275 PDC20277 (SBFastTrak133 Lite)
|
||||
8002 SATAII150 SX8
|
||||
8350 80333 [SuperTrak EX8350/EX16350], 80331 [SuperTrak EX8300/EX16300]
|
||||
8650 IOP1348 [SuperTrak EX4650/EX8650/EX8654]
|
||||
105a 4600 SuperTrak EX4650
|
||||
105a 8601 SuperTrak EX8650
|
||||
105a 8602 SuperTrak EX8654
|
||||
c350 80333 [SuperTrak EX12350]
|
||||
e350 80333 [SuperTrak EX24350]
|
||||
105b Foxconn International, Inc.
|
||||
105c Wipro Infotech Limited
|
||||
105d Number 9 Computer Company
|
||||
|
@ -2990,6 +3134,7 @@
|
|||
0012 YMF-754 [DS-1E Audio Controller]
|
||||
1073 0012 DS-XG PCI Audio Codec
|
||||
0020 DS-1 Audio
|
||||
1000 SW1000XG [XG Factory]
|
||||
2000 DS2416 Digital Mixing Card
|
||||
1073 2000 DS2416 Digital Mixing Card
|
||||
1074 NexGen Microsystems
|
||||
|
@ -3021,7 +3166,7 @@
|
|||
103c 12dd 4Gb Fibre Channel [AB429A]
|
||||
2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA
|
||||
3022 ISP4022-based Ethernet NIC
|
||||
3032 ISP4032-based Ethernet NIC
|
||||
3032 ISP4032-based Ethernet IPv6 NIC
|
||||
4010 ISP4010-based iSCSI TOE HBA
|
||||
4022 ISP4022-based iSCSI TOE HBA
|
||||
4032 ISP4032-based iSCSI TOE IPv6 HBA
|
||||
|
@ -3329,6 +3474,7 @@
|
|||
13e9 0070 Win/TV (Audio Section)
|
||||
144f 3000 MagicTView CPH060 - Audio
|
||||
1461 0002 Avermedia PCTV98 Audio Capture
|
||||
1461 0003 UltraTV PCI 350
|
||||
1461 0004 AVerTV WDM Audio Capture
|
||||
1461 0761 AVerTV DVB-T
|
||||
1461 0771 AverMedia AVerTV DVB-T 771
|
||||
|
@ -3417,6 +3563,8 @@
|
|||
4002 TIO-CE PCI Express Port
|
||||
8001 O2 1394
|
||||
8002 G-net NT
|
||||
8010 Broadcom e-net [SGI IO9/IO10 BaseIO]
|
||||
8018 Broadcom e-net [SGI A330 Server BaseIO]
|
||||
10aa ACC Microelectronics
|
||||
0000 ACCM 2188
|
||||
10ab Digicom
|
||||
|
@ -3468,6 +3616,7 @@
|
|||
10b5 2978 SH ARC-PCIu SOHARD ARCNET card
|
||||
10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board
|
||||
10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board
|
||||
12fe 0111 CPCI-ASIO4 (ESD 4-port Serial Interface Board)
|
||||
1397 3136 4xS0-ISDN PCI Adapter
|
||||
1397 3137 S2M-E1-ISDN PCI Adapter
|
||||
1518 0200 Kontron ThinkIO-C
|
||||
|
@ -3522,6 +3671,7 @@
|
|||
10b5 2844 Innes Corp TVS Encoder card
|
||||
12c7 4001 Intel Dialogic DM/V960-4T1 PCI
|
||||
12d9 0002 PCI Prosody Card rev 1.5
|
||||
14b4 d100 Dektec DTA-100
|
||||
16df 0011 PIKA PrimeNet MM PCI
|
||||
16df 0012 PIKA PrimeNet MM cPCI 8
|
||||
16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling)
|
||||
|
@ -6060,6 +6210,7 @@
|
|||
0140 HT2100 PCI-Express Bridge
|
||||
0141 HT2100 PCI-Express Bridge
|
||||
0142 HT2100 PCI-Express Bridge
|
||||
0144 HT2100 PCI-Express Bridge
|
||||
0200 OSB4 South Bridge
|
||||
0201 CSB5 South Bridge
|
||||
4c53 1080 CT8 mainboard
|
||||
|
@ -10413,9 +10564,9 @@
|
|||
0962 80960RM [i960RM Bridge]
|
||||
0964 80960RP [i960 RP Microprocessor/Bridge]
|
||||
1000 82542 Gigabit Ethernet Controller
|
||||
0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX)
|
||||
0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX)
|
||||
0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX)
|
||||
0e11 b0df NC6132 Gigabit Ethernet Adapter (1000-SX)
|
||||
0e11 b0e0 NC6133 Gigabit Ethernet Adapter (1000-LX)
|
||||
0e11 b123 NC6134 Gigabit Ethernet Adapter (1000-LX)
|
||||
1014 0119 Netfinity Gigabit Ethernet SX Adapter
|
||||
8086 1000 PRO/1000 Gigabit Server Adapter
|
||||
1001 82543GC Gigabit Ethernet Controller (Fiber)
|
||||
|
@ -10834,6 +10985,8 @@
|
|||
8086 0006 82557 10/100 with Wake on LAN
|
||||
8086 0007 82558 10/100 Adapter
|
||||
8086 0008 82558 10/100 with Wake on LAN
|
||||
# 8086:0009 revision 5, 82558B based
|
||||
8086 0009 PRO/100+ PCI (TP)
|
||||
8086 000a EtherExpress PRO/100+ Management Adapter
|
||||
8086 000b EtherExpress PRO/100+
|
||||
8086 000c EtherExpress PRO/100+ Management Adapter
|
||||
|
@ -10909,6 +11062,7 @@
|
|||
8086 3010 EtherExpress PRO/100 S Network Connection
|
||||
8086 3011 EtherExpress PRO/100 S Network Connection
|
||||
8086 3012 EtherExpress PRO/100 Network Connection
|
||||
8086 301a S845WD1-E mainboard
|
||||
8086 3411 SDS2 Mainboard
|
||||
122d 430FX - 82437FX TSC [Triton I]
|
||||
122e 82371FB PIIX ISA [Triton I]
|
||||
|
@ -10996,6 +11150,7 @@
|
|||
2426 82801AB AC'97 Modem
|
||||
2428 82801AB PCI Bridge
|
||||
2440 82801BA ISA Bridge (LPC)
|
||||
8086 5744 S845WD1-E
|
||||
2442 82801BA/BAM USB (Hub #1)
|
||||
1014 01c6 Netvista A40/A40p
|
||||
1025 1016 Travelmate 612 TX
|
||||
|
@ -11006,6 +11161,7 @@
|
|||
147b 0507 TH7II-RAID
|
||||
8086 4532 D815EEA2 mainboard
|
||||
8086 4557 D815EGEW Mainboard
|
||||
8086 5744 S845WD1-E mainboard
|
||||
2443 82801BA/BAM SMBus
|
||||
1014 01c6 Netvista A40/A40p
|
||||
1025 1016 Travelmate 612 TX
|
||||
|
@ -11016,6 +11172,7 @@
|
|||
147b 0507 TH7II-RAID
|
||||
8086 4532 D815EEA2 mainboard
|
||||
8086 4557 D815EGEW Mainboard
|
||||
8086 5744 S845WD1-E mainboard
|
||||
2444 82801BA/BAM USB (Hub #2)
|
||||
1025 1016 Travelmate 612 TX
|
||||
1028 00c7 Dimension 8100
|
||||
|
@ -11024,6 +11181,7 @@
|
|||
104d 80df Vaio PCG-FX403
|
||||
147b 0507 TH7II-RAID
|
||||
8086 4532 D815EEA2 mainboard
|
||||
8086 5744 S845WD1-E mainboard
|
||||
2445 82801BA/BAM AC'97 Audio
|
||||
0e11 000b Compaq Deskpro EN Audio
|
||||
0e11 0088 Evo D500
|
||||
|
@ -11082,6 +11240,7 @@
|
|||
147b 0507 TH7II-RAID
|
||||
8086 4532 D815EEA2 mainboard
|
||||
8086 4557 D815EGEW Mainboard
|
||||
8086 5744 S845WD1-E mainboard
|
||||
244c 82801BAM ISA Bridge (LPC)
|
||||
244e 82801 PCI Bridge
|
||||
1014 0267 NetVista A30p
|
||||
|
@ -11174,6 +11333,7 @@
|
|||
103c 0890 NC6000 laptop
|
||||
103c 08b0 tc1100 tablet
|
||||
1071 8160 MIM2000
|
||||
144d c00c P30/P35 notebook
|
||||
1458 24c2 GA-8PE667 Ultra
|
||||
1462 5800 845PE Max (MS-6580)
|
||||
1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
|
||||
|
@ -11742,17 +11902,21 @@
|
|||
103c 099c NX6110/NC6120
|
||||
1043 1881 GMA 900 915GM Integrated Graphics
|
||||
27a0 Mobile 945GM/PM/GMS/940GML and 945GT Express Memory Controller Hub
|
||||
103c 30a1 NC2400
|
||||
17aa 2017 Thinkpad R60e model 0657
|
||||
27a1 Mobile 945GM/PM/GMS/940GML and 945GT Express PCI Express Root Port
|
||||
27a2 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller
|
||||
103c 30a1 NC2400
|
||||
17aa 201a Thinkpad R60e model 0657
|
||||
27a6 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller
|
||||
103c 30a1 NC2400
|
||||
17aa 201a Thinkpad R60e model 0657
|
||||
27b0 82801GH (ICH7DH) LPC Interface Bridge
|
||||
27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge
|
||||
107b 5048 E4500
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27b9 82801GBM (ICH7-M) LPC Interface Bridge
|
||||
103c 30a1 NC2400
|
||||
10f7 8338 Panasonic CF-Y5 laptop
|
||||
17aa 2009 ThinkPad T60/R60 series
|
||||
27bd 82801GHM (ICH7-M DH) LPC Interface Bridge
|
||||
|
@ -11766,22 +11930,27 @@
|
|||
17aa 200d Thinkpad R60e model 0657
|
||||
27c6 82801GHM (ICH7-M DH) Serial ATA Storage Controller RAID
|
||||
27c8 82801G (ICH7 Family) USB UHCI #1
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
17aa 200a ThinkPad T60/R60 series
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27c9 82801G (ICH7 Family) USB UHCI #2
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
17aa 200a ThinkPad T60/R60 series
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27ca 82801G (ICH7 Family) USB UHCI #3
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
17aa 200a ThinkPad T60/R60 series
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27cb 82801G (ICH7 Family) USB UHCI #4
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
17aa 200a ThinkPad T60/R60 series
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27cc 82801G (ICH7 Family) USB2 EHCI Controller
|
||||
103c 30a1 NC2400
|
||||
17aa 200b ThinkPad T60/R60 series
|
||||
8086 544e DeskTop Board D945GTP
|
||||
27d0 82801G (ICH7 Family) PCI Express Port 1
|
||||
|
@ -11789,10 +11958,12 @@
|
|||
27d4 82801G (ICH7 Family) PCI Express Port 3
|
||||
27d6 82801G (ICH7 Family) PCI Express Port 4
|
||||
27d8 82801G (ICH7 Family) High Definition Audio Controller
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
10f7 8338 Panasonic CF-Y5 laptop
|
||||
1179 ff31 Toshiba America Information Systems:AC97 Data Fax SoftModem with SmartCP
|
||||
152d 0753 Softmodem
|
||||
1734 10ad Conexant softmodem SmartCP
|
||||
17aa 2010 ThinkPad T60/R60 series
|
||||
27da 82801G (ICH7 Family) SMBus Controller
|
||||
10f7 8338 Panasonic CF-Y5 laptop
|
||||
|
@ -11803,6 +11974,7 @@
|
|||
27dd 82801G (ICH7 Family) AC'97 Modem Controller
|
||||
27de 82801G (ICH7 Family) AC'97 Audio Controller
|
||||
27df 82801G (ICH7 Family) IDE Controller
|
||||
103c 30a1 NC2400
|
||||
107b 5048 E4500
|
||||
10f7 8338 Panasonic CF-Y5 laptop
|
||||
17aa 200c Thinkpad R60e model 0657
|
||||
|
@ -11846,6 +12018,34 @@
|
|||
284b 82801H (ICH8 Family) HD Audio Controller
|
||||
284f 82801H (ICH8 Family) Thermal Reporting Device
|
||||
2850 Mobile IDE Controller
|
||||
2910 LPC Interface Controller
|
||||
2920 4 port SATA IDE Controller
|
||||
2921 2 port SATA IDE Controller
|
||||
2922 6 port SATA AHCI Controller
|
||||
2923 4 port SATA AHCI Controller
|
||||
2925 SATA RAID Controller
|
||||
2926 2 port SATA IDE Controller
|
||||
2928 Mobile 2 port SATA IDE Controller
|
||||
292d Mobile 2 port SATA IDE Controller
|
||||
292e Mobile 1 port SATA IDE Controller
|
||||
2930 SMBus Controller
|
||||
2932 Thermal Subsystem
|
||||
2934 USB UHCI Controller #1
|
||||
2935 USB UHCI Controller #2
|
||||
2936 USB UHCI Controller #3
|
||||
2937 USB UHCI Controller #4
|
||||
2938 USB UHCI Controller #5
|
||||
2939 USB UHCI Controller #6
|
||||
293a USB2 EHCI Controller #1
|
||||
293c USB2 EHCI Controller #2
|
||||
293e HD Audio Controller
|
||||
2940 PCI Express Port 1
|
||||
2942 PCI Express Port 2
|
||||
2944 PCI Express Port 3
|
||||
2946 PCI Express Port 4
|
||||
2948 PCI Express Port 5
|
||||
294a PCI Express Port 6
|
||||
294c Gigabit Ethernet Controller
|
||||
2970 82946GZ/PL/GL Memory Controller Hub
|
||||
2971 82946GZ/PL/GL PCI Express Root Port
|
||||
2972 82946GZ/GL Integrated Graphics Controller
|
||||
|
@ -11873,6 +12073,37 @@
|
|||
29a5 82P965/G965 HECI Controller
|
||||
29a6 82P965/G965 PT IDER Controller
|
||||
29a7 82P965/G965 KT Controller
|
||||
29b0 DRAM Controller
|
||||
29b1 PCI Express Root Port
|
||||
29b2 Integrated Graphics Controller
|
||||
29b3 Integrated Graphics Controller
|
||||
29b4 HECI Controller
|
||||
29b5 HECI Controller
|
||||
29b6 PT IDER Controller
|
||||
29b7 Serial KT Controller
|
||||
29c0 DRAM Controller
|
||||
29c1 PCI Express Root Port
|
||||
29c2 Integrated Graphics Controller
|
||||
29c3 Integrated Graphics Controller
|
||||
29c4 HECI Controller
|
||||
29c5 HECI Controller
|
||||
29c6 PT IDER Controller
|
||||
29c7 Serial KT Controller
|
||||
29cf Virtual HECI Controller
|
||||
29e0 DRAM Controller
|
||||
29e1 Host-Primary PCI Express Bridge
|
||||
29e4 HECI Controller
|
||||
29e5 HECI Controller
|
||||
29e6 PT IDER Controller
|
||||
29e7 Serial KT Controller
|
||||
29e9 Host-Secondary PCI Express Bridge
|
||||
29f0 Server DRAM Controller
|
||||
29f1 Server Host-Primary PCI Express Bridge
|
||||
29f4 Server HECI Controller
|
||||
29f5 Server HECI Controller
|
||||
29f6 Server PT IDER Controller
|
||||
29f7 Server Serial KT Controller
|
||||
29f9 Server Host-Secondary PCI Express Bridge
|
||||
2a00 Mobile Memory Controller Hub
|
||||
2a01 Mobile PCI Express Root Port
|
||||
2a02 Mobile Integrated Graphics Controller
|
||||
|
@ -11978,7 +12209,42 @@
|
|||
35b6 3100 Chipset PCI Express Port A
|
||||
35b7 3100 Chipset PCI Express Port A1
|
||||
35c8 3100 Extended Configuration Test Overflow Registers
|
||||
3600 Server Memory Controller Hub
|
||||
3604 Server PCI Express Port 1
|
||||
3605 Server PCI Express Port 2
|
||||
3606 Server PCI Express Port 3
|
||||
3607 Server PCI Express Port 4
|
||||
3608 Server PCI Express Port 5
|
||||
3609 Server PCI Express Port 6
|
||||
360a Server PCI Express Port 7
|
||||
360b Server IOAT DMA Controller
|
||||
360c Server FSB Registers
|
||||
360d Server Snoop Filter Registers
|
||||
360e Server Reserved Registers
|
||||
360f Server FBD Branch 0 Registers
|
||||
3610 Server FBD Branch 1 Registers
|
||||
4000 Memory Controller Hub
|
||||
4008 Memory Controller Hub
|
||||
4010 Memory Controller Hub
|
||||
4021 PCI Express Port 1
|
||||
4022 PCI Express Port 2
|
||||
4023 PCI Express Port 3
|
||||
4024 PCI Express Port 4
|
||||
4025 PCI Express Port 5
|
||||
4026 PCI Express Port 6
|
||||
4027 PCI Express Port 7
|
||||
4028 PCI Express Port 8
|
||||
4029 PCI Express Port 9
|
||||
402d IBIST Registers
|
||||
402e IBIST Registers
|
||||
402f DMA/DCA Engine
|
||||
4030 FSB Registers
|
||||
4032 I/OxAPIC
|
||||
4035 FBD Registers
|
||||
4036 FBD Registers
|
||||
4220 PRO/Wireless 2200BG Network Connection
|
||||
2731 8086 WLAN-Adapter
|
||||
8086 2731 Samsung P35 integrated WLAN
|
||||
4222 PRO/Wireless 3945ABG Network Connection
|
||||
8086 1005 PRO/Wireless 3945BG Network Connection
|
||||
8086 1034 PRO/Wireless 3945BG Network Connection
|
||||
|
@ -11994,6 +12260,23 @@
|
|||
5201 EtherExpress PRO/100 Intelligent Server
|
||||
8086 0001 EtherExpress PRO/100 Server Ethernet Adapter
|
||||
530d 80310 IOP [IO Processor]
|
||||
65c0 Memory Controller Hub
|
||||
65e2 PCI Express x4 Port 2
|
||||
65e3 PCI Express x4 Port 3
|
||||
65e4 PCI Express x4 Port 4
|
||||
65e5 PCI Express x4 Port 5
|
||||
65e6 PCI Express x4 Port 6
|
||||
65e7 PCI Express x4 Port 7
|
||||
65f0 FSB Registers
|
||||
65f1 Reserved Registers
|
||||
65f3 Reserved Registers
|
||||
65f5 DDR Channel 0 Registers
|
||||
65f6 DDR Channel 1 Registers
|
||||
65f7 PCI Express x8 Port 2-3
|
||||
65f8 PCI Express x8 Port 4-5
|
||||
65f9 PCI Express x8 Port 6-7
|
||||
65fa PCI Express x16 Port 4-7
|
||||
65ff DMA Engine
|
||||
7000 82371SB PIIX3 ISA [Natoma/Triton II]
|
||||
7010 82371SB PIIX3 IDE [Natoma/Triton II]
|
||||
7020 82371SB PIIX3 USB [Natoma/Triton II]
|
||||
|
@ -12092,6 +12375,7 @@
|
|||
9622 Integrated RAID
|
||||
9641 Integrated RAID
|
||||
96a1 Integrated RAID
|
||||
a620 6400/6402 Advanced Memory Buffer (AMB)
|
||||
b152 21152 PCI-to-PCI Bridge
|
||||
# observed, and documented in Intel revision note; new mask of 1011:0026
|
||||
b154 21154 PCI-to-PCI Bridge
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2129,7 +2129,7 @@ static void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
|||
uint srcoffset;
|
||||
|
||||
START_OF_INSTR();
|
||||
DECODE_PRINTF("BSF\n");
|
||||
DECODE_PRINTF("BSF\t");
|
||||
FETCH_DECODE_MODRM(mod, rh, rl);
|
||||
switch(mod) {
|
||||
case 0:
|
||||
|
@ -2209,25 +2209,25 @@ static void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
|
|||
break;
|
||||
case 3: /* register to register */
|
||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||
u32 *srcreg, *dstreg;
|
||||
u32 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
} else {
|
||||
u16 *srcreg, *dstreg;
|
||||
u16 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2245,7 +2245,7 @@ static void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
|||
uint srcoffset;
|
||||
|
||||
START_OF_INSTR();
|
||||
DECODE_PRINTF("BSF\n");
|
||||
DECODE_PRINTF("BSR\t");
|
||||
FETCH_DECODE_MODRM(mod, rh, rl);
|
||||
switch(mod) {
|
||||
case 0:
|
||||
|
@ -2325,25 +2325,25 @@ static void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
|
|||
break;
|
||||
case 3: /* register to register */
|
||||
if (M.x86.mode & SYSMODE_PREFIX_DATA) {
|
||||
u32 *srcreg, *dstreg;
|
||||
u32 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_LONG_REGISTER(rl);
|
||||
srcval = *DECODE_RM_LONG_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_LONG_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
} else {
|
||||
u16 *srcreg, *dstreg;
|
||||
u16 srcval, *dstreg;
|
||||
|
||||
srcreg = DECODE_RM_WORD_REGISTER(rl);
|
||||
srcval = *DECODE_RM_WORD_REGISTER(rl);
|
||||
DECODE_PRINTF(",");
|
||||
dstreg = DECODE_RM_WORD_REGISTER(rh);
|
||||
TRACE_AND_STEP();
|
||||
CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
|
||||
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
|
||||
for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
|
||||
if ((*srcreg >> *dstreg) & 1) break;
|
||||
if ((srcval >> *dstreg) & 1) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -27,128 +27,156 @@ libxf1bppgen_a_SOURCES = \
|
|||
mfbtileC.c \
|
||||
mfbtileG.c
|
||||
|
||||
DISTCLEANFILES = $(libxf1bppgen_a_SOURCES)
|
||||
|
||||
libxf1bppmfb_a_SOURCES = \
|
||||
$(top_srcdir)/mfb/maskbits.c \
|
||||
$(top_srcdir)/mfb/mfbbitblt.c \
|
||||
$(top_srcdir)/mfb/mfbbres.c \
|
||||
$(top_srcdir)/mfb/mfbbresd.c \
|
||||
$(top_srcdir)/mfb/mfbbstore.c \
|
||||
$(top_srcdir)/mfb/mfbclip.c \
|
||||
$(top_srcdir)/mfb/mfbcmap.c \
|
||||
$(top_srcdir)/mfb/mfbfillarc.c \
|
||||
$(top_srcdir)/mfb/mfbfillrct.c \
|
||||
$(top_srcdir)/mfb/mfbfillsp.c \
|
||||
$(top_srcdir)/mfb/mfbfont.c \
|
||||
$(top_srcdir)/mfb/mfbgc.c \
|
||||
$(top_srcdir)/mfb/mfbgetsp.c \
|
||||
$(top_srcdir)/mfb/mfbhrzvert.c \
|
||||
$(top_srcdir)/mfb/mfbimage.c \
|
||||
$(top_srcdir)/mfb/mfbline.c \
|
||||
$(top_srcdir)/mfb/mfbmisc.c \
|
||||
$(top_srcdir)/mfb/mfbpixmap.c \
|
||||
$(top_srcdir)/mfb/mfbpntwin.c \
|
||||
$(top_srcdir)/mfb/mfbpolypnt.c \
|
||||
$(top_srcdir)/mfb/mfbpushpxl.c \
|
||||
$(top_srcdir)/mfb/mfbscrclse.c \
|
||||
$(top_srcdir)/mfb/mfbscrinit.c \
|
||||
$(top_srcdir)/mfb/mfbsetsp.c \
|
||||
$(top_srcdir)/mfb/mfbwindow.c \
|
||||
$(top_srcdir)/mfb/mfbzerarc.c \
|
||||
maskbits.c \
|
||||
mfbbitblt.c \
|
||||
mfbbres.c \
|
||||
mfbbresd.c \
|
||||
mfbbstore.c \
|
||||
mfbclip.c \
|
||||
mfbcmap.c \
|
||||
mfbfillarc.c \
|
||||
mfbfillrct.c \
|
||||
mfbfillsp.c \
|
||||
mfbfont.c \
|
||||
mfbgc.c \
|
||||
mfbgetsp.c \
|
||||
mfbhrzvert.c \
|
||||
mfbimage.c \
|
||||
mfbline.c \
|
||||
mfbmisc.c \
|
||||
mfbpixmap.c \
|
||||
mfbpntwin.c \
|
||||
mfbpolypnt.c \
|
||||
mfbpushpxl.c \
|
||||
mfbscrclse.c \
|
||||
mfbscrinit.c \
|
||||
mfbsetsp.c \
|
||||
mfbwindow.c \
|
||||
mfbzerarc.c
|
||||
|
||||
BUILT_SOURCES = $(libxf1bppgen_a_SOURCES) $(libxf1bppgen_a_SOURCES)
|
||||
|
||||
libxf1bpp_la_SOURCES = $(libxf1bppmfb_a_SOURCES) $(libxf1bppgen_a_SOURCES) \
|
||||
mfbmodule.c
|
||||
|
||||
libxf1bpp_la_SOURCES = $(libxf1bppmfb_a_SOURCES) $(libxf1bppgen_a_SOURCES)
|
||||
|
||||
AM_CFLAGS = -DXF86MONO -include mfbmap.h $(DIX_CFLAGS) $(XORG_CFLAGS)
|
||||
AM_CFLAGS = -DXF86MONO $(DIX_CFLAGS) $(XORG_CFLAGS)
|
||||
INCLUDES = $(XORG_INCS) -I$(top_srcdir)/mfb
|
||||
|
||||
mfbseg.c:
|
||||
echo "#define POLYSEGMENT" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbline.c\"" >> $@
|
||||
mfbpgbwht.c:
|
||||
echo "#define MFBPOLYGLYPHBLT xf1bppPolyGlyphBltWhite" > $@
|
||||
echo "#define OPEQ |=" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbplygblt.c\"" >> $@
|
||||
mfbpgbblak.c:
|
||||
echo "#define MFBPOLYGLYPHBLT xf1bppPolyGlyphBltBlack" > $@
|
||||
echo "#define OPEQ &=~" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbplygblt.c\"" >> $@
|
||||
mfbpgbinv.c:
|
||||
echo "#define MFBPOLYGLYPHBLT xf1bppPolyGlyphBltInvert" > $@
|
||||
echo "#define OPEQ ^=" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbplygblt.c\"" >> $@
|
||||
mfbigbwht.c:
|
||||
echo "#define MFBIMAGEGLYPHBLT xf1bppImageGlyphBltWhite" > $@
|
||||
echo "#define OPEQ |=" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbimggblt.c\"" >> $@
|
||||
mfbigbblak.c:
|
||||
echo "#define MFBIMAGEGLYPHBLT xf1bppImageGlyphBltBlack" > $@
|
||||
echo "#define OPEQ &=~" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbimggblt.c\"" >> $@
|
||||
mfbpawhite.c:
|
||||
echo "#define MFBSOLIDFILLAREA xf1bppSolidWhiteArea" > $@
|
||||
echo "#define MFBSTIPPLEFILLAREA xf1bppStippleWhiteArea" >> $@
|
||||
echo "#define OPEQ |=" >> $@
|
||||
echo "#define EQWHOLEWORD =~0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbpntarea.c\"" >> $@
|
||||
mfbpablack.c:
|
||||
echo "#define MFBSOLIDFILLAREA xf1bppSolidBlackArea" > $@
|
||||
echo "#define MFBSTIPPLEFILLAREA xf1bppStippleBlackArea" >> $@
|
||||
echo "#define OPEQ &=~" >> $@
|
||||
echo "#define EQWHOLEWORD =0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbpntarea.c\"" >> $@
|
||||
mfbpainv.c:
|
||||
echo "#define MFBSOLIDFILLAREA xf1bppSolidInvertArea" > $@
|
||||
echo "#define MFBSTIPPLEFILLAREA xf1bppStippleInvertArea" >> $@
|
||||
echo "#define OPEQ ^=" >> $@
|
||||
echo "#define EQWHOLEWORD ^=~0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbpntarea.c\"" >> $@
|
||||
mfbtewhite.c:
|
||||
echo "#define OP" > $@
|
||||
echo "#define CLIPTETEXT xf1bppImageGlyphBltWhite" >> $@
|
||||
echo "#define MFBTEGLYPHBLT xf1bppTEGlyphBltWhite" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbtegblt.c\"" >> $@
|
||||
mfbteblack.c:
|
||||
echo "#define OP ~" > $@
|
||||
echo "#define CLIPTETEXT xf1bppImageGlyphBltBlack" >> $@
|
||||
echo "#define MFBTEGLYPHBLT xf1bppTEGlyphBltBlack" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbtegblt.c\"" >> $@
|
||||
mfbplywhite.c:
|
||||
echo "#define MFBFILLPOLY1RECT xf1bppFillPolyWhite" > $@
|
||||
echo "#define OPEQ |=" >> $@
|
||||
echo "#define EQWHOLEWORD =~0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbply1rct.c\"" >> $@
|
||||
mfbplyblack.c:
|
||||
echo "#define MFBFILLPOLY1RECT xf1bppFillPolyBlack" > $@
|
||||
echo "#define OPEQ &=~" >> $@
|
||||
echo "#define EQWHOLEWORD =0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbply1rct.c\"" >> $@
|
||||
mfbplyinv.c:
|
||||
echo "#define MFBFILLPOLY1RECT xf1bppFillPolyInvert" > $@
|
||||
echo "#define OPEQ ^=" >> $@
|
||||
echo "#define EQWHOLEWORD ^=~0" >> $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbply1rct.c\"" >> $@
|
||||
mfbbltC.c:
|
||||
echo "#define MROP Mcopy" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbblt.c\"" >> $@
|
||||
mfbbltX.c:
|
||||
echo "#define MROP Mxor" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbblt.c\"" >> $@
|
||||
mfbbltCI.c:
|
||||
echo "#define MROP McopyInverted" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbblt.c\"" >> $@
|
||||
mfbbltO.c:
|
||||
echo "#define MROP Mor" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbblt.c\"" >> $@
|
||||
mfbbltG.c:
|
||||
echo "#define MROP M0" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbblt.c\"" >> $@
|
||||
mfbtileC.c:
|
||||
echo "#define MROP Mcopy" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbtile.c\"" >> $@
|
||||
mfbtileG.c:
|
||||
echo "#define MRop M0" > $@
|
||||
echo "#include \"mfbmap.h\"" >> $@
|
||||
echo "#include \"$(top_srcdir)/mfb/mfbtile.c\"" >> $@
|
||||
|
||||
$(libxf1bppmfb_a_SOURCES):
|
||||
for i in $(libxf1bppmfb_a_SOURCES) ; do \
|
||||
echo "#include \"mfbmap.h\"" > $$i ; \
|
||||
echo "#include \"$(top_srcdir)/mfb/$$i\"" >> $$i ; \
|
||||
done
|
||||
|
||||
|
||||
EXTRA_DIST = mfbmap.sh mfbunmap.sh
|
||||
|
|
|
@ -93,6 +93,9 @@
|
|||
/* Define to 1 if you have the <asm/mtrr.h> header file. */
|
||||
#undef HAVE_ASM_MTRR_H
|
||||
|
||||
/* Define to 1 if you have the <byteswap.h> header file. */
|
||||
#undef HAVE_BYTESWAP_H
|
||||
|
||||
/* Define to 1 if you have the <dbm.h> header file. */
|
||||
#undef HAVE_DBM_H
|
||||
|
||||
|
@ -311,6 +314,9 @@
|
|||
/* Use rgb.txt directly */
|
||||
#undef USE_RGB_TXT
|
||||
|
||||
/* Define to use byteswap macros from <sys/endian.h> */
|
||||
#undef USE_SYS_ENDIAN_H
|
||||
|
||||
/* unaligned word accesses behave as expected */
|
||||
#undef WORKING_UNALIGNED_INT
|
||||
|
||||
|
@ -413,16 +419,8 @@
|
|||
/* Endian order */
|
||||
#undef X_BYTE_ORDER
|
||||
|
||||
/* BSD-compliant source */
|
||||
#undef _BSD_SOURCE
|
||||
|
||||
/* POSIX-compliant source */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
#ifndef _XOPEN_SOURCE
|
||||
/* X/Open-compliant source */
|
||||
#undef _XOPEN_SOURCE
|
||||
#endif
|
||||
/* Enable GNU and other extensions to the C environment for GLIBC */
|
||||
#undef _GNU_SOURCE
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
@ -469,4 +467,13 @@
|
|||
/* Path to XErrorDB file */
|
||||
#undef XERRORDB_PATH
|
||||
|
||||
/* Define to 16-bit byteswap macro */
|
||||
#undef bswap_16
|
||||
|
||||
/* Define to 32-bit byteswap macro */
|
||||
#undef bswap_32
|
||||
|
||||
/* Define to 64-bit byteswap macro */
|
||||
#undef bswap_64
|
||||
|
||||
#endif /* _DIX_CONFIG_H_ */
|
||||
|
|
13
mi/mieq.c
13
mi/mieq.c
|
@ -59,6 +59,12 @@ in this Software without prior written authorization from The Open Group.
|
|||
# include "extinit.h"
|
||||
# include "exglobals.h"
|
||||
|
||||
#ifdef DPMSExtension
|
||||
# include "dpmsproc.h"
|
||||
# define DPMS_SERVER
|
||||
# include <X11/extensions/dpms.h>
|
||||
#endif
|
||||
|
||||
#define QUEUE_SIZE 256
|
||||
|
||||
typedef struct _Event {
|
||||
|
@ -193,6 +199,13 @@ mieqProcessInputEvents()
|
|||
while (miEventQueue.head != miEventQueue.tail) {
|
||||
if (screenIsSaved == SCREEN_SAVER_ON)
|
||||
SaveScreens (SCREEN_SAVER_OFF, ScreenSaverReset);
|
||||
#ifdef DPMSExtension
|
||||
else if (DPMSPowerLevel != DPMSModeOn)
|
||||
SetScreenSaverTimer();
|
||||
|
||||
if (DPMSPowerLevel != DPMSModeOn)
|
||||
DPMSSet(DPMSModeOn);
|
||||
#endif
|
||||
|
||||
e = &miEventQueue.events[miEventQueue.head];
|
||||
/* Assumption - screen switching can only occur on motion events. */
|
||||
|
|
|
@ -113,6 +113,52 @@ getDrawableDamageRef (DrawablePtr pDrawable)
|
|||
DamagePtr *pPrev = (DamagePtr *) \
|
||||
&(pWindow->devPrivates[damageWinPrivateIndex].ptr)
|
||||
|
||||
static void
|
||||
DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
|
||||
{
|
||||
BoxRec tmpBox;
|
||||
RegionRec tmpRegion;
|
||||
Bool was_empty;
|
||||
|
||||
switch (pDamage->damageLevel) {
|
||||
case DamageReportRawRegion:
|
||||
(*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
|
||||
break;
|
||||
case DamageReportDeltaRegion:
|
||||
REGION_NULL (pScreen, &tmpRegion);
|
||||
REGION_SUBTRACT (pScreen, &tmpRegion, pDamageRegion, &pDamage->damage);
|
||||
if (REGION_NOTEMPTY (pScreen, &tmpRegion)) {
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
(*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
|
||||
}
|
||||
REGION_UNINIT(pScreen, &tmpRegion);
|
||||
break;
|
||||
case DamageReportBoundingBox:
|
||||
tmpBox = *REGION_EXTENTS (pScreen, &pDamage->damage);
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
if (!BOX_SAME (&tmpBox, REGION_EXTENTS (pScreen, &pDamage->damage))) {
|
||||
(*pDamage->damageReport) (pDamage, &pDamage->damage,
|
||||
pDamage->closure);
|
||||
}
|
||||
break;
|
||||
case DamageReportNonEmpty:
|
||||
was_empty = !REGION_NOTEMPTY(pScreen, &pDamage->damage);
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
if (was_empty && REGION_NOTEMPTY(pScreen, &pDamage->damage)) {
|
||||
(*pDamage->damageReport) (pDamage, &pDamage->damage,
|
||||
pDamage->closure);
|
||||
}
|
||||
break;
|
||||
case DamageReportNone:
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if DAMAGE_DEBUG_ENABLE
|
||||
static void
|
||||
_damageDamageRegion (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip, int subWindowMode, const char *where)
|
||||
|
@ -130,9 +176,6 @@ damageDamageRegion (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
|
|||
RegionRec clippedRec;
|
||||
RegionPtr pDamageRegion;
|
||||
RegionRec pixClip;
|
||||
Bool was_empty;
|
||||
RegionRec tmpRegion;
|
||||
BoxRec tmpBox;
|
||||
int draw_x, draw_y;
|
||||
#ifdef COMPOSITE
|
||||
int screen_x = 0, screen_y = 0;
|
||||
|
@ -256,41 +299,18 @@ damageDamageRegion (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
|
|||
*/
|
||||
if (draw_x || draw_y)
|
||||
REGION_TRANSLATE (pScreen, pDamageRegion, -draw_x, -draw_y);
|
||||
|
||||
switch (pDamage->damageLevel) {
|
||||
case DamageReportRawRegion:
|
||||
(*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
|
||||
break;
|
||||
case DamageReportDeltaRegion:
|
||||
REGION_NULL (pScreen, &tmpRegion);
|
||||
REGION_SUBTRACT (pScreen, &tmpRegion, pDamageRegion, &pDamage->damage);
|
||||
if (REGION_NOTEMPTY (pScreen, &tmpRegion))
|
||||
{
|
||||
REGION_UNION(pScreen, &pDamage->damage,
|
||||
&pDamage->damage, pDamageRegion);
|
||||
(*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
|
||||
}
|
||||
REGION_UNINIT(pScreen, &tmpRegion);
|
||||
break;
|
||||
case DamageReportBoundingBox:
|
||||
tmpBox = *REGION_EXTENTS (pScreen, &pDamage->damage);
|
||||
REGION_UNION(pScreen, &pDamage->damage,
|
||||
&pDamage->damage, pDamageRegion);
|
||||
if (!BOX_SAME (&tmpBox, REGION_EXTENTS (pScreen, &pDamage->damage)))
|
||||
(*pDamage->damageReport) (pDamage, &pDamage->damage, pDamage->closure);
|
||||
break;
|
||||
case DamageReportNonEmpty:
|
||||
was_empty = !REGION_NOTEMPTY(pScreen, &pDamage->damage);
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
if (was_empty && REGION_NOTEMPTY(pScreen, &pDamage->damage))
|
||||
(*pDamage->damageReport) (pDamage, &pDamage->damage, pDamage->closure);
|
||||
break;
|
||||
case DamageReportNone:
|
||||
REGION_UNION(pScreen, &pDamage->damage, &pDamage->damage,
|
||||
pDamageRegion);
|
||||
break;
|
||||
|
||||
/* If the damage rec has been flagged to report damage after the op has
|
||||
* completed, then union it into the delayed damage region, which will
|
||||
* be used for reporting after calling down, and skip the reporting
|
||||
*/
|
||||
if (!pDamage->reportAfter) {
|
||||
DamageReportDamage (pDamage, pDamageRegion);
|
||||
} else {
|
||||
REGION_UNION(pScreen, &pDamage->pendingDamage,
|
||||
&pDamage->pendingDamage, pDamageRegion);
|
||||
}
|
||||
|
||||
/*
|
||||
* translate original region back
|
||||
*/
|
||||
|
@ -305,6 +325,21 @@ damageDamageRegion (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
|
|||
REGION_UNINIT (pScreen, &clippedRec);
|
||||
}
|
||||
|
||||
static void
|
||||
damageReportPostOp (DrawablePtr pDrawable)
|
||||
{
|
||||
drawableDamage(pDrawable);
|
||||
|
||||
for (; pDamage != NULL; pDamage = pDamage->pNext)
|
||||
{
|
||||
if (pDamage->reportAfter) {
|
||||
DamageReportDamage (pDamage, &pDamage->pendingDamage);
|
||||
REGION_EMPTY (pScreen, &pDamage->pendingDamage);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if DAMAGE_DEBUG_ENABLE
|
||||
#define damageDamageBox(d,b,m) _damageDamageBox(d,b,m,__FUNCTION__)
|
||||
static void
|
||||
|
@ -550,6 +585,7 @@ damageComposite (CARD8 op,
|
|||
yDst,
|
||||
width,
|
||||
height);
|
||||
damageReportPostOp (pDst->pDrawable);
|
||||
wrap (pScrPriv, ps, Composite, damageComposite);
|
||||
}
|
||||
|
||||
|
@ -616,6 +652,7 @@ damageGlyphs (CARD8 op,
|
|||
}
|
||||
unwrap (pScrPriv, ps, Glyphs);
|
||||
(*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
|
||||
damageReportPostOp (pDst->pDrawable);
|
||||
wrap (pScrPriv, ps, Glyphs, damageGlyphs);
|
||||
}
|
||||
#endif
|
||||
|
@ -668,6 +705,7 @@ damageFillSpans(DrawablePtr pDrawable,
|
|||
|
||||
(*pGC->ops->FillSpans)(pDrawable, pGC, npt, ppt, pwidth, fSorted);
|
||||
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -715,6 +753,7 @@ damageSetSpans(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->SetSpans)(pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -746,6 +785,7 @@ damagePutImage(DrawablePtr pDrawable,
|
|||
}
|
||||
(*pGC->ops->PutImage)(pDrawable, pGC, depth, x, y, w, h,
|
||||
leftPad, format, pImage);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -789,6 +829,7 @@ damageCopyArea(DrawablePtr pSrc,
|
|||
|
||||
ret = (*pGC->ops->CopyArea)(pSrc, pDst,
|
||||
pGC, srcx, srcy, width, height, dstx, dsty);
|
||||
damageReportPostOp (pDst);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
|
||||
return ret;
|
||||
}
|
||||
|
@ -834,6 +875,7 @@ damageCopyPlane(DrawablePtr pSrc,
|
|||
|
||||
ret = (*pGC->ops->CopyPlane)(pSrc, pDst,
|
||||
pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
|
||||
damageReportPostOp (pDst);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
|
||||
return ret;
|
||||
}
|
||||
|
@ -875,6 +917,7 @@ damagePolyPoint(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PolyPoint)(pDrawable, pGC, mode, npt, ppt);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -948,6 +991,7 @@ damagePolylines(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->Polylines)(pDrawable, pGC, mode, npt, ppt);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1026,6 +1070,7 @@ damagePolySegment(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PolySegment)(pDrawable, pGC, nSeg, pSeg);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1087,6 +1132,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
|
|||
}
|
||||
}
|
||||
(*pGC->ops->PolyRectangle)(pDrawable, pGC, nRects, pRects);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1139,6 +1185,7 @@ damagePolyArc(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PolyArc)(pDrawable, pGC, nArcs, pArcs);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1197,6 +1244,7 @@ damageFillPolygon(DrawablePtr pDrawable,
|
|||
}
|
||||
|
||||
(*pGC->ops->FillPolygon)(pDrawable, pGC, shape, mode, npt, ppt);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1235,6 +1283,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PolyFillRect)(pDrawable, pGC, nRects, pRects);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1276,6 +1325,7 @@ damagePolyFillArc(DrawablePtr pDrawable,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PolyFillArc)(pDrawable, pGC, nArcs, pArcs);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1386,6 +1436,7 @@ damagePolyText8(DrawablePtr pDrawable,
|
|||
Linear8Bit, TT_POLY8);
|
||||
else
|
||||
x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
return x;
|
||||
}
|
||||
|
@ -1406,6 +1457,7 @@ damagePolyText16(DrawablePtr pDrawable,
|
|||
TT_POLY16);
|
||||
else
|
||||
x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
return x;
|
||||
}
|
||||
|
@ -1425,6 +1477,7 @@ damageImageText8(DrawablePtr pDrawable,
|
|||
Linear8Bit, TT_IMAGE8);
|
||||
else
|
||||
(*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1444,6 +1497,7 @@ damageImageText16(DrawablePtr pDrawable,
|
|||
TT_IMAGE16);
|
||||
else
|
||||
(*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1462,6 +1516,7 @@ damageImageGlyphBlt(DrawablePtr pDrawable,
|
|||
nglyph, ppci, TRUE, pGC->subWindowMode);
|
||||
(*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, nglyph,
|
||||
ppci, pglyphBase);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1479,6 +1534,7 @@ damagePolyGlyphBlt(DrawablePtr pDrawable,
|
|||
nglyph, ppci, FALSE, pGC->subWindowMode);
|
||||
(*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, nglyph,
|
||||
ppci, pglyphBase);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1512,6 +1568,7 @@ damagePushPixels(GCPtr pGC,
|
|||
damageDamageBox (pDrawable, &box, pGC->subWindowMode);
|
||||
}
|
||||
(*pGC->ops->PushPixels)(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
|
||||
damageReportPostOp (pDrawable);
|
||||
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
|
||||
}
|
||||
|
||||
|
@ -1591,10 +1648,12 @@ damagePaintWindow(WindowPtr pWindow,
|
|||
if(what == PW_BACKGROUND) {
|
||||
unwrap (pScrPriv, pScreen, PaintWindowBackground);
|
||||
(*pScreen->PaintWindowBackground) (pWindow, prgn, what);
|
||||
damageReportPostOp (&pWindow->drawable);
|
||||
wrap (pScrPriv, pScreen, PaintWindowBackground, damagePaintWindow);
|
||||
} else {
|
||||
unwrap (pScrPriv, pScreen, PaintWindowBorder);
|
||||
(*pScreen->PaintWindowBorder) (pWindow, prgn, what);
|
||||
damageReportPostOp (&pWindow->drawable);
|
||||
wrap (pScrPriv, pScreen, PaintWindowBorder, damagePaintWindow);
|
||||
}
|
||||
}
|
||||
|
@ -1623,6 +1682,7 @@ damageCopyWindow(WindowPtr pWindow,
|
|||
}
|
||||
unwrap (pScrPriv, pScreen, CopyWindow);
|
||||
(*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
|
||||
damageReportPostOp (&pWindow->drawable);
|
||||
wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow);
|
||||
}
|
||||
|
||||
|
@ -1654,6 +1714,7 @@ damageRestoreAreas (PixmapPtr pPixmap,
|
|||
unwrap (pScrPriv, pScreen, BackingStoreFuncs.RestoreAreas);
|
||||
(*pScreen->BackingStoreFuncs.RestoreAreas) (pPixmap, prgn,
|
||||
xorg, yorg, pWindow);
|
||||
damageReportPostOp (&pWindow->drawable);
|
||||
wrap (pScrPriv, pScreen, BackingStoreFuncs.RestoreAreas,
|
||||
damageRestoreAreas);
|
||||
}
|
||||
|
@ -1820,12 +1881,14 @@ DamageCreate (DamageReportFunc damageReport,
|
|||
pDamage->pNext = 0;
|
||||
pDamage->pNextWin = 0;
|
||||
REGION_NULL(pScreen, &pDamage->damage);
|
||||
REGION_NULL(pScreen, &pDamage->pendingDamage);
|
||||
|
||||
pDamage->damageLevel = damageLevel;
|
||||
pDamage->isInternal = isInternal;
|
||||
pDamage->closure = closure;
|
||||
pDamage->isWindow = FALSE;
|
||||
pDamage->pDrawable = 0;
|
||||
pDamage->reportAfter = FALSE;
|
||||
|
||||
pDamage->damageReport = damageReport;
|
||||
pDamage->damageDestroy = damageDestroy;
|
||||
|
@ -1909,6 +1972,7 @@ DamageDestroy (DamagePtr pDamage)
|
|||
if (pDamage->damageDestroy)
|
||||
(*pDamage->damageDestroy) (pDamage, pDamage->closure);
|
||||
REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->damage);
|
||||
REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->pendingDamage);
|
||||
xfree (pDamage);
|
||||
}
|
||||
|
||||
|
@ -1962,4 +2026,16 @@ DamageDamageRegion (DrawablePtr pDrawable,
|
|||
RegionPtr pRegion)
|
||||
{
|
||||
damageDamageRegion (pDrawable, pRegion, FALSE, -1);
|
||||
|
||||
/* Go back and report this damage for DamagePtrs with reportAfter set, since
|
||||
* this call isn't part of an in-progress drawing op in the call chain and
|
||||
* the DDX probably just wants to know about it right away.
|
||||
*/
|
||||
damageReportPostOp (pDrawable);
|
||||
}
|
||||
|
||||
void
|
||||
DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter)
|
||||
{
|
||||
pDamage->reportAfter = reportAfter;
|
||||
}
|
||||
|
|
|
@ -81,4 +81,7 @@ void
|
|||
DamageDamageRegion (DrawablePtr pDrawable,
|
||||
const RegionPtr pRegion);
|
||||
|
||||
void
|
||||
DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter);
|
||||
|
||||
#endif /* _DAMAGE_H_ */
|
||||
|
|
|
@ -48,6 +48,9 @@ typedef struct _damage {
|
|||
|
||||
DamageReportFunc damageReport;
|
||||
DamageDestroyFunc damageDestroy;
|
||||
|
||||
Bool reportAfter;
|
||||
RegionRec pendingDamage;
|
||||
} DamageRec;
|
||||
|
||||
typedef struct _damageScrPriv {
|
||||
|
|
|
@ -337,10 +337,7 @@ WaitForSomething(int *pClientsReady)
|
|||
if (XFD_ANYSET(&tmp_set))
|
||||
QueueWorkProc(EstablishNewConnections, NULL,
|
||||
(pointer)&LastSelectMask);
|
||||
#ifdef DPMSExtension
|
||||
if (XFD_ANYSET (&devicesReadable) && (DPMSPowerLevel != DPMSModeOn))
|
||||
DPMSSet(DPMSModeOn);
|
||||
#endif
|
||||
|
||||
if (XFD_ANYSET (&devicesReadable) || XFD_ANYSET (&clientsReadable))
|
||||
break;
|
||||
#ifdef WIN32
|
||||
|
|
18
os/utils.c
18
os/utils.c
|
@ -53,23 +53,6 @@ OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
/* The world's most shocking hack, to ensure we get clock_gettime() and
|
||||
* CLOCK_MONOTONIC. */
|
||||
#ifdef sun /* Needed to tell Solaris headers not to restrict to */
|
||||
#define __EXTENSIONS__ /* only the functions defined in POSIX 199309. */
|
||||
#endif
|
||||
|
||||
#ifdef _POSIX_C_SOURCE
|
||||
#define _SAVED_POSIX_C_SOURCE _POSIX_C_SOURCE
|
||||
#undef _POSIX_C_SOURCE
|
||||
#endif
|
||||
#define _POSIX_C_SOURCE 199309L
|
||||
#include <time.h>
|
||||
#undef _POSIX_C_SOURCE
|
||||
#ifdef _SAVED_POSIX_C_SOURCE
|
||||
#define _POSIX_C_SOURCE _SAVED_POSIX_C_SOURCE
|
||||
#endif
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
|
@ -80,6 +63,7 @@ OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#endif
|
||||
#include <X11/Xos.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "misc.h"
|
||||
#include <X11/X.h>
|
||||
#define XSERV_t
|
||||
|
|
|
@ -243,6 +243,10 @@ Bool RRScreenInit(ScreenPtr pScreen)
|
|||
pScrPriv->maxWidth = pScrPriv->minWidth = pScreen->width;
|
||||
pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
|
||||
|
||||
pScrPriv->width = pScreen->width;
|
||||
pScrPriv->height = pScreen->height;
|
||||
pScrPriv->mmWidth = pScreen->mmWidth;
|
||||
pScrPriv->mmHeight = pScreen->mmHeight;
|
||||
#if RANDR_12_INTERFACE
|
||||
pScrPriv->rrScreenSetSize = NULL;
|
||||
pScrPriv->rrCrtcSet = NULL;
|
||||
|
|
|
@ -224,6 +224,7 @@ typedef struct _rrScrPriv {
|
|||
CARD16 minWidth, minHeight;
|
||||
CARD16 maxWidth, maxHeight;
|
||||
CARD16 width, height; /* last known screen size */
|
||||
CARD16 mmWidth, mmHeight; /* last known screen size */
|
||||
|
||||
int numOutputs;
|
||||
RROutputPtr *outputs;
|
||||
|
@ -541,6 +542,16 @@ Bool
|
|||
RRCrtcGammaSetSize (RRCrtcPtr crtc,
|
||||
int size);
|
||||
|
||||
/*
|
||||
* Set the allowable rotations of the CRTC.
|
||||
*/
|
||||
Bool
|
||||
RRCrtcSetRotations (RRCrtcPtr crtc,
|
||||
Rotation rotations);
|
||||
|
||||
void
|
||||
RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
|
||||
|
||||
/*
|
||||
* Destroy a Crtc at shutdown
|
||||
*/
|
||||
|
|
|
@ -397,6 +397,32 @@ RRCrtcGammaNotify (RRCrtcPtr crtc)
|
|||
return TRUE; /* not much going on here */
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the width/height that the crtc scans out from the framebuffer
|
||||
*/
|
||||
void
|
||||
RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
|
||||
{
|
||||
if (crtc->mode == NULL) {
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (crtc->rotation & 0xf) {
|
||||
case RR_Rotate_0:
|
||||
case RR_Rotate_180:
|
||||
*width = crtc->mode->mode.width;
|
||||
*height = crtc->mode->mode.height;
|
||||
break;
|
||||
case RR_Rotate_90:
|
||||
case RR_Rotate_270:
|
||||
*width = crtc->mode->mode.height;
|
||||
*height = crtc->mode->mode.width;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the size of the gamma table at server startup time
|
||||
*/
|
||||
|
@ -426,6 +452,17 @@ RRCrtcGammaSetSize (RRCrtcPtr crtc,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the allowable rotations of the CRTC.
|
||||
*/
|
||||
Bool
|
||||
RRCrtcSetRotations (RRCrtcPtr crtc,
|
||||
Rotation rotations)
|
||||
{
|
||||
crtc->rotations = rotations;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize crtc type
|
||||
*/
|
||||
|
|
|
@ -169,18 +169,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
|
|||
if (height > maxHeight) maxHeight = height;
|
||||
}
|
||||
|
||||
if (minWidth != pScrPriv->minWidth) {
|
||||
pScrPriv->minWidth = minWidth; pScrPriv->changed = TRUE;
|
||||
}
|
||||
if (maxWidth != pScrPriv->maxWidth) {
|
||||
pScrPriv->maxWidth = maxWidth; pScrPriv->changed = TRUE;
|
||||
}
|
||||
if (minHeight != pScrPriv->minHeight) {
|
||||
pScrPriv->minHeight = minHeight; pScrPriv->changed = TRUE;
|
||||
}
|
||||
if (maxHeight != pScrPriv->maxHeight) {
|
||||
pScrPriv->maxHeight = maxHeight; pScrPriv->changed = TRUE;
|
||||
}
|
||||
RRScreenSetSizeRange (pScreen, minWidth, minHeight, maxWidth, maxHeight);
|
||||
|
||||
/* notice current mode */
|
||||
if (newMode)
|
||||
|
@ -219,7 +208,6 @@ RRGetInfo (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#if RANDR_12_INTERFACE
|
||||
/*
|
||||
* Register the range of sizes for the screen
|
||||
*/
|
||||
|
@ -234,12 +222,19 @@ RRScreenSetSizeRange (ScreenPtr pScreen,
|
|||
|
||||
if (!pScrPriv)
|
||||
return;
|
||||
if (pScrPriv->minWidth == minWidth && pScrPriv->minHeight == minHeight &&
|
||||
pScrPriv->maxWidth == maxWidth && pScrPriv->maxHeight == maxHeight)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pScrPriv->minWidth = minWidth;
|
||||
pScrPriv->minHeight = minHeight;
|
||||
pScrPriv->maxWidth = maxWidth;
|
||||
pScrPriv->maxHeight = maxHeight;
|
||||
pScrPriv->changed = TRUE;
|
||||
pScrPriv->configChanged = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef RANDR_10_INTERFACE
|
||||
static Bool
|
||||
|
|
|
@ -35,11 +35,15 @@ static Bool
|
|||
RRCrtcContainsPosition (RRCrtcPtr crtc, int x, int y)
|
||||
{
|
||||
RRModePtr mode = crtc->mode;
|
||||
|
||||
int scan_width, scan_height;
|
||||
|
||||
if (!mode)
|
||||
return FALSE;
|
||||
if (crtc->x <= x && x < crtc->x + mode->mode.width &&
|
||||
crtc->y <= y && y < crtc->y + mode->mode.height)
|
||||
|
||||
RRCrtcGetScanoutSize (crtc, &scan_width, &scan_height);
|
||||
|
||||
if (crtc->x <= x && x < crtc->x + scan_width &&
|
||||
crtc->y <= y && y < crtc->y + scan_height)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -55,28 +59,32 @@ RRPointerToNearestCrtc (ScreenPtr pScreen, int x, int y, RRCrtcPtr skip)
|
|||
RRCrtcPtr nearest = NULL;
|
||||
int best = 0;
|
||||
int best_dx = 0, best_dy = 0;
|
||||
|
||||
|
||||
for (c = 0; c < pScrPriv->numCrtcs; c++)
|
||||
{
|
||||
RRCrtcPtr crtc = pScrPriv->crtcs[c];
|
||||
RRModePtr mode = crtc->mode;
|
||||
int dx, dy;
|
||||
int dist;
|
||||
int scan_width, scan_height;
|
||||
|
||||
if (!mode)
|
||||
continue;
|
||||
if (crtc == skip)
|
||||
continue;
|
||||
|
||||
RRCrtcGetScanoutSize (crtc, &scan_width, &scan_height);
|
||||
|
||||
if (x < crtc->x)
|
||||
dx = crtc->x - x;
|
||||
else if (x > crtc->x + mode->mode.width)
|
||||
dx = x - (crtc->x + mode->mode.width);
|
||||
else if (x > crtc->x + scan_width)
|
||||
dx = x - (crtc->x + scan_width);
|
||||
else
|
||||
dx = 0;
|
||||
if (y < crtc->y)
|
||||
dy = crtc->y - x;
|
||||
else if (y > crtc->y + mode->mode.height)
|
||||
dy = y - (crtc->y + mode->mode.height);
|
||||
else if (y > crtc->y + scan_height)
|
||||
dy = y - (crtc->y + scan_height);
|
||||
else
|
||||
dy = 0;
|
||||
dist = dx + dy;
|
||||
|
|
|
@ -125,6 +125,7 @@ RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type,
|
|||
{
|
||||
RRPropertyPtr prop;
|
||||
xRROutputPropertyNotifyEvent event;
|
||||
rrScrPrivPtr pScrPriv = rrGetScrPriv(output->pScreen);
|
||||
int sizeInBytes;
|
||||
int totalSize;
|
||||
pointer data;
|
||||
|
@ -213,6 +214,13 @@ RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type,
|
|||
prop->next = output->properties;
|
||||
output->properties = prop;
|
||||
}
|
||||
|
||||
if (!prop->is_pending) {
|
||||
/* What should we do in case of failure? */
|
||||
pScrPriv->rrOutputSetProperty(output->pScreen, output,
|
||||
prop->propertyName, prop_value);
|
||||
}
|
||||
|
||||
if (sendevent)
|
||||
{
|
||||
event.type = RREventBase + RRNotify;
|
||||
|
@ -298,6 +306,12 @@ RRConfigureOutputProperty (RROutputPtr output, Atom property,
|
|||
if (prop->valid_values)
|
||||
xfree (prop->valid_values);
|
||||
prop->valid_values = new_values;
|
||||
|
||||
if (add) {
|
||||
prop->next = output->properties;
|
||||
output->properties = prop;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -158,11 +158,15 @@ RRScreenSizeNotify (ScreenPtr pScreen)
|
|||
* pixel size
|
||||
*/
|
||||
if (pScrPriv->width == pScreen->width &&
|
||||
pScrPriv->height == pScreen->height)
|
||||
pScrPriv->height == pScreen->height &&
|
||||
pScrPriv->mmWidth == pScreen->mmWidth &&
|
||||
pScrPriv->mmHeight == pScreen->mmHeight)
|
||||
return;
|
||||
|
||||
pScrPriv->width = pScreen->width;
|
||||
pScrPriv->height = pScreen->height;
|
||||
pScrPriv->mmWidth = pScreen->mmWidth;
|
||||
pScrPriv->mmHeight = pScreen->mmHeight;
|
||||
pScrPriv->changed = TRUE;
|
||||
/* pScrPriv->sizeChanged = TRUE; */
|
||||
|
||||
|
@ -234,7 +238,8 @@ ProcRRGetScreenSizeRange (ClientPtr client)
|
|||
|
||||
if (pScrPriv)
|
||||
{
|
||||
RRGetInfo (pScreen);
|
||||
if (!RRGetInfo (pScreen))
|
||||
return BadAlloc;
|
||||
rep.minWidth = pScrPriv->minWidth;
|
||||
rep.minHeight = pScrPriv->minHeight;
|
||||
rep.maxWidth = pScrPriv->maxWidth;
|
||||
|
@ -349,7 +354,8 @@ ProcRRGetScreenResources (ClientPtr client)
|
|||
rep.pad = 0;
|
||||
|
||||
if (pScrPriv)
|
||||
RRGetInfo (pScreen);
|
||||
if (!RRGetInfo (pScreen))
|
||||
return BadAlloc;
|
||||
|
||||
if (!pScrPriv)
|
||||
{
|
||||
|
@ -591,7 +597,8 @@ ProcRRGetScreenInfo (ClientPtr client)
|
|||
rep.pad = 0;
|
||||
|
||||
if (pScrPriv)
|
||||
RRGetInfo (pScreen);
|
||||
if (!RRGetInfo (pScreen))
|
||||
return BadAlloc;
|
||||
|
||||
output = RRFirstOutput (pScreen);
|
||||
|
||||
|
|
|
@ -290,10 +290,12 @@ ProcRRXineramaQueryScreens(ClientPtr client)
|
|||
RRCrtcPtr crtc = pScrPriv->crtcs[i];
|
||||
if (RRXineramaCrtcActive (crtc))
|
||||
{
|
||||
int width, height;
|
||||
RRCrtcGetScanoutSize (crtc, &width, &height);
|
||||
scratch.x_org = crtc->x;
|
||||
scratch.y_org = crtc->y;
|
||||
scratch.width = crtc->mode->mode.width;
|
||||
scratch.height = crtc->mode->mode.height;
|
||||
scratch.width = width;
|
||||
scratch.height = height;
|
||||
if(client->swapped) {
|
||||
register int n;
|
||||
swaps(&scratch.x_org, n);
|
||||
|
|
|
@ -47,6 +47,12 @@
|
|||
#include <X11/Xfuncproto.h>
|
||||
#include "cursorstr.h"
|
||||
|
||||
#if HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#elif !defined(UINT32_MAX)
|
||||
#define UINT32_MAX 0xffffffffU
|
||||
#endif
|
||||
|
||||
static int ProcRenderQueryVersion (ClientPtr pClient);
|
||||
static int ProcRenderQueryPictFormats (ClientPtr pClient);
|
||||
static int ProcRenderQueryPictIndexValues (ClientPtr pClient);
|
||||
|
@ -1105,11 +1111,14 @@ ProcRenderAddGlyphs (ClientPtr client)
|
|||
}
|
||||
|
||||
nglyphs = stuff->nglyphs;
|
||||
if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
|
||||
return BadAlloc;
|
||||
|
||||
if (nglyphs <= NLOCALGLYPH)
|
||||
glyphsBase = glyphsLocal;
|
||||
else
|
||||
{
|
||||
glyphsBase = (GlyphNewPtr) ALLOCATE_LOCAL (nglyphs * sizeof (GlyphNewRec));
|
||||
glyphsBase = (GlyphNewPtr) Xalloc (nglyphs * sizeof (GlyphNewRec));
|
||||
if (!glyphsBase)
|
||||
return BadAlloc;
|
||||
}
|
||||
|
@ -1166,7 +1175,7 @@ ProcRenderAddGlyphs (ClientPtr client)
|
|||
}
|
||||
|
||||
if (glyphsBase != glyphsLocal)
|
||||
DEALLOCATE_LOCAL (glyphsBase);
|
||||
Xfree (glyphsBase);
|
||||
return client->noClientException;
|
||||
bail:
|
||||
while (glyphs != glyphsBase)
|
||||
|
@ -1175,7 +1184,7 @@ bail:
|
|||
xfree (glyphs->glyph);
|
||||
}
|
||||
if (glyphsBase != glyphsLocal)
|
||||
DEALLOCATE_LOCAL (glyphsBase);
|
||||
Xfree (glyphsBase);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -1497,30 +1497,33 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (src->compat->sym_interpret) {
|
||||
if (src->compat->size_si != dst->compat->size_si) {
|
||||
if (src->compat->sym_interpret && src->compat->num_si) {
|
||||
if (src->compat->num_si != dst->compat->size_si) {
|
||||
if (dst->compat->sym_interpret)
|
||||
tmp = xrealloc(dst->compat->sym_interpret,
|
||||
src->compat->size_si *
|
||||
src->compat->num_si *
|
||||
sizeof(XkbSymInterpretRec));
|
||||
else
|
||||
tmp = xalloc(src->compat->size_si *
|
||||
tmp = xalloc(src->compat->num_si *
|
||||
sizeof(XkbSymInterpretRec));
|
||||
if (!tmp)
|
||||
return FALSE;
|
||||
dst->compat->sym_interpret = tmp;
|
||||
}
|
||||
memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
|
||||
src->compat->size_si * sizeof(XkbSymInterpretRec));
|
||||
src->compat->num_si * sizeof(XkbSymInterpretRec));
|
||||
|
||||
dst->compat->num_si = src->compat->num_si;
|
||||
dst->compat->size_si = src->compat->num_si;
|
||||
}
|
||||
else {
|
||||
if (dst->compat->sym_interpret) {
|
||||
if (dst->compat->sym_interpret && dst->compat->size_si)
|
||||
xfree(dst->compat->sym_interpret);
|
||||
dst->compat->sym_interpret = NULL;
|
||||
}
|
||||
|
||||
dst->compat->sym_interpret = NULL;
|
||||
dst->compat->num_si = 0;
|
||||
dst->compat->size_si = 0;
|
||||
}
|
||||
dst->compat->num_si = src->compat->num_si;
|
||||
dst->compat->size_si = src->compat->size_si;
|
||||
|
||||
memcpy(dst->compat->groups, src->compat->groups,
|
||||
XkbNumKbdGroups * sizeof(XkbModsRec));
|
||||
|
|
Loading…
Reference in New Issue
Block a user