diff options
author | Michel Dänzer <daenzer@vmware.com> | 2009-08-27 20:29:32 +0200 |
---|---|---|
committer | Michel Dänzer <daenzer@vmware.com> | 2009-08-27 20:29:32 +0200 |
commit | 416ee3c53eeb1664784f224a42e293e5fed783bc (patch) | |
tree | 458f5bcddf20d94d5d1a437d0e3a74b64768b2e3 /src/gallium | |
parent | bfbfcdd7036add7121eb728daad6131fd77304d0 (diff) | |
download | external_mesa3d-416ee3c53eeb1664784f224a42e293e5fed783bc.zip external_mesa3d-416ee3c53eeb1664784f224a42e293e5fed783bc.tar.gz external_mesa3d-416ee3c53eeb1664784f224a42e293e5fed783bc.tar.bz2 |
st/xorg: Set shared usage of pixmaps for use via DRI2.
Also allow pixmaps to have both the shared and displayed usage flags, as is
the case for the screen pixmap now.
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_dri2.c | 10 | ||||
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_driver.c | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_exa.c | 12 |
3 files changed, 10 insertions, 13 deletions
diff --git a/src/gallium/state_trackers/xorg/xorg_dri2.c b/src/gallium/state_trackers/xorg/xorg_dri2.c index 1110246..1a4677b 100644 --- a/src/gallium/state_trackers/xorg/xorg_dri2.c +++ b/src/gallium/state_trackers/xorg/xorg_dri2.c @@ -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); } diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c index 923662b..d225345 100644 --- a/src/gallium/state_trackers/xorg/xorg_driver.c +++ b/src/gallium/state_trackers/xorg/xorg_driver.c @@ -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"); diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c index 0184608..4fc8d32 100644 --- a/src/gallium/state_trackers/xorg/xorg_exa.c +++ b/src/gallium/state_trackers/xorg/xorg_exa.c @@ -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; } |