summaryrefslogtreecommitdiff
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2014-03-08 16:00:25 +0100
committerMarek Olšák <marek.olsak@amd.com>2014-03-08 16:00:25 +0100
commitc1a06da4653b7bb8c0418bfbfa6cf46cc1aad2e8 (patch)
tree938d77cd1136a5ea1439f17949c9452c583752e5 /src/gallium/winsys
parenta995f564c7b226438d10e5d5895692ed1fd550e3 (diff)
Revert "winsys/radeon: if there's VRAM-only usage, keep it"
This reverts commit 67aef6dafa29fed008ea6065c425a6a92a651be9. It caused GPU hangs. The question is why. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75900
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs.c40
1 files changed, 12 insertions, 28 deletions
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index f6b9d6283f2..ccba0c0b791 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -211,30 +211,14 @@ static struct radeon_winsys_cs *radeon_drm_cs_create(struct radeon_winsys *rws,
#define OUT_CS(cs, value) (cs)->buf[(cs)->cdw++] = (value)
static INLINE void update_reloc_domains(struct drm_radeon_cs_reloc *reloc,
- enum radeon_bo_usage usage,
- enum radeon_bo_domain new_domain,
+ enum radeon_bo_domain rd,
+ enum radeon_bo_domain wd,
enum radeon_bo_domain *added_domains)
{
- enum radeon_bo_domain current = reloc->read_domains | reloc->write_domain;
- enum radeon_bo_domain final;
-
- /* If there is at least one command which wants the buffer to be in VRAM
- * only, keep it in VRAM. */
- if ((current & new_domain) == RADEON_DOMAIN_VRAM)
- final = RADEON_DOMAIN_VRAM;
- else
- final = current | new_domain;
-
- *added_domains = final & ~current;
-
- /* If we have at least one write usage... */
- if (usage & RADEON_USAGE_WRITE || reloc->write_domain) {
- reloc->write_domain = final;
- reloc->read_domains = 0;
- } else {
- /* write_domain is zero */
- reloc->read_domains = final;
- }
+ *added_domains = (rd | wd) & ~(reloc->read_domains | reloc->write_domain);
+
+ reloc->read_domains |= rd;
+ reloc->write_domain |= wd;
}
int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo)
@@ -283,6 +267,8 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs,
struct radeon_cs_context *csc = cs->csc;
struct drm_radeon_cs_reloc *reloc;
unsigned hash = bo->handle & (sizeof(csc->is_handle_added)-1);
+ enum radeon_bo_domain rd = usage & RADEON_USAGE_READ ? domains : 0;
+ enum radeon_bo_domain wd = usage & RADEON_USAGE_WRITE ? domains : 0;
bool update_hash = TRUE;
int i;
@@ -312,7 +298,7 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs,
* update the cmd stream with proper buffer offset).
*/
update_hash = FALSE;
- update_reloc_domains(reloc, usage, domains, added_domains);
+ update_reloc_domains(reloc, rd, wd, added_domains);
if (cs->base.ring_type != RING_DMA) {
csc->reloc_indices_hashlist[hash] = i;
return i;
@@ -340,10 +326,8 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs,
p_atomic_inc(&bo->num_cs_references);
reloc = &csc->relocs[csc->crelocs];
reloc->handle = bo->handle;
- if (usage & RADEON_USAGE_WRITE)
- reloc->write_domain = domains;
- else
- reloc->read_domains = domains;
+ reloc->read_domains = rd;
+ reloc->write_domain = wd;
reloc->flags = 0;
csc->is_handle_added[hash] = TRUE;
@@ -353,7 +337,7 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs,
csc->chunks[1].length_dw += RELOC_DWORDS;
- *added_domains = domains;
+ *added_domains = rd | wd;
return csc->crelocs++;
}