From cb51f0267853dad419d169587aecbecf1800e8c3 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 11 Jan 2010 21:32:13 +0100 Subject: Revert "st/dri: no need to request fake front buffer, only handle it being returned" This reverts commit 1336989ec60fff7bd590fefd28945a0e5dc536e3. The commit breaks frontbuffer rendering and the possibility to do on-demand frontbuffer requests on all Xservers prior to 1.7. The commit should be conditioned on a dri2 version check. I've submitted a patch to Xserver to bump dri2 minor, and it's acked by Ian. To be able to check the version from within the state tracker, we will probably need another dri2 extension function that returns the server version. The protocol has support for it. Signed-off-by: Thomas Hellstrom --- src/gallium/state_trackers/dri/dri_drawable.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 5625ff53cf..c4dfb0c41f 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -180,6 +180,7 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv) switch (buffers[i].attachment) { case __DRI_BUFFER_FRONT_LEFT: + continue; case __DRI_BUFFER_FAKE_FRONT_LEFT: index = ST_SURFACE_FRONT_LEFT; format = drawable->color_format; @@ -367,6 +368,8 @@ dri_create_buffer(__DRIscreenPrivate * sPriv, if (visual->doubleBufferMode) drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT; + else + drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT; if (visual->depthBits && visual->stencilBits) drawable->attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; else if (visual->depthBits) -- cgit v1.2.3 From 3447d545d99c450c6a13d8a37e9cb9f5463a40eb Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Mon, 11 Jan 2010 18:03:49 -0500 Subject: st/xorg: fix a rare video crash sometimes dst isn't present if a window is in a middle of a resize, stop crashing in those cases and just ignore a frame. --- src/gallium/state_trackers/xorg/xorg_xv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/xorg/xorg_xv.c b/src/gallium/state_trackers/xorg/xorg_xv.c index 19c50051a8..666ff104b9 100644 --- a/src/gallium/state_trackers/xorg/xorg_xv.c +++ b/src/gallium/state_trackers/xorg/xorg_xv.c @@ -486,7 +486,7 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, Bool hdtv; int x, y, w, h; struct exa_pixmap_priv *dst = exaGetPixmapDriverPrivate(pPixmap); - struct pipe_surface *dst_surf = xorg_gpu_surface(pPriv->r->pipe->screen, dst); + struct pipe_surface *dst_surf = NULL; if (dst && !dst->tex) { xorg_exa_set_shared_usage(pPixmap); @@ -496,6 +496,7 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, if (!dst || !dst->tex) XORG_FALLBACK("Xv destination %s", !dst ? "!dst" : "!dst->tex"); + dst_surf = xorg_gpu_surface(pPriv->r->pipe->screen, dst); hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y)); REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x, -- cgit v1.2.3 From d880b64423d9eab7e6cbe3ad93dfefd6a9613cce Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Mon, 11 Jan 2010 18:27:59 -0500 Subject: st/xorg: move exaMoveInPixmap before trying to fetch it as Michel suggested, this is a cleaner way of fixing crashes caused by exaGetPixmapDriverPrivate returning null since the data hasn't been moved yet. --- src/gallium/state_trackers/xorg/xorg_xv.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/xorg/xorg_xv.c b/src/gallium/state_trackers/xorg/xorg_xv.c index 666ff104b9..a437370525 100644 --- a/src/gallium/state_trackers/xorg/xorg_xv.c +++ b/src/gallium/state_trackers/xorg/xorg_xv.c @@ -485,9 +485,12 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, int dxo, dyo; Bool hdtv; int x, y, w, h; - struct exa_pixmap_priv *dst = exaGetPixmapDriverPrivate(pPixmap); + struct exa_pixmap_priv *dst; struct pipe_surface *dst_surf = NULL; + exaMoveInPixmap(pPixmap); + dst = exaGetPixmapDriverPrivate(pPixmap); + if (dst && !dst->tex) { xorg_exa_set_shared_usage(pPixmap); pScrn->pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL); @@ -516,7 +519,6 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, bind_samplers(pPriv); setup_fs_video_constants(pPriv->r, hdtv); - exaMoveInPixmap(pPixmap); DamageDamageRegion(&pPixmap->drawable, dstRegion); while (nbox--) { -- cgit v1.2.3 From a9086f2d17a58bd2597d34a6cc886dc111997e4e Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Wed, 13 Jan 2010 17:40:41 +0100 Subject: st/dri: Make sure we always request a fake front. This should be the correct, but sub-optimal way to handle things on pre-1.7 servers. For servers that automatically adds a fake front we should never request the fake front and handle the reply differently. Signed-off-by: Thomas Hellstrom --- src/gallium/state_trackers/dri/dri_drawable.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index c4dfb0c41f..3c17ccde0a 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -365,11 +365,10 @@ dri_create_buffer(__DRIscreenPrivate * sPriv, /* TODO incase of double buffer visual, delay fake creation */ i = 0; drawable->attachments[i++] = __DRI_BUFFER_FRONT_LEFT; + drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT; if (visual->doubleBufferMode) drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT; - else - drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT; if (visual->depthBits && visual->stencilBits) drawable->attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; else if (visual->depthBits) -- cgit v1.2.3