From c29c2002c2d3d474456a16584fa2ebef43de8544 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 6 May 2009 02:54:42 +1000 Subject: [PATCH] radeon: always pull srcs into CPU space for rendering dsts at least get write combined in theory though who knows with blending really need an XA already --- src/radeon_bufmgr_gem.c | 16 ++++++++++++++++ src/radeon_bufmgr_gem.h | 1 + src/radeon_exa.c | 6 +++++- 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/src/radeon_bufmgr_gem.c b/src/radeon_bufmgr_gem.c index 634d28d..03d0a20 100644 --- a/src/radeon_bufmgr_gem.c +++ b/src/radeon_bufmgr_gem.c @@ -239,6 +239,22 @@ dri_bufmgr_gem_destroy(dri_bufmgr *bufmgr) free(bufmgr); } +void radeon_bufmgr_gem_force_map(dri_bo *buf) +{ + dri_bufmgr_gem *bufmgr_gem = (dri_bufmgr_gem *)buf->bufmgr; + struct drm_radeon_gem_set_domain sd_args; + dri_bo_gem *gem_bo = (dri_bo_gem *)buf; + int ret; + + + sd_args.handle = gem_bo->gem_handle; + sd_args.read_domains = RADEON_GEM_DOMAIN_GTT; + sd_args.write_domain = 0; + + ret = drmCommandWriteRead(bufmgr_gem->fd, DRM_RADEON_GEM_SET_DOMAIN, + &sd_args, sizeof(sd_args)); +} + void radeon_bufmgr_gem_wait_rendering(dri_bo *buf) { dri_bufmgr_gem *bufmgr_gem = (dri_bufmgr_gem *)buf->bufmgr; diff --git a/src/radeon_bufmgr_gem.h b/src/radeon_bufmgr_gem.h index 52b3d99..eb7974e 100644 --- a/src/radeon_bufmgr_gem.h +++ b/src/radeon_bufmgr_gem.h @@ -4,6 +4,7 @@ #include "radeon_dri_bufmgr.h" +extern void radeon_bufmgr_gem_force_map(dri_bo *buf); extern void radeon_bufmgr_gem_wait_rendering(dri_bo *bo); void radeon_bufmgr_gem_emit_reloc(dri_bo *bo, struct radeon_relocs_info *reloc_info, uint32_t *head, uint32_t *count_p, uint32_t read_domains, uint32_t write_domain); void radeon_gem_bufmgr_post_submit(dri_bufmgr *bufmgr, struct radeon_relocs_info *reloc_info, int error); diff --git a/src/radeon_exa.c b/src/radeon_exa.c index cc48a7a..267c5c3 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -272,7 +272,11 @@ static Bool RADEONPrepareAccess(PixmapPtr pPix, int index) if (radeon_bufmgr_gem_has_references(driver_priv->bo)) RADEONCPFlushIndirect(pScrn, 0); - radeon_bufmgr_gem_wait_rendering(driver_priv->bo); + /* if we hit a sw fallback for a src or mask pull them into cpu accessible space */ + if (index) + radeon_bufmgr_gem_force_map(driver_priv->bo); + else + radeon_bufmgr_gem_wait_rendering(driver_priv->bo); /* flush IB */ ret = dri_bo_map(driver_priv->bo, 1); -- 1.6.2.2