diff options
Diffstat (limited to 'libdrm')
-rw-r--r-- | libdrm/radeon/radeon_cs_gem.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/libdrm/radeon/radeon_cs_gem.c b/libdrm/radeon/radeon_cs_gem.c index b9f6f4b7..82ef16cb 100644 --- a/libdrm/radeon/radeon_cs_gem.c +++ b/libdrm/radeon/radeon_cs_gem.c @@ -144,12 +144,19 @@ static int cs_gem_write_reloc(struct radeon_cs *cs, * domain set then the read_domain should also be set for this * new relocation. */ - if (reloc->read_domain && !read_domain) { - return -EINVAL; - } - if (reloc->write_domain && !write_domain) { - return -EINVAL; + /* the DDX expects to read and write from same pixmap */ + if (write_domain && (reloc->read_domain & write_domain)) { + reloc->read_domain = 0; + reloc->write_domain = write_domain; + } else if (read_domain & reloc->write_domain) { + reloc->read_domain = 0; + } else { + if (write_domain != reloc->write_domain) + return -EINVAL; + if (read_domain != reloc->read_domain) + return -EINVAL; } + reloc->read_domain |= read_domain; reloc->write_domain |= write_domain; /* update flags */ |