xserver-xorg-video-intel: Changes to 'upstream-experimental'
configure.ac | 78 -
src/compat-api.h | 1
src/i915_pciids.h | 32
src/intel_device.c | 62
src/intel_module.c | 6
src/intel_options.c | 1
src/intel_options.h | 1
src/sna/Makefile.am | 2
src/sna/gen2_render.c | 55
src/sna/gen3_render.c | 17
src/sna/gen4_render.c | 21
src/sna/gen5_render.c | 21
src/sna/gen6_render.c | 21
src/sna/gen7_render.c | 35
src/sna/gen8_render.c | 32
src/sna/kgem.c | 329 +++-
src/sna/kgem.h | 2
src/sna/sna.h | 147 +-
src/sna/sna_accel.c | 436 ++++--
src/sna/sna_blt.c | 190 ++
src/sna/sna_composite.c | 49
src/sna/sna_cpu.c | 4
src/sna/sna_cpuid.h | 4
src/sna/sna_damage.c | 42
src/sna/sna_display.c | 1880 +++++++++++++++++++++-------
src/sna/sna_display_fake.c | 92 -
src/sna/sna_dri.c | 2534 --------------------------------------
src/sna/sna_dri2.c | 2705 +++++++++++++++++++++++++++++++++++++++++
src/sna/sna_driver.c | 87 -
src/sna/sna_glyphs.c | 311 ++--
src/sna/sna_render.c | 22
src/sna/sna_render.h | 3
src/sna/sna_threads.c | 14
src/sna/sna_tiling.c | 70 -
src/sna/sna_trapezoids.c | 3
src/sna/sna_trapezoids_boxes.c | 7
src/sna/sna_video.c | 51
src/sna/sna_video.h | 18
src/sna/sna_video_overlay.c | 22
src/sna/sna_video_sprite.c | 318 +++-
src/sna/sna_video_textured.c | 20
src/uxa/intel.h | 4
src/uxa/intel_display.c | 24
src/uxa/intel_dri.c | 3
src/uxa/intel_driver.c | 2
src/uxa/intel_glamor.c | 10
src/uxa/uxa-accel.c | 2
src/uxa/uxa-priv.h | 17
src/uxa/uxa-render.c | 4
test/dri2-test.c | 77 -
tools/Makefile.am | 4
tools/virtual.c | 167 +-
52 files changed, 6045 insertions(+), 4014 deletions(-)
New commits:
commit 792584fa740dbc81b72fd4f4bdf27d65b9c046cf
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Wed May 28 14:00:26 2014 +0100
sna/dri2: Reorder declarations to compile on old Xorg
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index cff9737..72f34d6 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -51,6 +51,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <compositeext.h>
#endif
+#if DRI2INFOREC_VERSION < 2
+#error DRI2 version supported by the Xserver is too old
+#endif
+
static inline struct kgem_bo *ref(struct kgem_bo *bo)
{
assert(bo->refcnt);
@@ -78,6 +82,7 @@ get_private(void *buffer)
return (struct sna_dri2_private *)((DRI2Buffer2Ptr)buffer+1);
}
+#if DRI2INFOREC_VERSION >= 4
enum frame_event_type {
WAITMSC = 0,
SWAP,
@@ -206,9 +211,6 @@ sna_dri2_window_get_chain(WindowPtr win)
assert(priv != NULL);
return priv->chain;
}
-
-#if DRI2INFOREC_VERSION < 2
-#error DRI2 version supported by the Xserver is too old
#endif
#if DRI2INFOREC_VERSION < 6
commit 562c47fc21b9029ebff29b53d2be590df4329264
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Wed May 28 12:51:18 2014 +0100
Silence CLang (almost)
Fix up all the warnings about implicit enum conversions. The
container_of() macro remains defunct.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 2e1682c..ce137bd 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -126,7 +126,6 @@ static const struct gt_info ivb_gt2_info = {
static const struct gt_info byt_gt_info = {
.name = "Baytrail (gen7)",
- .urb = { 128, 64, 64 },
.max_vs_threads = 36,
.max_gs_threads = 36,
.max_wm_threads = (48-1) << IVB_PS_MAX_THREADS_SHIFT,
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 24ba6f2..5fa33ce 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -810,11 +810,12 @@ cpu_cache_size__cpuid4(void)
unsigned int eax, ebx, ecx, edx;
unsigned int llc_size = 0;
- int cnt = 0;
+ int cnt;
if (__get_cpuid_max(BASIC_CPUID, NULL) < 4)
return 0;
+ cnt = 0;
do {
unsigned associativity, line_partitions, line_size, sets;
diff --git a/src/sna/sna_cpu.c b/src/sna/sna_cpu.c
index 23e6bcc..a3434b1 100644
--- a/src/sna/sna_cpu.c
+++ b/src/sna/sna_cpu.c
@@ -40,12 +40,13 @@
unsigned sna_cpu_detect(void)
{
unsigned max = __get_cpuid_max(BASIC_CPUID, NULL);
- unsigned int eax, ebx, ecx, edx;
+ unsigned eax, ebx, ecx, edx;
unsigned features = 0;
unsigned extra = 0;
if (max >= 1) {
__cpuid(1, eax, ebx, ecx, edx);
+
if (ecx & bit_SSE3)
features |= SSE3;
@@ -80,6 +81,7 @@ unsigned sna_cpu_detect(void)
if (max >= 7) {
__cpuid_count(7, 0, eax, ebx, ecx, edx);
+
if ((extra & has_YMM) && (ebx & bit_AVX2))
features |= AVX2;
}
diff --git a/src/sna/sna_cpuid.h b/src/sna/sna_cpuid.h
index 5a82c89..ed28a0a 100644
--- a/src/sna/sna_cpuid.h
+++ b/src/sna/sna_cpuid.h
@@ -36,8 +36,8 @@
#include <cpuid.h>
#else
#define __get_cpuid_max(x, y) 0
-#define __cpuid(level, a, b, c, d)
-#define __cpuid_count(level, count, a, b, c, d)
+#define __cpuid(level, a, b, c, d) a = b = c = d = 0
+#define __cpuid_count(level, count, a, b, c, d) a = b = c = d = 0
#endif
#define BASIC_CPUID 0x0
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index ff1cf5e..cff9737 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1984,7 +1984,7 @@ get_current_msc(struct sna *sna, DrawablePtr draw, xf86CrtcPtr crtc)
uint64_t ret = -1;
VG_CLEAR(vbl);
- vbl.request.type = DRM_VBLANK_RELATIVE;
+ vbl.request.type = _DRM_VBLANK_RELATIVE;
vbl.request.sequence = 0;
if (sna_wait_vblank(sna, &vbl, sna_crtc_to_pipe(crtc)) == 0)
ret = sna_crtc_record_vblank(crtc, &vbl);
@@ -2410,7 +2410,7 @@ fail:
}
VG_CLEAR(vbl);
- vbl.request.type = DRM_VBLANK_RELATIVE;
+ vbl.request.type = _DRM_VBLANK_RELATIVE;
vbl.request.sequence = 0;
if (sna_wait_vblank(sna, &vbl, sna_crtc_to_pipe(crtc)) == 0) {
*ust = ust64(vbl.reply.tval_sec, vbl.reply.tval_usec);
@@ -2460,7 +2460,7 @@ sna_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc
VG_CLEAR(vbl);
/* Get current count */
- vbl.request.type = DRM_VBLANK_RELATIVE;
+ vbl.request.type = _DRM_VBLANK_RELATIVE;
vbl.request.sequence = 0;
if (sna_wait_vblank(sna, &vbl, pipe))
goto out_complete;
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index fd73b09..cbec168 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1668,7 +1668,8 @@ do_fixup:
dst = pixman_image_create_bits(channel->pict_format,
w, h, ptr, channel->bo->pitch);
else
- dst = pixman_image_create_bits(picture->format, w, h, NULL, 0);
+ dst = pixman_image_create_bits((pixman_format_code_t)picture->format,
+ w, h, NULL, 0);
if (!dst) {
kgem_bo_destroy(&sna->kgem, channel->bo);
return 0;
@@ -1855,7 +1856,7 @@ sna_render_picture_convert(struct sna *sna,
if (!sna_pixmap_move_to_cpu(pixmap, MOVE_READ))
return 0;
- src = pixman_image_create_bits(picture->format,
+ src = pixman_image_create_bits((pixman_format_code_t)picture->format,
pixmap->drawable.width,
pixmap->drawable.height,
pixmap->devPrivate.ptr,
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 4ad61bf..40663bb 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -791,7 +791,8 @@ trap_upload(PicturePtr picture,
return true;
memset(scratch->devPrivate.ptr, 0, scratch->devKind*height);
- image = pixman_image_create_bits(picture->format, width, height,
+ image = pixman_image_create_bits((pixman_format_code_t)picture->format,
+ width, height,
scratch->devPrivate.ptr,
scratch->devKind);
if (image) {
diff --git a/src/uxa/uxa-accel.c b/src/uxa/uxa-accel.c
index cb465b8..757b276 100644
--- a/src/uxa/uxa-accel.c
+++ b/src/uxa/uxa-accel.c
@@ -942,8 +942,8 @@ uxa_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
uxa_screen_t *uxa_screen = uxa_get_screen(screen);
if (uxa_screen->info->flags & UXA_USE_GLAMOR) {
+ RegionPtr region = NULL;
int ok = 0;
- RegionPtr region;
if (uxa_prepare_access(pDst, UXA_GLAMOR_ACCESS_RW)) {
if (uxa_prepare_access(pSrc, UXA_GLAMOR_ACCESS_RO)) {
diff --git a/src/uxa/uxa-render.c b/src/uxa/uxa-render.c
index 992a008..a138f16 100644
--- a/src/uxa/uxa-render.c
+++ b/src/uxa/uxa-render.c
@@ -926,7 +926,7 @@ uxa_acquire_source(ScreenPtr screen,
INT16 * out_x, INT16 * out_y)
{
return uxa_acquire_picture (screen, pict,
- PICT_a8r8g8b8,
+ PIXMAN_a8r8g8b8,
x, y,
width, height,
out_x, out_y);
@@ -940,7 +940,7 @@ uxa_acquire_mask(ScreenPtr screen,
INT16 * out_x, INT16 * out_y)
{
return uxa_acquire_picture (screen, pict,
- PICT_a8,
+ PIXMAN_a8,
x, y,
width, height,
out_x, out_y);
commit 6282fc9d0d3b2899be52ca4a43a3d9313e9049a6
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Wed May 28 10:42:58 2014 +0100
sna/dri2: Fix the continuation mode for old style triple buffering
Otherwise we end up sending too many SwapCompletes back to the client
and confusing ourselves.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 8aef88d..ff1cf5e 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -238,11 +238,14 @@ sna_dri2_reuse_buffer(DrawablePtr draw, DRI2BufferPtr buffer)
struct sna_dri2_frame_event *info;
info = sna_dri2_window_get_chain((WindowPtr)draw);
+ DBG(("%s: draw->id=%lu, active? %d, current back? %d\n",
+ __FUNCTION__, (long)draw->id, info!=NULL, info && info->back == buffer));
if (info && info->back == buffer) {
DBG(("%s: replacing back buffer\n", __FUNCTION__));
sna_dri2_get_back(to_sna_from_drawable(draw), info);
}
+ assert(kgem_bo_flink(&to_sna_from_drawable(draw)->kgem, get_private(buffer)->bo) == buffer->name);
assert(get_private(buffer)->bo != to_sna_from_drawable(draw)->dri2.scanout[0].bo);
assert(get_private(buffer)->bo != to_sna_from_drawable(draw)->dri2.scanout[1].bo);
}
@@ -1774,7 +1777,7 @@ sna_dri2_flip_continue(struct sna *sna, struct sna_dri2_frame_event *info)
DBG(("%s(mode=%d)\n", __FUNCTION__, info->mode));
if (info->mode > 0){
- struct kgem_bo *bo =get_private(info->front)->bo;
+ struct kgem_bo *bo = get_private(info->front)->bo;
info->type = info->mode;
@@ -1862,7 +1865,7 @@ static void chain_flip(struct sna *sna)
static void sna_dri2_flip_event(struct sna *sna,
struct sna_dri2_frame_event *flip)
{
- DBG(("%s(pipe=%d)\n", __FUNCTION__, flip->pipe));
+ DBG(("%s(pipe=%d, event=%d)\n", __FUNCTION__, flip->pipe, flip->type));
assert(!sna->mode.shadow_flip);
@@ -2094,7 +2097,11 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc,
} else {
DBG(("%s: chaining flip\n", __FUNCTION__));
type = FLIP_THROTTLE;
+#if XORG_CAN_TRIPLE_BUFFER
info->mode = -type;
+#else
+ info->mode = -FLIP_COMPLETE;
+#endif
goto out;
}
}
commit 916354164bcb149e1323a3219d85e7bba6e61e04
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Tue May 27 20:16:55 2014 +0100
sna: Fix the depth/format on the temporary shadow Pictures
When scaling the output, we re-render onto the scanout using a call to
Composite, for which we create temporary Pictures. In most cases, the
mismatching depth/format goes unnoticed, but along one particular
fallback path, we use those to create a new Picture but the mismatching
format results in a segfault.
Reported-by: Matti Hämäläinen <ccr@tnsp.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79320
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 2891b74..3980650 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5165,38 +5165,34 @@ sna_crtc_redisplay__fallback(xf86CrtcPtr crtc, RegionPtr region, struct kgem_bo
PictFormatPtr format;
PicturePtr src, dst;
PixmapPtr pixmap;
- int error;
+ int depth, error;
void *ptr;
DBG(("%s: compositing transformed damage boxes\n", __FUNCTION__));
+ error = sna_render_format_for_depth(sna->front->drawable.depth);
+ depth = PIXMAN_FORMAT_DEPTH(error);
+ format = PictureMatchFormat(screen, depth, error);
+ if (format == NULL) {
+ DBG(("%s: can't find format for depth=%d [%08x]\n",
+ __FUNCTION__, depth, error));
+ return;
+ }
+
ptr = kgem_bo_map__gtt(&sna->kgem, bo);
if (ptr == NULL)
return;
- pixmap = sna_pixmap_create_unattached(screen,
- 0, 0, sna->front->drawable.depth);
+ pixmap = sna_pixmap_create_unattached(screen, 0, 0, depth);
if (pixmap == NullPixmap)
return;
if (!screen->ModifyPixmapHeader(pixmap,
- crtc->mode.HDisplay,
- crtc->mode.VDisplay,
- sna->front->drawable.depth,
- sna->front->drawable.bitsPerPixel,
+ crtc->mode.HDisplay, crtc->mode.VDisplay,
+ depth, sna->front->drawable.bitsPerPixel,
bo->pitch, ptr))
goto free_pixmap;
- error = sna_render_format_for_depth(sna->front->drawable.depth);
- format = PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(error), error);
- if (format == NULL) {
- DBG(("%s: can't find format for depth=%d [%08x]\n",
- __FUNCTION__, sna->front->drawable.depth,
- (int)sna_render_format_for_depth(sna->front->drawable.depth)));
- goto free_pixmap;
- }
-
src = CreatePicture(None, &sna->front->drawable, format,
0, NULL, serverClient, &error);
if (!src)
@@ -5257,36 +5253,32 @@ sna_crtc_redisplay__composite(xf86CrtcPtr crtc, RegionPtr region, struct kgem_bo
PicturePtr src, dst;
PixmapPtr pixmap;
BoxPtr b;
- int n, error;
+ int n, depth, error;
DBG(("%s: compositing transformed damage boxes\n", __FUNCTION__));
- pixmap = sna_pixmap_create_unattached(screen,
- 0, 0, sna->front->drawable.depth);
+ error = sna_render_format_for_depth(sna->front->drawable.depth);
+ depth = PIXMAN_FORMAT_DEPTH(error);
+ format = PictureMatchFormat(screen, depth, error);
+ if (format == NULL) {
+ DBG(("%s: can't find format for depth=%d [%08x]\n",
+ __FUNCTION__, depth, error));
+ return;
+ }
+
+ pixmap = sna_pixmap_create_unattached(screen, 0, 0, depth);
if (pixmap == NullPixmap)
return;
if (!screen->ModifyPixmapHeader(pixmap,
- crtc->mode.HDisplay,
- crtc->mode.VDisplay,
- sna->front->drawable.depth,
- sna->front->drawable.bitsPerPixel,
+ crtc->mode.HDisplay, crtc->mode.VDisplay,
+ depth, sna->front->drawable.bitsPerPixel,
bo->pitch, NULL))
goto free_pixmap;
if (!sna_pixmap_attach_to_bo(pixmap, bo))
goto free_pixmap;
- error = sna_render_format_for_depth(sna->front->drawable.depth);
- format = PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(error), error);
- if (format == NULL) {
- DBG(("%s: can't find format for depth=%d [%08x]\n",
- __FUNCTION__, sna->front->drawable.depth,
- (int)sna_render_format_for_depth(sna->front->drawable.depth)));
- goto free_pixmap;
- }
-
src = CreatePicture(None, &sna->front->drawable, format,
0, NULL, serverClient, &error);
if (!src)
commit d8360bd74f5b62a27c019c65ed9001cac8bf43ed
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Tue May 27 20:14:02 2014 +0100
sna: Handle bad picture format/depth mismatches
Scaling the output feed in an invalid picture->format/depth combination
which causes the fallback downsampling function to explode. Whilst this
is a bug in the higher layer, we can handle the error anyway.
References: https://bugs.freedesktop.org/show_bug.cgi?id=79320
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index d3cb6a0..fd73b09 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -789,6 +789,11 @@ fixup:
format = PictureMatchFormat(screen,
pixmap->drawable.depth,
picture->format);
+ if (format == NULL) {
+ DBG(("%s: invalid depth=%d, format=%08x\n",
+ __FUNCTION__, pixmap->drawable.depth, picture->format));
+ goto fixup;
+ }
tmp_dst = CreatePicture(0, &tmp->drawable, format, 0, NULL,
serverClient, &error);
commit 93b319cf9a355e8400b864046cdb4cfb56b657a0
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Fri May 23 13:16:50 2014 +0100
uxa: Silence the compiler over a couple of unused variables
intel_driver.c: In function 'I830LeaveVT':
intel_driver.c:1085:24: warning: unused variable 'intel' [-Wunused-variable]
intel_screen_private *intel = intel_get_screen_private(scrn);
^
intel_driver.c: In function 'I830EnterVT':
intel_driver.c:1102:24: warning: unused variable 'intel' [-Wunused-variable]
intel_screen_private *intel = intel_get_screen_private(scrn);
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 0a4fe2a..654038c 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -1048,7 +1048,6 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
static void I830LeaveVT(VT_FUNC_ARGS_DECL)
{
SCRN_INFO_PTR(arg);
- intel_screen_private *intel = intel_get_screen_private(scrn);
xf86RotateFreeShadow(scrn);
@@ -1065,7 +1064,6 @@ static void I830LeaveVT(VT_FUNC_ARGS_DECL)
static Bool I830EnterVT(VT_FUNC_ARGS_DECL)
{
SCRN_INFO_PTR(arg);
- intel_screen_private *intel = intel_get_screen_private(scrn);
if (intel_get_master(scrn)) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
commit e6ee0679374f8fc80cb34693f80affe6ea676ddb
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Fri May 23 14:29:42 2014 +0100
uxa: Silence compiler for warnings in Cursor API changes
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c
index 857aa24..46a009e 100644
--- a/src/uxa/intel_display.c
+++ b/src/uxa/intel_display.c
@@ -446,7 +446,7 @@ __intel_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
return ret;
}
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,2)
static Bool
intel_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
{
@@ -656,7 +656,11 @@ static const xf86CrtcFuncsRec intel_crtc_funcs = {
.set_cursor_position = intel_crtc_set_cursor_position,
.show_cursor = intel_crtc_show_cursor,
.hide_cursor = intel_crtc_hide_cursor,
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,2)
+ .load_cursor_argb_check = intel_crtc_load_cursor_argb,
+#else
.load_cursor_argb = intel_crtc_load_cursor_argb,
+#endif
.shadow_create = intel_crtc_shadow_create,
.shadow_allocate = intel_crtc_shadow_allocate,
.shadow_destroy = intel_crtc_shadow_destroy,
commit 4321e8decd7be9daaa49c6ab4e8bb9bd66faae31
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Fri May 23 14:29:42 2014 +0100
sna: Silence compiler for warnings in Cursor API changes
The API changed again in the RC, so update to keep the compiler quiet.
At the same time, protect against the ARGB_CURSOR struct changes.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 8e876fe..2891b74 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3447,6 +3447,15 @@ static struct sna_cursor *__sna_create_cursor(struct sna *sna, int size)
return c;
}
+static uint32_t *get_cursor_argb(CursorPtr c)
+{
+#ifdef ARGB_CURSOR
+ return (uint32_t *)c->bits->argb;
+#else
+ return NULL;
+#endif
+}
+
static struct sna_cursor *__sna_get_cursor(struct sna *sna, xf86CrtcPtr crtc)
{
struct sna_cursor *cursor;
@@ -3475,7 +3484,7 @@ static struct sna_cursor *__sna_get_cursor(struct sna *sna, xf86CrtcPtr crtc)
sna->cursor.ref->bits->width,
sna->cursor.ref->bits->height,
sna->cursor.serial,
- sna->cursor.ref->bits->argb!=NULL));
+ get_cursor_argb(c) != NULL));
rotation = crtc->transform_in_use ? crtc->rotation : RR_Rotate_0;
@@ -3506,7 +3515,7 @@ static struct sna_cursor *__sna_get_cursor(struct sna *sna, xf86CrtcPtr crtc)
height = sna->cursor.ref->bits->height;
source = sna->cursor.ref->bits->source;
mask = sna->cursor.ref->bits->mask;
- argb = (uint32_t *)sna->cursor.ref->bits->argb;
+ argb = get_cursor_argb(sna->cursor.ref);
pitch = BitmapBytePad(width);
image = cursor->image;
@@ -3686,7 +3695,7 @@ sna_set_cursor_colors(ScrnInfoPtr scrn, int _bg, int _fg)
if (sna->cursor.ref == NULL)
return;
- if (sna->cursor.ref->bits->argb)
+ if (get_cursor_argb(sna->cursor.ref))
return;
sna->cursor.serial++;
@@ -3852,19 +3861,20 @@ disable:
sigio_unblock(sigio);
}
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,2)
static Bool
-sna_load_cursor_argb(ScrnInfoPtr scrn, CursorPtr cursor)
+sna_load_cursor_argb2(ScrnInfoPtr scrn, CursorPtr cursor)
{
return TRUE;
}
static Bool
-sna_load_cursor_image(ScrnInfoPtr scrn, unsigned char *src)
+sna_load_cursor_image2(ScrnInfoPtr scrn, unsigned char *src)
{
return TRUE;
}
-#else
+#endif
+
static void
sna_load_cursor_argb(ScrnInfoPtr scrn, CursorPtr cursor)
{
@@ -3874,7 +3884,6 @@ static void
sna_load_cursor_image(ScrnInfoPtr scrn, unsigned char *src)
{
}
-#endif
static int __cursor_size(CursorPtr cursor)
{
@@ -3935,7 +3944,7 @@ sna_use_hw_cursor(ScreenPtr screen, CursorPtr cursor)
__DBG(("%s(%dx%d): ARGB?=%d, serial->%d, size->%d\n", __FUNCTION__,
cursor->bits->width,
cursor->bits->height,
- cursor->bits->argb!=NULL,
+ get_cursor_argb(cursor) != NULL,
sna->cursor.serial,
sna->cursor.size));
@@ -4031,6 +4040,12 @@ sna_cursors_init(ScreenPtr screen, struct sna *sna)
cursor_info->UseHWCursorARGB = sna_use_hw_cursor;
cursor_info->LoadCursorARGB = sna_load_cursor_argb;
#endif
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,2)
+ cursor_info->LoadCursorImageCheck = sna_load_cursor_image2;
+#ifdef ARGB_CURSOR
+ cursor_info->LoadCursorARGBCheck = sna_load_cursor_argb2;
+#endif
+#endif
if (!xf86InitCursor(screen, cursor_info)) {
xf86DestroyCursorInfoRec(cursor_info);
commit 2a0dc7ed4961d5bda08bb583a7a6a2cc633b27e4
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Mon May 26 08:23:45 2014 +0100
sna/dri2: Move scanout processing from frame event to global
The scanout is a global property, track it as so. The primary benefit to
this is it strengthens our assertions that we never hand out an active
scanout for use as a back buffer.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index f88690c..7a1b693 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -315,6 +315,10 @@ struct sna {
#if HAVE_DRI2
void *flip_pending;
+ struct {
+ struct kgem_bo *bo;
+ uint32_t name;
+ } scanout[2];
#endif
} dri2;
@@ -496,6 +500,7 @@ void sna_dri2_page_flip_handler(struct sna *sna, struct drm_event_vblank *event)
void sna_dri2_vblank_handler(struct sna *sna, struct drm_event_vblank *event);
void sna_dri2_pixmap_update_bo(struct sna *sna, PixmapPtr pixmap);
void sna_dri2_destroy_window(WindowPtr win);
+void sna_dri2_reset_scanout(struct sna *sna);
void sna_dri2_close(struct sna *sna, ScreenPtr pScreen);
#else
static inline bool sna_dri2_open(struct sna *sna, ScreenPtr pScreen) { return false; }
@@ -503,6 +508,7 @@ static inline void sna_dri2_page_flip_handler(struct sna *sna, struct drm_event_
static inline void sna_dri2_vblank_handler(struct sna *sna, struct drm_event_vblank *event) { }
static inline void sna_dri2_pixmap_update_bo(struct sna *sna, PixmapPtr pixmap) { }
static inline void sna_dri2_destroy_window(WindowPtr win) { }
+static inline void sna_dri2_reset_scanout(struct sna *sna) { }
static inline void sna_dri2_close(struct sna *sna, ScreenPtr pScreen) { }
#endif
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a81ce21..8e876fe 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4505,6 +4505,8 @@ sna_crtc_config_notify(ScreenPtr screen)
DBG(("%s\n", __FUNCTION__));
+ sna_dri2_reset_scanout(sna);
+
sna_mode_update(sna);
sna_cursors_reload(sna);
}
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 829e5ba..8aef88d 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -112,11 +112,6 @@ struct sna_dri2_frame_event {
struct sna_dri2_frame_event *chain;
- struct {
- struct kgem_bo *bo;
- uint32_t name;
- } scanout[2];
-
struct list cache;
int mode;
@@ -130,15 +125,15 @@ sna_dri2_get_back(struct sna *sna, struct sna_dri2_frame_event *info)
DBG(("%s: scanout=(%d, %d), back=%d, cache?=%d\n",
__FUNCTION__,
- info->scanout[0].bo ? info->scanout[0].bo->handle : 0,
- info->scanout[1].bo ? info->scanout[1].bo->handle : 0,
+ sna->dri2.scanout[0].bo ? sna->dri2.scanout[0].bo->handle : 0,
+ sna->dri2.scanout[1].bo ? sna->dri2.scanout[1].bo->handle : 0,
get_private(info->back)->bo->handle,
!list_is_empty(&info->cache)));
bo = get_private(info->back)->bo;
assert(bo->refcnt);
assert(bo->flush);
- if (!(bo == info->scanout[0].bo || bo == info->scanout[1].bo)) {
+ if (!(bo == sna->dri2.scanout[0].bo || bo == sna->dri2.scanout[1].bo)) {
DBG(("%s: reuse unattached back\n", __FUNCTION__));
return;
}
@@ -173,15 +168,15 @@ sna_dri2_get_back(struct sna *sna, struct sna_dri2_frame_event *info)
}
}
- assert(!(bo == info->scanout[0].bo || bo == info->scanout[1].bo));
+ assert(!(bo == sna->dri2.scanout[0].bo || bo == sna->dri2.scanout[1].bo));
assert(name);
unref(get_private(info->back)->bo);
get_private(info->back)->bo = bo;
info->back->name = name;
- assert(get_private(info->back)->bo != info->scanout[0].bo);
- assert(get_private(info->back)->bo != info->scanout[1].bo);
+ assert(get_private(info->back)->bo != sna->dri2.scanout[0].bo);
+ assert(get_private(info->back)->bo != sna->dri2.scanout[1].bo);
assert(bo->refcnt == 1);
assert(bo->flush);
@@ -247,6 +242,9 @@ sna_dri2_reuse_buffer(DrawablePtr draw, DRI2BufferPtr buffer)
DBG(("%s: replacing back buffer\n", __FUNCTION__));
sna_dri2_get_back(to_sna_from_drawable(draw), info);
}
+
+ assert(get_private(buffer)->bo != to_sna_from_drawable(draw)->dri2.scanout[0].bo);
+ assert(get_private(buffer)->bo != to_sna_from_drawable(draw)->dri2.scanout[1].bo);
}
}
@@ -1192,13 +1190,6 @@ sna_dri2_frame_event_info_free(struct sna *sna,
_sna_dri2_destroy_buffer(sna, info->front);
_sna_dri2_destroy_buffer(sna, info->back);
- assert(info->scanout[1].bo == NULL);
-
- if (info->scanout[0].bo) {
- assert(info->scanout[0].bo->scanout);
- kgem_bo_destroy(&sna->kgem, info->scanout[0].bo);
- }
-
while (!list_is_empty(&info->cache)) {
struct dri_bo *c;
@@ -1254,6 +1245,25 @@ void sna_dri2_destroy_window(WindowPtr win)
free(priv);
}
+static void
+update_scanout(struct sna *sna, struct sna_dri2_frame_event *info, struct kgem_bo *bo, int name)
+{
+ assert(sna->dri2.scanout[1].bo == NULL);
+ assert(sna->dri2.scanout[0].bo->scanout);
+ assert(sna->dri2.scanout[0].bo->refcnt);
+ sna->dri2.scanout[1] = sna->dri2.scanout[0];
+ sna->dri2.scanout[0].bo = ref(bo);
+ sna->dri2.scanout[0].name = name;
+ assert(sna->dri2.scanout[0].bo->scanout);
+
+ DBG(("%s: pending scanout handle=%d, active scanout handle=%d\n",
+ __FUNCTION__, sna->dri2.scanout[0].bo->handle, sna->dri2.scanout[1].bo->handle));
+ assert(sna->dri2.scanout[0].bo->handle != sna->dri2.scanout[1].bo->handle);
+
+ assert(sna->dri2.flip_pending == NULL || sna->dri2.flip_pending == info);
+ sna->dri2.flip_pending = info;
+}
+
static bool
sna_dri2_page_flip(struct sna *sna, struct sna_dri2_frame_event *info)
{
@@ -1264,29 +1274,22 @@ sna_dri2_page_flip(struct sna *sna, struct sna_dri2_frame_event *info)
assert(sna_pixmap_get_buffer(sna->front) == info->front);
assert(get_drawable_pixmap(info->draw)->drawable.height * bo->pitch <= kgem_bo_size(bo));
- assert(info->scanout[0].bo);
- assert(info->scanout[0].bo->scanout);
- assert(info->scanout[1].bo == NULL);
+ assert(sna->dri2.scanout[0].bo);
+ assert(sna->dri2.scanout[0].bo->scanout);
+ assert(sna->dri2.scanout[1].bo == NULL);
assert(bo->refcnt);
info->count = sna_page_flip(sna, bo, info, info->pipe);
if (!info->count)
return false;
- DBG(("%s: mark handle=%d as scanout, swap front (handle=%d, name=%d) and back (handle=%d, name=%d)\n",
+ update_scanout(sna, info, bo, info->back->name);
+
+ DBG(("%s: marked handle=%d as scanout, swap front (handle=%d, name=%d) and back (handle=%d, name=%d)\n",
__FUNCTION__, bo->handle,
get_private(info->front)->bo->handle, info->front->name,
get_private(info->back)->bo->handle, info->back->name));
- info->scanout[1] = info->scanout[0];
- info->scanout[0].bo = ref(bo);
- info->scanout[0].name = info->back->name;
- assert(info->scanout[0].bo->scanout);
-
- DBG(("%s: pending scanout handle=%d, active scanout handle=%d\n",
- __FUNCTION__, info->scanout[0].bo->handle, info->scanout[1].bo->handle));
- assert(info->scanout[0].bo->handle != info->scanout[1].bo->handle);
-
tmp.bo = get_private(info->front)->bo;
tmp.name = info->front->name;
@@ -1298,8 +1301,6 @@ sna_dri2_page_flip(struct sna *sna, struct sna_dri2_frame_event *info)
info->back->name = tmp.name;
get_private(info->back)->bo = tmp.bo;
- sna->dri2.flip_pending = info;
-
info->queued = true;
return true;
}
@@ -1773,23 +1774,18 @@ sna_dri2_flip_continue(struct sna *sna, struct sna_dri2_frame_event *info)
DBG(("%s(mode=%d)\n", __FUNCTION__, info->mode));
if (info->mode > 0){
+ struct kgem_bo *bo =get_private(info->front)->bo;
+
info->type = info->mode;
- if (get_private(info->front)->bo != sna_pixmap(sna->front)->gpu_bo)
+ if (bo != sna_pixmap(sna->front)->gpu_bo)
return false;
- info->count = sna_page_flip(sna,
- get_private(info->front)->bo,
- info, info->pipe);
+ info->count = sna_page_flip(sna, bo, info, info->pipe);
if (!info->count)
return false;
- assert(info->scanout[0].bo->scanout);
- info->scanout[1] = info->scanout[0];
- info->scanout[0].bo = ref(get_private(info->front)->bo);
- info->scanout[0].name = info->front->name;
- assert(info->scanout[0].bo->scanout);
- sna->dri2.flip_pending = info;
+ update_scanout(sna, info, bo, info->front->name);
} else {
info->type = -info->mode;
@@ -1870,18 +1866,18 @@ static void sna_dri2_flip_event(struct sna *sna,
assert(!sna->mode.shadow_flip);
- if (flip->scanout[1].bo) {
+ if (sna->dri2.scanout[1].bo) {
struct dri_bo *c = NULL;
DBG(("%s: retiring previous scanout handle=%d, name=%d, refcnt=%d (current scanout handle=%d)\n",
__FUNCTION__,
- flip->scanout[1].bo->handle,
- flip->scanout[1].name,
- flip->scanout[1].bo->refcnt,
- flip->scanout[0].bo->handle));
+ sna->dri2.scanout[1].bo->handle,
+ sna->dri2.scanout[1].name,
+ sna->dri2.scanout[1].bo->refcnt,
+ sna->dri2.scanout[0].bo->handle));
- if (flip->scanout[1].bo != flip->scanout[0].bo &&
- flip->scanout[1].bo->refcnt == 1) {
+ if (sna->dri2.scanout[1].bo != sna->dri2.scanout[0].bo &&
+ sna->dri2.scanout[1].bo->refcnt == 1) {
DBG(("%s: adding old scanout to flip cache\n", __FUNCTION__));
if (!list_is_empty(&flip->cache))
c = list_last_entry(&flip->cache, struct dri_bo, link);
@@ -1894,19 +1890,19 @@ static void sna_dri2_flip_event(struct sna *sna,
if (c == NULL)
c = malloc(sizeof(*c));
if (c != NULL) {
- c->bo = flip->scanout[1].bo;
- c->name = flip->scanout[1].name;
+ c->bo = sna->dri2.scanout[1].bo;
+ c->name = sna->dri2.scanout[1].name;
list_add(&c->link, &flip->cache);
}
}
if (c == NULL) {
DBG(("%s: not caching old scanout handle=%d, still busy\n",
- __FUNCTION__, flip->scanout[1].bo->handle));
- kgem_bo_destroy(&sna->kgem, flip->scanout[1].bo);
+ __FUNCTION__, sna->dri2.scanout[1].bo->handle));
+ kgem_bo_destroy(&sna->kgem, sna->dri2.scanout[1].bo);
}
- flip->scanout[1].bo = NULL;
+ sna->dri2.scanout[1].bo = NULL;
}
if (sna->dri2.flip_pending == flip)
@@ -2114,9 +2110,12 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc,
info->front = sna_dri2_reference_buffer(front);
info->back = sna_dri2_reference_buffer(back);
- info->scanout[0].bo = ref(get_private(front)->bo);
- info->scanout[0].name = info->front->name;
- assert(info->scanout[0].bo->scanout);
+ if (sna->dri2.scanout[0].bo == NULL) {
+ sna->dri2.scanout[0].bo = ref(get_private(front)->bo);
+ sna->dri2.scanout[0].name = info->front->name;
+ }
+ assert(sna->dri2.scanout[0].bo == get_private(front)->bo);
+ assert(sna->dri2.scanout[0].bo->scanout);
if (sna->dri2.flip_pending) {
/* We need to first wait (one vblank) for the
@@ -2161,9 +2160,12 @@ out:
info->front = sna_dri2_reference_buffer(front);
info->back = sna_dri2_reference_buffer(back);
- info->scanout[0].bo = ref(get_private(front)->bo);
- info->scanout[0].name = info->front->name;
- assert(info->scanout[0].bo->scanout);
+ if (sna->dri2.scanout[0].bo == NULL) {
+ sna->dri2.scanout[0].bo = ref(get_private(front)->bo);
+ sna->dri2.scanout[0].name = info->front->name;
+ }
+ assert(sna->dri2.scanout[0].bo == get_private(front)->bo);
+ assert(sna->dri2.scanout[0].bo->scanout);
/*
Reply to: