sna: Backport to squeeze - Xorg-1.6, pixman-0.16, libdrm-2.4.21

The principle change is to switch to the old Privates API and undo the
Region renames.

The downside is that this ignores the critical bugfixes made to the
xserver since xorg-1.6 - but I assume that whoever wants to run the
latest hardware on the old xservers is also backporting those stability
fixes...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-02-09 19:15:20 +00:00 committed by root
parent 42a6b25817
commit 3cbdfb54d1
18 changed files with 256 additions and 107 deletions

View File

@ -184,12 +184,16 @@ AC_ARG_ENABLE(ums-only, AS_HELP_STRING([--enable-ums-only],
[UMS_ONLY=no])
required_xorg_xserver_version=1.6
required_pixman_version=0.24
required_pixman_version=0.16
if pkg-config --exists 'pixman-1 >= 0.27.1'; then
AC_DEFINE([HAS_PIXMAN_GLYPHS], 1, [Enable pixman glyph cache])
fi
if pkg-config --exists 'pixman-1 >= 0.24.0'; then
AC_DEFINE([HAS_PIXMAN_TRIANGLES], 1, [Enable pixman triangle rasterisation])
fi
AC_ARG_ENABLE(sna,
AS_HELP_STRING([--enable-sna],
[Enable SandyBridge's New Acceleration (SNA) [default=auto]]),
@ -201,7 +205,6 @@ if test "x$SNA" = "xauto" && pkg-config --exists "xorg-server >= 1.10"; then
SNA=yes
fi
if test "x$SNA" != "xno"; then
required_xorg_xserver_version=1.10
AC_DEFINE(USE_SNA, 1, [Enable SNA support])
fi
AC_MSG_CHECKING([whether to include SNA support])
@ -214,12 +217,19 @@ AC_ARG_ENABLE(uxa,
[UXA="$enableval"],
[UXA=yes])
AC_MSG_CHECKING([whether to include UXA support])
AM_CONDITIONAL(UXA, test x$UXA != xno)
AC_MSG_RESULT([$UXA])
if ! pkg-config --exists 'libdrm_intel-1 >= 2.4.29'; then
UXA=no
fi
if ! pkg-config --exists 'pixman-1 >= 0.24.0'; then
UXA=no
fi
if test "x$UXA" != "xno"; then
AC_DEFINE(USE_UXA, 1, [Enable UXA support])
PKG_CHECK_MODULES(DRMINTEL, [libdrm_intel >= 2.4.29])
required_pixman_version=0.24
fi
AM_CONDITIONAL(UXA, test x$UXA != xno)
AC_MSG_CHECKING([whether to include GLAMOR support])
AC_ARG_ENABLE(glamor,
@ -347,7 +357,7 @@ XORG_DRIVER_CHECK_EXT(XF86DRI, xextproto x11)
XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto)
# Obtain compiler/linker options for the driver dependencies
PKG_CHECK_MODULES(DRM, [libdrm >= 2.4.24]) # libdrm_intel is checked separately
PKG_CHECK_MODULES(DRM, [libdrm >= 2.4.20]) # libdrm_intel is checked separately
PKG_CHECK_MODULES(DRI, [xf86driproto], , DRI=no)
PKG_CHECK_MODULES(DRI2, [dri2proto >= 2.6],, DRI2=no)
PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])

View File

@ -28,6 +28,8 @@
#ifndef COMPAT_API_H
#define COMPAT_API_H
#include <xorgVersion.h>
#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
@ -103,4 +105,54 @@
#endif
#ifndef INCLUDE_LEGACY_REGION_DEFINES
#define RegionCreate(r, s) REGION_CREATE(NULL, r, s)
#define RegionBreak(r) REGION_BREAK(NULL, r)
#define RegionSizeof REGION_SZOF
#define RegionBoxptr REGION_BOXPTR
#define RegionEnd REGION_END
#define RegionExtents(r) REGION_EXTENTS(NULL, r)
#define RegionRects REGION_RECTS
#define RegionNumRects REGION_NUM_RECTS
#define RegionContainsRect(r, b) RECT_IN_REGION(NULL, r, b)
#define RegionContainsPoint(r, x, y, b) POINT_IN_REGION(NULL, r, x, y, b)
#define RegionCopy(res, r) REGION_COPY(NULL, res, r)
#define RegionIntersect(res, r1, r2) REGION_INTERSECT(NULL, res, r1, r2)
#define RegionUnion(res, r1, r2) REGION_UNION(NULL, res, r1, r2)
#define RegionTranslate(r, x, y) REGION_TRANSLATE(NULL, r, x, y)
#define RegionUninit(r) REGION_UNINIT(NULL, r)
#define region_from_bitmap BITMAP_TO_REGION
#define RegionNil REGION_NIL
#define RegionNull(r) REGION_NULL(NULL, r)
#define RegionNotEmpty(r) REGION_NOTEMPTY(NULL, r)
#define RegionEmpty(r) REGION_EMPTY(NULL, r)
#define RegionDestroy(r) REGION_DESTROY(NULL, r)
#else
#define region_from_bitmap BitmapToRegion
#endif
#ifndef _X_UNUSED
#define _X_UNUSED
#endif
#if HAS_DEVPRIVATEKEYREC
#define __get_private(p, key) dixGetPrivateAddr(&(p)->devPrivates, &(key))
#else
#define __get_private(p, key) dixLookupPrivate(&(p)->devPrivates, &(key))
typedef int DevPrivateKeyRec;
static inline void FreePixmap(PixmapPtr pixmap)
{
dixFreePrivates(pixmap->devPrivates);
free(pixmap);
}
#endif
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,902,0)
#define SourceValidate(d, x, y, w, h, mode) \
if ((d)->pScreen->SourceValidate) (d)->pScreen->SourceValidate(d, x, y, w, h, mode)
#else
#define SourceValidate(d, x, y, w, h, mode) \
if ((d)->pScreen->SourceValidate) (d)->pScreen->SourceValidate(d, x, y, w, h)
#endif
#endif

View File

@ -33,6 +33,7 @@
#include <gcstruct.h>
#include <colormap.h>
#include <windowstr.h>
#include <regionstr.h>
#include <stdbool.h>
#include <pixman.h>
@ -45,6 +46,8 @@
#include "sfb.h"
#include "../../compat-api.h"
#define WRITE(ptr, val) (*(ptr) = (val))
#define READ(ptr) (*(ptr))
@ -294,12 +297,12 @@ extern DevPrivateKeyRec sna_window_key;
static inline FbGCPrivate *fb_gc(GCPtr gc)
{
return dixGetPrivateAddr(&gc->devPrivates, &sna_gc_key);
return (FbGCPrivate *)__get_private(gc, sna_gc_key);
}
static inline PixmapPtr fbGetWindowPixmap(WindowPtr window)
{
return *(PixmapPtr *)dixGetPrivateAddr(&window->devPrivates, &sna_window_key);
return *(PixmapPtr *)__get_private(window, sna_window_key);
}
#ifdef ROOTLESS
@ -360,8 +363,14 @@ static inline PixmapPtr fbGetWindowPixmap(WindowPtr window)
* XFree86 empties the root BorderClip when the VT is inactive,
* here's a macro which uses that to disable GetImage and GetSpans
*/
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,10,0,0,0)
#define fbWindowEnabled(pWin) \
RegionNotEmpty(&(pWin)->drawable.pScreen->root->borderClip)
RegionNotEmpty(&(pWin)->drawable.pScreen->root->borderClip)
#else
#define fbWindowEnabled(pWin) \
RegionNotEmpty(&WindowTable[(pWin)->drawable.pScreen->myNum]->borderClip)
#endif
#define fbDrawableEnabled(drawable) \
((drawable)->type == DRAWABLE_PIXMAP ? \
TRUE : fbWindowEnabled((WindowPtr) drawable))

