Mesa (master): st/xorg: Make it work again

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed Aug 5 17:34:01 UTC 2009


Module: Mesa
Branch: master
Commit: 3905119b4743eb5d284236cc237ee2c19ae3c5c8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3905119b4743eb5d284236cc237ee2c19ae3c5c8

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Wed Aug  5 19:26:21 2009 +0100

st/xorg: Make it work again

---

 src/gallium/state_trackers/xorg/xorg_dri2.c    |   15 ++++++-
 src/gallium/state_trackers/xorg/xorg_driver.c  |   18 ++++++--
 src/gallium/state_trackers/xorg/xorg_exa.c     |   52 ++++++++++++++++++++++-
 src/gallium/state_trackers/xorg/xorg_exa.h     |    2 +
 src/gallium/state_trackers/xorg/xorg_tracker.h |    9 ++++-
 5 files changed, 86 insertions(+), 10 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_dri2.c b/src/gallium/state_trackers/xorg/xorg_dri2.c
index ae3338f..49a63de 100644
--- a/src/gallium/state_trackers/xorg/xorg_dri2.c
+++ b/src/gallium/state_trackers/xorg/xorg_dri2.c
@@ -39,6 +39,8 @@
 #include "pipe/p_state.h"
 #include "pipe/p_inlines.h"
 
+#include "util/u_rect.h"
+
 typedef struct {
     PixmapPtr pPixmap;
     struct pipe_texture *tex;
@@ -83,7 +85,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
 	    pipe_texture_reference(&tex, depth);
 	} else if (attachments[i] == DRI2BufferDepth) {
 	    struct pipe_texture template;
-
 	    memset(&template, 0, sizeof(template));
 	    template.target = PIPE_TEXTURE_2D;
 	    template.format = PIPE_FORMAT_S8Z24_UNORM;
@@ -92,8 +93,9 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
 	    template.height[0] = pDraw->height;
 	    template.depth[0] = 1;
 	    template.last_level = 0;
-	    template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+	    template.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
 	    tex = ms->screen->texture_create(ms->screen, &template);
+	    depth = tex;
 	} else {
 	    struct pipe_texture template;
 	    memset(&template, 0, sizeof(template));
@@ -108,6 +110,9 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
 	    tex = ms->screen->texture_create(ms->screen, &template);
 	}
 
+	if (!tex)
+		FatalError("NO TEXTURE IN DRI2\n");
+
 	ms->api->buffer_from_texture(ms->api, tex, &buf, &stride);
 	ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle);
 
@@ -138,6 +143,7 @@ driDestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
     modesettingPtr ms = modesettingPTR(pScrn);
     BufferPrivatePtr private;
     int i;
+    (void)ms;
 
     for (i = 0; i < count; i++) {
 	private = buffers[i].driverPrivate;
@@ -172,8 +178,13 @@ driCopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
 	ms->screen->get_tex_surface(ms->screen, src_priv->tex, 0, 0, 0,
 				    PIPE_BUFFER_USAGE_GPU_READ);
 
+#if 0
     ms->ctx->surface_copy(ms->ctx, dst_surf, 0, 0, src_surf,
 			  0, 0, pDraw->width, pDraw->height);
+#else
+    util_surface_copy(ms->ctx, false, dst_surf, 0, 0, src_surf,
+		      0, 0, pDraw->width, pDraw->height);
+#endif
 
     pipe_surface_reference(&dst_surf, NULL);
     pipe_surface_reference(&src_surf, NULL);
diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c
index e01e529..d68fd37 100644
--- a/src/gallium/state_trackers/xorg/xorg_driver.c
+++ b/src/gallium/state_trackers/xorg/xorg_driver.c
@@ -179,8 +179,10 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
     modesettingPtr ms = modesettingPTR(pScrn);
     ScreenPtr pScreen = pScrn->pScreen;
     PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
+    unsigned handle, stride;
 
     ms->noEvict = TRUE;
+    xorg_exa_set_displayed_usage(rootPixmap);
     pScreen->ModifyPixmapHeader(rootPixmap,
 				pScrn->virtualX, pScrn->virtualY,
 				pScrn->depth, pScrn->bitsPerPixel,
@@ -188,13 +190,16 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
 				NULL);
     ms->noEvict = FALSE;
 
+    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
+
     drmModeAddFB(ms->fd,
 		 pScrn->virtualX,
 		 pScrn->virtualY,
 		 pScrn->depth,
 		 pScrn->bitsPerPixel,
-		 pScrn->displayWidth * pScrn->bitsPerPixel / 8,
-		 xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
+		 stride,
+		 handle,
+		 &ms->fb_id);
 
     pScrn->frameX0 = 0;
     pScrn->frameY0 = 0;
@@ -426,6 +431,7 @@ CreateScreenResources(ScreenPtr pScreen)
     modesettingPtr ms = modesettingPTR(pScrn);
     PixmapPtr rootPixmap;
     Bool ret;
+    unsigned handle, stride;
 
     ms->noEvict = TRUE;
 
@@ -435,18 +441,22 @@ CreateScreenResources(ScreenPtr pScreen)
 
     rootPixmap = pScreen->GetScreenPixmap(pScreen);
 
+    xorg_exa_set_displayed_usage(rootPixmap);
     if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
 	FatalError("Couldn't adjust screen pixmap\n");
 
     ms->noEvict = FALSE;
 
+    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
+
     drmModeAddFB(ms->fd,
 		 pScrn->virtualX,
 		 pScrn->virtualY,
 		 pScrn->depth,
 		 pScrn->bitsPerPixel,
-		 pScrn->displayWidth * pScrn->bitsPerPixel / 8,
-		 xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
+		 stride,
+		 handle,
+                 &ms->fb_id);
 
     AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
 
diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
index 2c4291a..f2dac73 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
@@ -359,8 +359,48 @@ ExaPixmapIsOffscreen(PixmapPtr pPixmap)
     return FALSE;
 }
 
