From: Dave Airlie <[email protected]> This patch returns NULL for pixmap creation when we are using mixed pixmaps and the pixmap has a size.
The size check is necessary for the front buffer. We add a flag to force pixmap creation for certain pixmaps that need to be hw, like the DRI2 and Xv ones. Idea from Michel and workarounds from Ben Skeggs. Signed-off-by: Dave Airlie <[email protected]> --- src/radeon.h | 1 + src/radeon_dri2.c | 8 ++++++++ src/radeon_exa.c | 12 +++++++++++- src/radeon_textured_video.c | 2 ++ 4 files changed, 22 insertions(+), 1 deletions(-) diff --git a/src/radeon.h b/src/radeon.h index 5cdc3db..c959c56 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -888,6 +888,7 @@ typedef struct { Bool accelOn; Bool useEXA; #ifdef USE_EXA + Bool exa_force_create; XF86ModReqInfo exaReq; #endif #ifdef USE_XAA diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c index db46d27..56c00a3 100644 --- a/src/radeon_dri2.c +++ b/src/radeon_dri2.c @@ -65,6 +65,8 @@ radeon_dri2_create_buffers(DrawablePtr drawable, int count) { ScreenPtr pScreen = drawable->pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); BufferPtr buffers; struct dri2_buffer_priv *privates; PixmapPtr pixmap, depth_pixmap; @@ -120,7 +122,9 @@ radeon_dri2_create_buffers(DrawablePtr drawable, if (attachments[i] == DRI2BufferDepth) { depth_pixmap = pixmap; } + info->exa_force_create = TRUE; exaMoveInPixmap(pixmap); + info->exa_force_create = FALSE; driver_priv = exaGetPixmapDriverPrivate(pixmap); r = radeon_gem_get_kernel_name(driver_priv->bo, &buffers[i].name); if (r) @@ -143,6 +147,8 @@ radeon_dri2_create_buffer(DrawablePtr drawable, unsigned int format) { ScreenPtr pScreen = drawable->pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); BufferPtr buffers; struct dri2_buffer_priv *privates; PixmapPtr pixmap, depth_pixmap; @@ -198,7 +204,9 @@ radeon_dri2_create_buffer(DrawablePtr drawable, if (attachment == DRI2BufferDepth) { depth_pixmap = pixmap; } + info->exa_force_create = TRUE; exaMoveInPixmap(pixmap); + info->exa_force_create = FALSE; driver_priv = exaGetPixmapDriverPrivate(pixmap); r = radeon_gem_get_kernel_name(driver_priv->bo, &buffers->name); if (r) diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 99a93a4..a985624 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -391,6 +391,11 @@ void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align) RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_exa_pixmap_priv *new_priv; + if (info->accel_state->exa->flags & EXA_MIXED_PIXMAPS) { + if (size != 0 && !info->exa_force_create && info->vram_size <= (32*1024*1024)) + return NULL; + } + new_priv = xcalloc(1, sizeof(struct radeon_exa_pixmap_priv)); if (!new_priv) return NULL; @@ -421,7 +426,12 @@ void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, uint32_t size; uint32_t tiling = 0; int pixmap_align = 0; - + + if (info->accel_state->exa->flags & EXA_MIXED_PIXMAPS) { + if (width != 0 && height != 0 && !info->exa_force_create && info->vram_size <= (32*1024*1024)) + return NULL; + } + if (usage_hint) { if (info->allowColorTiling) { if (usage_hint & RADEON_CREATE_PIXMAP_TILING_MACRO) diff --git a/src/radeon_textured_video.c b/src/radeon_textured_video.c index 39c7574..7396f6f 100644 --- a/src/radeon_textured_video.c +++ b/src/radeon_textured_video.c @@ -349,7 +349,9 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, #ifdef USE_EXA if (info->useEXA) { /* Force the pixmap into framebuffer so we can draw to it. */ + info->exa_force_create = TRUE; exaMoveInPixmap(pPriv->pPixmap); + info->exa_force_create = FALSE; } #endif -- 1.6.5.2 _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
