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