st/xorg: Set shared usage of pixmaps for use via DRI2.
authorMichel Dänzer <daenzer@vmware.com>
Thu, 27 Aug 2009 18:29:32 +0000 (20:29 +0200)
committerMichel Dänzer <daenzer@vmware.com>
Thu, 27 Aug 2009 18:29:32 +0000 (20:29 +0200)
Also allow pixmaps to have both the shared and displayed usage flags, as is
the case for the screen pixmap now.

src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_driver.c
src/gallium/state_trackers/xorg/xorg_exa.c

index 111024692eb049ef0d0630f8e7c570c614ad640d..1a4677b50e523283b19659117ad1c2b646796d5d 100644 (file)
@@ -92,7 +92,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
            else
                pPixmap = (*pScreen->GetWindowPixmap)((WindowPtr) pDraw);
            pPixmap->refcnt++;
-           tex = xorg_exa_get_texture(pPixmap);
        } else if (attachments[i] == DRI2BufferStencil) {
            pipe_texture_reference(&tex, depth);
        } else if (attachments[i] == DRI2BufferDepth) {
@@ -110,19 +109,24 @@ 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_DEPTH_STENCIL;
+           template.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL |
+               PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
            tex = ms->screen->texture_create(ms->screen, &template);
            depth = tex;
        } else if (attachments[i] == DRI2BufferFakeFrontLeft &&
                   pDraw->type == DRAWABLE_PIXMAP) {
            pPixmap = (PixmapPtr) pDraw;
            pPixmap->refcnt++;
-           tex = xorg_exa_get_texture(pPixmap);
        } else {
            pPixmap = (*pScreen->CreatePixmap)(pScreen, pDraw->width,
                                               pDraw->height,
                                               pDraw->depth,
                                               0);
+       }
+
+       if (pPixmap) {
+           xorg_exa_set_shared_usage(pPixmap);
+           pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL);
            tex = xorg_exa_get_texture(pPixmap);
        }
 
index 923662b24a933ea7e843c62ce6001b069dc1fdbd..d225345969621cf755e11a3f9b769af8f22cf7c0 100644 (file)
@@ -481,6 +481,7 @@ CreateScreenResources(ScreenPtr pScreen)
     rootPixmap = pScreen->GetScreenPixmap(pScreen);
 
     xorg_exa_set_displayed_usage(rootPixmap);
+    xorg_exa_set_shared_usage(rootPixmap);
     if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
        FatalError("Couldn't adjust screen pixmap\n");
 
index 01846087ef19adf3770c955dedc44d8143f85ae4..4fc8d325abee9136eab59f4df3cba83a4cc77d11 100644 (file)
@@ -373,11 +373,7 @@ xorg_exa_set_displayed_usage(PixmapPtr pPixmap)
        return 0;
     }
 
-    if (priv->flags & ~PIPE_TEXTURE_USAGE_PRIMARY) {
-       FatalError("BAD FLAGS\n");
-       return 0;
-    }
-    priv->flags = PIPE_TEXTURE_USAGE_PRIMARY;
+    priv->flags |= PIPE_TEXTURE_USAGE_PRIMARY;
 
     return 0;
 }
@@ -393,11 +389,7 @@ xorg_exa_set_shared_usage(PixmapPtr pPixmap)
        return 0;
     }
 
-    if (priv->flags & ~PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
-       FatalError("BAD FLAGS\n");
-       return 0;
-    }
-    priv->flags = PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
+    priv->flags |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
 
     return 0;
 }