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