+int
+xorg_exa_set_displayed_usage(PixmapPtr pPixmap)
+{
+    struct exa_pixmap_priv *priv;
+    priv = exaGetPixmapDriverPrivate(pPixmap);
+
+    if (!priv) {
+	FatalError("NO PIXMAP PRIVATE\n");
+	return 0;
+    }
+
+    if (priv->flags & ~PIPE_TEXTURE_USAGE_PRIMARY) {
+	FatalError("BAD FLAGS\n");
+	return 0;
+    }
+    priv->flags = PIPE_TEXTURE_USAGE_PRIMARY;
+
+    return 0;
+}
+
+int
+xorg_exa_set_shared_usage(PixmapPtr pPixmap)
+{
+    struct exa_pixmap_priv *priv;
+    priv = exaGetPixmapDriverPrivate(pPixmap);
+
+    if (!priv) {
+	FatalError("NO PIXMAP PRIVATE\n");
+	return 0;
+    }
+
+    if (priv->flags & ~PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
+	FatalError("BAD FLAGS\n");
+	return 0;
+    }
+    priv->flags = PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
+
+    return 0;
+}
+
 unsigned
-xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
+xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
 {
     ScreenPtr pScreen = pPixmap->drawable.pScreen;
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
@@ -385,6 +425,9 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
     ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
     ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
     pipe_buffer_reference(&buffer, NULL);
+    if (stride_out)
+	*stride_out = stride;
+
     return handle;
 }
 
@@ -421,7 +464,9 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
 			     bitsPerPixel, devKind, NULL);
 
     /* Deal with screen resize */
-    if (priv->tex && (priv->tex->width[0] != width || priv->tex->height[0] != height)) {
+    if (priv->tex && (priv->tex->width[0] != width ||
+		      priv->tex->height[0] != height ||
+		      priv->tex_flags != priv->flags)) {
 	pipe_texture_reference(&priv->tex, NULL);
     }
 
@@ -436,7 +481,8 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
 	template.height[0] = height;
 	template.depth[0] = 1;
 	template.last_level = 0;
-	template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+	template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags;
+	priv->tex_flags = priv->flags;
 	priv->tex = exa->scrn->texture_create(exa->scrn, &template);
     }
 
diff --git a/src/gallium/state_trackers/xorg/xorg_exa.h b/src/gallium/state_trackers/xorg/xorg_exa.h
index 650997a..f0508eb 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.h
+++ b/src/gallium/state_trackers/xorg/xorg_exa.h
@@ -14,6 +14,8 @@ struct exa_context
 struct exa_pixmap_priv
 {
     int flags;
+    int tex_flags;
+
     struct pipe_texture *tex;
     unsigned int color;
     struct pipe_surface *src_surf; /* for copies */
diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h
index b4742bd..910782d 100644
--- a/src/gallium/state_trackers/xorg/xorg_tracker.h
+++ b/src/gallium/state_trackers/xorg/xorg_tracker.h
@@ -31,6 +31,7 @@
 #ifndef _XORG_TRACKER_H_
 #define _XORG_TRACKER_H_
 
+#include <stddef.h>
 #include <stdint.h>
 #include <errno.h>
 #include <drm.h>
@@ -98,7 +99,13 @@ struct pipe_texture *
 xorg_exa_get_texture(PixmapPtr pPixmap);
 
 unsigned
-xorg_exa_get_pixmap_handle(PixmapPtr pPixmap);
+xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride);
+
+int
+xorg_exa_set_displayed_usage(PixmapPtr pPixmap);
+
+int
+xorg_exa_set_shared_usage(PixmapPtr pPixmap);
 
 void *
 xorg_exa_init(ScrnInfoPtr pScrn);




More information about the mesa-commit mailing list