OSDN Git Service

st/xorg: Make it work again
authorJakob Bornecrantz <jakob@vmware.com>
Wed, 5 Aug 2009 18:26:21 +0000 (19:26 +0100)
committerJakob Bornecrantz <jakob@vmware.com>
Wed, 5 Aug 2009 18:29:31 +0000 (19:29 +0100)
src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_driver.c
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/state_trackers/xorg/xorg_exa.h
src/gallium/state_trackers/xorg/xorg_tracker.h

index ae3338f..49a63de 100644 (file)
@@ -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);
index e01e529..d68fd37 100644 (file)
@@ -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);
 
index 2c4291a..f2dac73 100644 (file)
@@ -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);
     }
 
index 650997a..f0508eb 100644 (file)
@@ -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 */
index b4742bd..910782d 100644 (file)
@@ -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);