View File

@ -25,21 +25,50 @@
#include "fb.h"
static Bool region_grow(RegionPtr region)
{
RegDataPtr data;
int n;
n = 16;
if (!region->data) {
region->data = malloc(RegionSizeof(n));
if (!region->data)
return RegionBreak(region);
region->data->numRects = 1;
*RegionBoxptr(region) = region->extents;
} else if (!region->data->size) {
region->data = malloc(RegionSizeof(n));
if (!region->data)
return RegionBreak(region);
region->data->numRects = 0;
} else {
n = 2 * region->data->numRects;
data = (RegDataPtr) realloc(region->data, RegionSizeof(n));
if (!data)
return RegionBreak(region);
region->data = data;
}
region->data->size = n;
return TRUE;
}
static inline void add(RegionPtr region,
int16_t x1, int16_t y1, int16_t x2, int16_t y2)
{
BoxPtr r;
if (region->data->numRects == region->data->size)
RegionRectAlloc(region, 1);
if (region->data->numRects == region->data->size &&
!region_grow(region))
return;
r = RegionBoxptr(region) + region->data->numRects++;
r->x1 = x1; r->y1 = y1;
r->x2 = x2; r->y2 = y2;
DBG(("%s[%d/%d]: (%d, %d), (%d, %d)\n",
DBG(("%s[%ld/%ld]: (%d, %d), (%d, %d)\n",
__FUNCTION__,
region->data->numRects, region->data->size,
(long)region->data->numRects, (long)region->data->size,
x1, y1, x2, y2));
if (x1 < region->extents.x1)
@ -149,11 +178,11 @@ fbBitmapToRegion(PixmapPtr pixmap)
} else
region->extents.x1 = region->extents.x2 = 0;
DBG(("%s: region extents=(%d, %d), (%d, %d) x %d\n",
DBG(("%s: region extents=(%d, %d), (%d, %d) x %ld\n",
__FUNCTION__,
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2,
RegionNumRects(region)));
(long)RegionNumRects(region)));
return region;
}

View File

@ -285,9 +285,9 @@ fbBlt(FbBits *srcLine, FbStride srcStride, int srcX,
s += srcX >> 3;
d += dstX >> 3;
DBG(("%s fast blt, src_stride=%d, dst_stride=%d, width=%d (offset=%d)\n",
DBG(("%s fast blt, src_stride=%d, dst_stride=%d, width=%d (offset=%ld)\n",
__FUNCTION__,
srcStride, dstStride, width, s - d));
srcStride, dstStride, width, (long)(s - d)));
if (width == srcStride && width == dstStride) {
width *= height;

View File

@ -27,24 +27,22 @@
#include "fb.h"
#include <xorgVersion.h>
#include <picturestr.h>
#include <mipict.h>
#include "fbpict.h"
#include <fbpict.h>
static void
SourceValidateOnePicture(PicturePtr picture)
{
DrawablePtr drawable = picture->pDrawable;
ScreenPtr screen;
if (!drawable)
return;
screen = drawable->pScreen;
if (screen->SourceValidate)
screen->SourceValidate(drawable,
0, 0, drawable->width, drawable->height,
picture->subWindowMode);
SourceValidate(drawable,
0, 0, drawable->width, drawable->height,
picture->subWindowMode);
}
static void

View File

@ -93,10 +93,10 @@ fbPolyPoint(DrawablePtr drawable, GCPtr gc,
int xoff, int yoff,
FbBits and, FbBits xor);
DBG(("%s x %d, clip=[(%d, %d), (%d, %d)]x%d\n", __FUNCTION__, n,
DBG(("%s x %d, clip=[(%d, %d), (%d, %d)]x%ld\n", __FUNCTION__, n,
gc->pCompositeClip->extents.x1, gc->pCompositeClip->extents.y1,
gc->pCompositeClip->extents.x2, gc->pCompositeClip->extents.y2,
RegionNumRects(gc->pCompositeClip)));
(long)RegionNumRects(gc->pCompositeClip)));
if (mode == CoordModePrevious)
fbFixCoordModePrevious(n, pt);

View File

@ -353,7 +353,8 @@ fbSelectBres(DrawablePtr drawable, GCPtr gc)
FbBres *bres;
DBG(("%s: line=%d, fill=%d, and=%lx, bgand=%lx\n",
__FUNCTION__, gc->lineStyle, gc->fillStyle, pgc->and, pgc->bgand));
__FUNCTION__, gc->lineStyle, gc->fillStyle,
(long)pgc->and, (long)pgc->bgand));
assert(gc->lineWidth == 0);
if (gc->lineStyle == LineSolid) {

View File

@ -111,6 +111,9 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
#define MAKE_REQUEST(rq, ring) ((struct kgem_request *)((uintptr_t)(rq) | (ring)))
#define LOCAL_I915_PARAM_HAS_BLT 11
#define LOCAL_I915_PARAM_HAS_RELAXED_FENCING 12
#define LOCAL_I915_PARAM_HAS_RELAXED_DELTA 15
#define LOCAL_I915_PARAM_HAS_SEMAPHORES 20
#define LOCAL_I915_PARAM_HAS_SECURE_BATCHES 23
#define LOCAL_I915_PARAM_HAS_PINNED_BATCHES 24
@ -782,7 +785,7 @@ static bool test_has_relaxed_fencing(struct kgem *kgem)
if (DBG_NO_RELAXED_FENCING)
return false;
return gem_param(kgem, I915_PARAM_HAS_RELAXED_FENCING) > 0;
return gem_param(kgem, LOCAL_I915_PARAM_HAS_RELAXED_FENCING) > 0;
} else
return true;
}
@ -982,12 +985,12 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
kgem->vma[MAP_GTT].count = -MAX_GTT_VMA_CACHE;
kgem->vma[MAP_CPU].count = -MAX_CPU_VMA_CACHE;
kgem->has_blt = gem_param(kgem, I915_PARAM_HAS_BLT) > 0;
kgem->has_blt = gem_param(kgem, LOCAL_I915_PARAM_HAS_BLT) > 0;
DBG(("%s: has BLT ring? %d\n", __FUNCTION__,
kgem->has_blt));
kgem->has_relaxed_delta =
gem_param(kgem, I915_PARAM_HAS_RELAXED_DELTA) > 0;
gem_param(kgem, LOCAL_I915_PARAM_HAS_RELAXED_DELTA) > 0;
DBG(("%s: has relaxed delta? %d\n", __FUNCTION__,
kgem->has_relaxed_delta));

