|
|
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 |
|