View File

@ -141,6 +141,15 @@ struct sna_glyph {
uint16_t size, pos;
};
static inline WindowPtr root(ScreenPtr screen)
{
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,10,0,0,0)
return screen->root;
#else
return WindowTable[screen->myNum];
#endif
}
static inline PixmapPtr get_window_pixmap(WindowPtr window)
{
return fbGetWindowPixmap(window);
@ -158,7 +167,7 @@ extern DevPrivateKeyRec sna_pixmap_key;
constant static inline struct sna_pixmap *sna_pixmap(PixmapPtr pixmap)
{
return ((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[1];
return ((void **)__get_private(pixmap, sna_pixmap_key))[1];
}
static inline struct sna_pixmap *sna_pixmap_from_drawable(DrawablePtr drawable)
@ -176,7 +185,7 @@ struct sna_gc {
static inline struct sna_gc *sna_gc(GCPtr gc)
{
return dixGetPrivateAddr(&gc->devPrivates, &sna_gc_key);
return (struct sna_gc *)__get_private(gc, sna_gc_key);
}
enum {
@ -314,7 +323,7 @@ to_sna_from_screen(ScreenPtr screen)
constant static inline struct sna *
to_sna_from_pixmap(PixmapPtr pixmap)
{
return ((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[0];
return ((void **)__get_private(pixmap, sna_pixmap_key))[0];
}
constant static inline struct sna *

View File

@ -627,7 +627,7 @@ struct kgem_bo *sna_pixmap_change_tiling(PixmapPtr pixmap, uint32_t tiling)
static inline void sna_set_pixmap(PixmapPtr pixmap, struct sna_pixmap *sna)
{
((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[1] = sna;
((void **)__get_private(pixmap, sna_pixmap_key))[1] = sna;
assert(sna_pixmap(pixmap) == sna);
}
@ -727,11 +727,13 @@ create_pixmap(struct sna *sna, ScreenPtr screen,
datasize += adjust;
}
DBG(("%s: allocating pixmap %dx%d, depth=%d, size=%ld\n",
__FUNCTION__, width, height, depth, (long)datasize));
pixmap = AllocatePixmap(screen, datasize);
if (!pixmap)
return NullPixmap;
((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[0] = sna;
((void **)__get_private(pixmap, sna_pixmap_key))[0] = sna;
assert(to_sna_from_pixmap(pixmap) == sna);
pixmap->drawable.type = DRAWABLE_PIXMAP;
@ -2015,8 +2017,8 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
assert(priv->gpu_bo->proxy == NULL);
if (priv->clear) {
int n = REGION_NUM_RECTS(region);
BoxPtr box = REGION_RECTS(region);
int n = RegionNumRects(region);
BoxPtr box = RegionRects(region);
DBG(("%s: pending clear, doing partial fill\n", __FUNCTION__));
if (priv->cpu_bo) {
@ -2132,9 +2134,9 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
* reads.
*/
if (flags & MOVE_WRITE) {
int n = REGION_NUM_RECTS(region), i;
BoxPtr boxes = REGION_RECTS(region);
BoxPtr blocks = malloc(sizeof(BoxRec) * REGION_NUM_RECTS(region));
int n = RegionNumRects(region), i;
BoxPtr boxes = RegionRects(region);
BoxPtr blocks = malloc(sizeof(BoxRec) * RegionNumRects(region));
if (blocks) {
for (i = 0; i < n; i++) {
blocks[i].x1 = boxes[i].x1 & ~31;
@ -2190,8 +2192,8 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
} else if (DAMAGE_IS_ALL(priv->gpu_damage) ||
sna_damage_contains_box__no_reduce(priv->gpu_damage,
&r->extents)) {
BoxPtr box = REGION_RECTS(r);
int n = REGION_NUM_RECTS(r);
BoxPtr box = RegionRects(r);
int n = RegionNumRects(r);
bool ok = false;
DBG(("%s: region wholly inside damage\n",
@ -2216,8 +2218,8 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
pixman_region_init(&need);
if (sna_damage_intersect(priv->gpu_damage, r, &need)) {
BoxPtr box = REGION_RECTS(&need);
int n = REGION_NUM_RECTS(&need);
BoxPtr box = RegionRects(&need);
int n = RegionNumRects(&need);
bool ok = false;
DBG(("%s: region intersects damage\n",
@ -2535,10 +2537,10 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
sna_damage_subtract(&priv->cpu_damage, &r);
} else if (sna_damage_intersect(priv->cpu_damage, &r, &i)) {
int n = REGION_NUM_RECTS(&i);
int n = RegionNumRects(&i);
bool ok;
box = REGION_RECTS(&i);
box = RegionRects(&i);
ok = false;
if (use_cpu_bo_for_upload(sna, priv, 0)) {
DBG(("%s: using CPU bo for upload to GPU, %d boxes\n", __FUNCTION__, n));
@ -3249,7 +3251,7 @@ static bool must_check sna_gc_move_to_cpu(GCPtr gc,
if (gc->clientClipType == CT_PIXMAP) {
PixmapPtr clip = gc->clientClip;
gc->clientClip = BitmapToRegion(gc->pScreen, clip);
gc->clientClip = region_from_bitmap(gc->pScreen, clip);
gc->pScreen->DestroyPixmap(clip);
gc->clientClipType = gc->clientClip ? CT_REGION : CT_NONE;
changes |= GCClipMask;
@ -3443,8 +3445,8 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
DBG(("%s: upload(%d, %d, %d, %d)\n", __FUNCTION__, x, y, w, h));
/* Region is pre-clipped and translated into pixmap space */
box = REGION_RECTS(region);
n = REGION_NUM_RECTS(region);
box = RegionRects(region);
n = RegionNumRects(region);
do {
DBG(("%s: copy box (%d, %d)->(%d, %d)x(%d, %d)\n",
__FUNCTION__,
@ -3536,8 +3538,8 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
kgem_set_mode(&sna->kgem, KGEM_BLT, bo);
/* Region is pre-clipped and translated into pixmap space */
box = REGION_RECTS(region);
n = REGION_NUM_RECTS(region);
box = RegionRects(region);
n = RegionNumRects(region);
do {
int bx1 = (box->x1 - x) & ~7;
int bx2 = (box->x2 - x + 7) & ~7;
@ -3661,8 +3663,8 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
skip = h * BitmapBytePad(w + left);
for (i = 1 << (gc->depth-1); i; i >>= 1, bits += skip) {
const BoxRec *box = REGION_RECTS(region);
int n = REGION_NUM_RECTS(region);
const BoxRec *box = RegionRects(region);
int n = RegionNumRects(region);
if ((gc->planemask & i) == 0)
continue;
@ -4690,10 +4692,7 @@ sna_do_copy(DrawablePtr src, DrawablePtr dst, GCPtr gc,
return NULL;
}
if (src->pScreen->SourceValidate)
src->pScreen->SourceValidate(src, sx, sy,
width, height,
gc->subWindowMode);
SourceValidate(src, sx, sy, width, height, gc->subWindowMode);
sx += src->x;
sy += src->y;
@ -4772,17 +4771,17 @@ sna_do_copy(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (free_clip)
RegionDestroy(free_clip);
}
DBG(("%s: src extents (%d, %d), (%d, %d) x %d\n", __FUNCTION__,
DBG(("%s: src extents (%d, %d), (%d, %d) x %ld\n", __FUNCTION__,
region.extents.x1, region.extents.y1,
region.extents.x2, region.extents.y2,
RegionNumRects(&region)));
(long)RegionNumRects(&region)));
RegionTranslate(&region, dx-sx, dy-sy);
if (gc->pCompositeClip->data)
RegionIntersect(&region, &region, gc->pCompositeClip);
DBG(("%s: copy region (%d, %d), (%d, %d) x %d\n", __FUNCTION__,
DBG(("%s: copy region (%d, %d), (%d, %d) x %ld\n", __FUNCTION__,
region.extents.x1, region.extents.y1,
region.extents.x2, region.extents.y2,
RegionNumRects(&region)));
(long)RegionNumRects(&region)));
if (RegionNotEmpty(&region))
copy(src, dst, gc, &region, sx-dx, sy-dy, bitPlane, closure);
@ -4804,8 +4803,8 @@ sna_fallback_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
RegionPtr region, int dx, int dy,
Pixel bitplane, void *closure)
{
DBG(("%s (boxes=%dx[(%d, %d), (%d, %d)...], src=+(%d, %d), alu=%d\n",
__FUNCTION__, RegionNumRects(region),
DBG(("%s (boxes=%ldx[(%d, %d), (%d, %d)...], src=+(%d, %d), alu=%d\n",
__FUNCTION__, (long)RegionNumRects(region),
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2,
dx, dy, gc->alu));
@ -5408,9 +5407,9 @@ no_damage_clipped:
assert(dx + clip.extents.x2 <= pixmap->drawable.width);
assert(dy + clip.extents.y2 <= pixmap->drawable.height);
DBG(("%s: clip %d x [(%d, %d), (%d, %d)] x %d [(%d, %d)...]\n",
DBG(("%s: clip %ld x [(%d, %d), (%d, %d)] x %d [(%d, %d)...]\n",
__FUNCTION__,
REGION_NUM_RECTS(&clip),
(long)RegionNumRects(&clip),
clip.extents.x1, clip.extents.y1, clip.extents.x2, clip.extents.y2,
n, pt->x, pt->y));
@ -5509,9 +5508,9 @@ damage_clipped:
assert(dx + clip.extents.x2 <= pixmap->drawable.width);
assert(dy + clip.extents.y2 <= pixmap->drawable.height);
DBG(("%s: clip %d x [(%d, %d), (%d, %d)] x %d [(%d, %d)...]\n",
DBG(("%s: clip %ld x [(%d, %d), (%d, %d)] x %d [(%d, %d)...]\n",
__FUNCTION__,
REGION_NUM_RECTS(&clip),
RegionNumRects(&clip),
clip.extents.x1, clip.extents.y1, clip.extents.x2, clip.extents.y2,
n, pt->x, pt->y));
@ -5899,10 +5898,11 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
BoxPtr box;
int n;
DBG(("%s: plane=%x (%d,%d),(%d,%d)x%d\n",
__FUNCTION__, (unsigned)bitplane, RegionNumRects(region),
DBG(("%s: plane=%x (%d,%d),(%d,%d)x%ld\n",
__FUNCTION__, (unsigned)bitplane,
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2));
region->extents.x2, region->extents.y2,
(long)RegionNumRects(region)));
box = RegionRects(region);
n = RegionNumRects(region);
@ -6634,8 +6634,8 @@ sna_poly_zero_line_blt(DrawablePtr drawable,
clip.extents.x2, clip.extents.y2,
dx, dy, damage));
extents = REGION_RECTS(&clip);
last_extents = extents + REGION_NUM_RECTS(&clip);
extents = RegionRects(&clip);
last_extents = extents + RegionNumRects(&clip);
b = box;
do {
@ -7847,8 +7847,8 @@ sna_poly_zero_segment_blt(DrawablePtr drawable,
jump = _jump[(damage != NULL) | !!(dx|dy) << 1];
b = box;
extents = REGION_RECTS(&clip);
last_extents = extents + REGION_NUM_RECTS(&clip);
extents = RegionRects(&clip);
last_extents = extents + RegionNumRects(&clip);
do {
int n = _n;
const xSegment *s = _s;
@ -10217,8 +10217,8 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable,
region.data = NULL;
RegionIntersect(&region, &region, &clip);
nbox = REGION_NUM_RECTS(&region);
box = REGION_RECTS(&region);
nbox = RegionNumRects(&region);
box = RegionRects(&region);
while (nbox--) {
int height = box->y2 - box->y1;
int dst_y = box->y1;
@ -12098,13 +12098,13 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
_y += drawable->y + dy;
RegionTranslate(clip, dx, dy);
extents = REGION_RECTS(clip);
last_extents = extents + REGION_NUM_RECTS(clip);
extents = RegionRects(clip);
last_extents = extents + RegionNumRects(clip);
if (!transparent) /* emulate miImageGlyphBlt */
sna_blt_fill_boxes(sna, GXcopy,
bo, drawable->bitsPerPixel,
bg, extents, REGION_NUM_RECTS(clip));
bg, extents, RegionNumRects(clip));
kgem_set_mode(&sna->kgem, KGEM_BLT, bo);
if (!kgem_check_batch(&sna->kgem, 16) ||
@ -12745,13 +12745,13 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
_y += drawable->y + dy;
RegionTranslate(clip, dx, dy);
extents = REGION_RECTS(clip);
last_extents = extents + REGION_NUM_RECTS(clip);
extents = RegionRects(clip);
last_extents = extents + RegionNumRects(clip);
if (!transparent) /* emulate miImageGlyphBlt */
sna_blt_fill_boxes(sna, GXcopy,
bo, drawable->bitsPerPixel,
bg, extents, REGION_NUM_RECTS(clip));
bg, extents, RegionNumRects(clip));
kgem_set_mode(&sna->kgem, KGEM_BLT, bo);
if (!kgem_check_batch(&sna->kgem, 16) ||
@ -13138,8 +13138,8 @@ sna_push_pixels_solid_blt(GCPtr gc,
kgem_set_mode(&sna->kgem, KGEM_BLT, bo);
/* Region is pre-clipped and translated into pixmap space */
box = REGION_RECTS(region);
n = REGION_NUM_RECTS(region);
box = RegionRects(region);
n = RegionNumRects(region);
do {
int bx1 = (box->x1 - region->extents.x1) & ~7;
int bx2 = (box->x2 - region->extents.x1 + 7) & ~7;
@ -13385,6 +13385,10 @@ static int sna_create_gc(GCPtr gc)
gc->miTranslate = 1;
gc->fExpose = 1;
gc->freeCompClip = 0;
gc->pCompositeClip = 0;
gc->pRotatedPixmap = 0;
fb_gc(gc)->bpp = bits_per_pixel(gc->depth);
gc->funcs = (GCFuncs *)&sna_gc_funcs;
@ -13863,8 +13867,8 @@ static void sna_accel_post_damage(struct sna *sna)
region.extents.x2, region.extents.y2,
RegionNumRects(&region.extents)));
box = REGION_RECTS(&region);
n = REGION_NUM_RECTS(&region);
box = RegionRects(&region);
n = RegionNumRects(&region);
if (wedged(sna)) {
fallback:
if (!sna_pixmap_move_to_cpu(src, MOVE_READ))
@ -14019,7 +14023,7 @@ sna_get_window_pixmap(WindowPtr window)
static void
sna_set_window_pixmap(WindowPtr window, PixmapPtr pixmap)
{
*(PixmapPtr *)dixGetPrivateAddr(&window->devPrivates, &sna_window_key) = pixmap;
*(PixmapPtr *)__get_private(window, sna_window_key) = pixmap;
}
static Bool
@ -14107,10 +14111,12 @@ static bool sna_picture_init(ScreenPtr screen)
ps->UnrealizeGlyph = sna_glyph_unrealize;
ps->AddTraps = sna_add_traps;
ps->Trapezoids = sna_composite_trapezoids;
#if HAS_PIXMAN_TRIANGLES
ps->Triangles = sna_composite_triangles;
#if PICTURE_SCREEN_VERSION >= 2
ps->TriStrip = sna_composite_tristrip;
ps->TriFan = sna_composite_trifan;
#endif
#endif
return true;

View File

@ -399,8 +399,8 @@ static void _assert_pixmap_contains_box(PixmapPtr pixmap, BoxPtr box, const char
static void apply_damage(struct sna_composite_op *op, RegionPtr region)
{
DBG(("%s: damage=%p, region=%d [(%d, %d), (%d, %d) + (%d, %d)]\n",
__FUNCTION__, op->damage, REGION_NUM_RECTS(region),
DBG(("%s: damage=%p, region=%ld [(%d, %d), (%d, %d) + (%d, %d)]\n",
__FUNCTION__, op->damage, RegionNumRects(region),
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2,
op->dst.x, op->dst.y));
@ -438,6 +438,18 @@ static inline bool use_cpu(PixmapPtr pixmap, struct sna_pixmap *priv,
return (priv->create & KGEM_CAN_CREATE_GPU) == 0;
}
static void validate_source(PicturePtr picture)
{
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,10,99,901,0)
miCompositeSourceValidate(picture);
#else
miCompositeSourceValidate(picture,
0, 0,
picture->pDrawable ? picture->pDrawable->width : 0,
picture->pDrawable ? picture->pDrawable->height : 0);
#endif
}
void
sna_composite_fb(CARD8 op,
PicturePtr src,
@ -492,9 +504,9 @@ sna_composite_fb(CARD8 op,
DBG(("%s: fallback -- fbComposite\n", __FUNCTION__));
miCompositeSourceValidate(src);
validate_source(src);
if (mask)
miCompositeSourceValidate(mask);
validate_source(mask);
src_image = image_from_pict(src, FALSE, &src_xoff, &src_yoff);
mask_image = image_from_pict(mask, FALSE, &msk_xoff, &msk_yoff);
@ -635,8 +647,8 @@ sna_composite(CARD8 op,
tmp.box(sna, &tmp, &region.extents);
else
tmp.boxes(sna, &tmp,
REGION_BOXPTR(&region),
REGION_NUM_RECTS(&region));
RegionBoxptr(&region),
RegionNumRects(&region));
apply_damage(&tmp, &region);
tmp.done(sna, &tmp);
@ -844,11 +856,11 @@ sna_composite_rectangles(CARD8 op,
return;
}
DBG(("%s: drawable extents (%d, %d),(%d, %d) x %d\n",
DBG(("%s: drawable extents (%d, %d),(%d, %d) x %ld\n",
__FUNCTION__,
RegionExtents(&region)->x1, RegionExtents(&region)->y1,
RegionExtents(&region)->x2, RegionExtents(&region)->y2,
RegionNumRects(&region)));
(long)RegionNumRects(&region)));
if (dst->pCompositeClip->data &&
(!pixman_region_intersect(&region, &region, dst->pCompositeClip) ||
@ -859,11 +871,11 @@ sna_composite_rectangles(CARD8 op,
return;
}
DBG(("%s: clipped extents (%d, %d),(%d, %d) x %d\n",
DBG(("%s: clipped extents (%d, %d),(%d, %d) x %ld\n",
__FUNCTION__,
RegionExtents(&region)->x1, RegionExtents(&region)->y1,
RegionExtents(&region)->x2, RegionExtents(&region)->y2,
RegionNumRects(&region)));
(long)RegionNumRects(&region)));
pixmap = get_drawable_pixmap(dst->pDrawable);
get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y);
@ -999,8 +1011,8 @@ fallback:
assert(pixmap->devPrivate.ptr);
if (op <= PictOpSrc) {
int nbox = REGION_NUM_RECTS(&region);
BoxPtr box = REGION_RECTS(&region);
int nbox = RegionNumRects(&region);
BoxPtr box = RegionRects(&region);
uint32_t pixel;
if (op == PictOpClear)

View File

@ -2,7 +2,6 @@
#define SNA_DAMAGE_H
#include <regionstr.h>
#include <list.h>
#include "compiler.h"

View File

@ -965,7 +965,9 @@ void sna_copy_fbcon(struct sna *sna)
kgem_bo_destroy(&sna->kgem, bo);
#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(10, 0)
sna->scrn->pScreen->canDoBGNoneRoot = ok;
#endif
cleanup_scratch:
FreeScratchPixmapHeader(scratch);
@ -2479,13 +2481,13 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
sna_crtc_disable(crtc);
}
if (screen->root) {
if (root(screen)) {
struct sna_visit_set_pixmap_window visit;
visit.old = old_front;
visit.new = sna->front;
TraverseTree(screen->root, sna_visit_set_window_pixmap, &visit);
assert(screen->GetWindowPixmap(screen->root) == sna->front);
TraverseTree(root(screen), sna_visit_set_window_pixmap, &visit);
assert(screen->GetWindowPixmap(root(screen)) == sna->front);
}
screen->SetScreenPixmap(sna->front);
assert(screen->GetScreenPixmap(screen) == sna->front);

View File

@ -202,13 +202,13 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
constant static inline void *sna_pixmap_get_buffer(PixmapPtr pixmap)
{
assert(pixmap->refcnt);
return ((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[2];
return ((void **)__get_private(pixmap, sna_pixmap_key))[2];
}
static inline void sna_pixmap_set_buffer(PixmapPtr pixmap, void *ptr)
{
assert(pixmap->refcnt);
((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[2] = ptr;
((void **)__get_private(pixmap, sna_pixmap_key))[2] = ptr;
}
void
@ -963,7 +963,7 @@ sna_dri_get_pipe(DrawablePtr pDraw)
static struct sna_dri_frame_event *
sna_dri_window_get_chain(WindowPtr win)
{
return ((void **)dixGetPrivateAddr(&win->devPrivates, &sna_window_key))[1];
return ((void **)__get_private(win, sna_window_key))[1];
}
static void
@ -972,7 +972,7 @@ sna_dri_window_set_chain(WindowPtr win,
{
DBG(("%s: head now %p\n", __FUNCTION__, chain));
assert(win->drawable.type == DRAWABLE_WINDOW);
((void **)dixGetPrivateAddr(&win->devPrivates, &sna_window_key))[1] = chain;
((void **)__get_private(win, sna_window_key))[1] = chain;
}
static void

View File

@ -186,7 +186,7 @@ sna_set_fallback_mode(ScrnInfoPtr scrn)
xf86DisableUnusedFunctions(scrn);
#ifdef RANDR_12_INTERFACE
if (scrn->pScreen->root)
if (root(scrn->pScreen))
xf86RandR12TellChanged(scrn->pScreen);
#endif
}
@ -855,6 +855,7 @@ static void sna_mode_set(ScrnInfoPtr scrn)
static Bool
sna_register_all_privates(void)
{
#if HAS_DIXREGISTERPRIVATEKEY
if (!dixRegisterPrivateKey(&sna_pixmap_key, PRIVATE_PIXMAP,
3*sizeof(void *)))
return FALSE;
@ -870,6 +871,19 @@ sna_register_all_privates(void)
if (!dixRegisterPrivateKey(&sna_window_key, PRIVATE_WINDOW,
2*sizeof(void *)))
return FALSE;
#else
if (!dixRequestPrivate(&sna_pixmap_key, 3*sizeof(void *)))
return FALSE;
if (!dixRequestPrivate(&sna_gc_key, sizeof(FbGCPrivate)))
return FALSE;
if (!dixRequestPrivate(&sna_glyph_key, sizeof(struct sna_glyph)))
return FALSE;
if (!dixRequestPrivate(&sna_window_key, 2*sizeof(void *)))
return FALSE;
#endif
return TRUE;
}
@ -1168,7 +1182,9 @@ Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
scrn->ValidMode = sna_valid_mode;
scrn->PMEvent = sna_pm_event;
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
scrn->ModeSet = sna_mode_set;
#endif
xf86SetEntitySharable(entity_num);
xf86SetEntityInstanceForScreen(scrn, entity_num,

View File

@ -110,7 +110,7 @@ extern DevPrivateKeyRec sna_glyph_key;
static inline struct sna_glyph *sna_glyph(GlyphPtr glyph)
{
return dixGetPrivateAddr(&glyph->devPrivates, &sna_glyph_key);
return __get_private(glyph, sna_glyph_key);
}
#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
@ -246,6 +246,7 @@ bool sna_glyphs_create(struct sna *sna)
goto bail;
ValidatePicture(picture);
assert(picture->pDrawable == &pixmap->drawable);
cache->count = cache->evict = 0;
cache->picture = picture;

View File

@ -7046,6 +7046,7 @@ project_point_onto_grid(const xPointFixed *in,
out->y = dy + pixman_fixed_to_grid(in->y);
}
#if HAS_PIXMAN_TRIANGLES
static inline bool
xTriangleValid(const xTriangle *t)
{
@ -7988,3 +7989,4 @@ sna_composite_trifan(CARD8 op,
{
trifan_fallback(op, src, dst, maskFormat, xSrc, ySrc, n, points);
}
#endif