summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurchetan Singh <gurchetansingh@chromium.org>2017-10-10 14:12:46 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-10-18 12:12:42 -0700
commit2d1877f0417e5891ad6e2795db7cf395916b15b3 (patch)
treedf828c4502ed552de12e18317f4b98593f5b71ec
parentc2ad63e7a5c60673cea7d96d14f7151430860e16 (diff)
minigbm: i915: call DRM_IOCTL_I915_GEM_SET_DOMAIN when invalidating
In the kernel, the i915_gem_set_domain_ioctl function calls these functions: - i915_gem_object_set_to_gtt_domain - i915_gem_object_set_to_cpu_domain These functions do various interesting things with caches, and some CTS tests require this to pass. BUG=b:67073097, b:67331142, chromium:764871 TEST=The following tests: android.view.cts.SurfaceViewSyncTests android.video.cts.VideoEncoderDecoderTest#testAvcGoog0Qual0720x0480 android.video.cts.VideoEncoderDecoderTest#testAvcGoog0Qual1280x0720 android.video.cts.VideoEncoderDecoderTest#testAvcGoog0Qual1920x1080 android.media.cts.EncodeDecodeTest#testVP8EncodeDecodeVideoFromSurfaceToSurface720p android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromPersistentSurfaceToSurface720p android.media.cts.EncodeDecodeTest#testVP8EncodeDecodeVideoFromPersistentSurfaceToSurface720p passes on Eve with the next patch applied. Change-Id: I9acc14580f65eab6039d8b354bfbf51c31dfcf14 Reviewed-on: https://chromium-review.googlesource.com/710323 Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
-rw-r--r--i915.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/i915.c b/i915.c
index 70ecc5a..8933d8f 100644
--- a/i915.c
+++ b/i915.c
@@ -416,10 +416,7 @@ static void *i915_bo_map(struct bo *bo, struct map_info *data, size_t plane, uin
{
int ret;
void *addr;
- struct drm_i915_gem_set_domain set_domain;
- memset(&set_domain, 0, sizeof(set_domain));
- set_domain.handle = bo->handles[0].u32;
if (bo->tiling == I915_TILING_NONE) {
struct drm_i915_gem_mmap gem_map;
memset(&gem_map, 0, sizeof(gem_map));
@@ -438,9 +435,6 @@ static void *i915_bo_map(struct bo *bo, struct map_info *data, size_t plane, uin
}
addr = (void *)(uintptr_t)gem_map.addr_ptr;
- set_domain.read_domains = I915_GEM_DOMAIN_CPU;
- set_domain.write_domain = I915_GEM_DOMAIN_CPU;
-
} else {
struct drm_i915_gem_mmap_gtt gem_map;
memset(&gem_map, 0, sizeof(gem_map));
@@ -455,8 +449,6 @@ static void *i915_bo_map(struct bo *bo, struct map_info *data, size_t plane, uin
addr = mmap(0, bo->total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd,
gem_map.offset);
- set_domain.read_domains = I915_GEM_DOMAIN_GTT;
- set_domain.write_domain = I915_GEM_DOMAIN_GTT;
}
if (addr == MAP_FAILED) {
@@ -464,14 +456,34 @@ static void *i915_bo_map(struct bo *bo, struct map_info *data, size_t plane, uin
return addr;
}
+ data->length = bo->total_size;
+ return addr;
+}
+
+static int i915_bo_invalidate(struct bo *bo, struct map_info *data)
+{
+ int ret;
+ struct drm_i915_gem_set_domain set_domain;
+
+ memset(&set_domain, 0, sizeof(set_domain));
+ set_domain.handle = bo->handles[0].u32;
+ if (bo->tiling == I915_TILING_NONE) {
+ set_domain.read_domains = I915_GEM_DOMAIN_CPU;
+ if (data->map_flags & BO_MAP_WRITE)
+ set_domain.write_domain = I915_GEM_DOMAIN_CPU;
+ } else {
+ set_domain.read_domains = I915_GEM_DOMAIN_GTT;
+ if (data->map_flags & BO_MAP_WRITE)
+ set_domain.write_domain = I915_GEM_DOMAIN_GTT;
+ }
+
ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
if (ret) {
- fprintf(stderr, "drv: DRM_IOCTL_I915_GEM_SET_DOMAIN failed\n");
- return MAP_FAILED;
+ fprintf(stderr, "drv: DRM_IOCTL_I915_GEM_SET_DOMAIN with %d\n", ret);
+ return ret;
}
- data->length = bo->total_size;
- return addr;
+ return 0;
}
static int i915_bo_flush(struct bo *bo, struct map_info *data)
@@ -511,6 +523,7 @@ struct backend backend_i915 = {
.bo_import = i915_bo_import,
.bo_map = i915_bo_map,
.bo_unmap = drv_bo_munmap,
+ .bo_invalidate = i915_bo_invalidate,
.bo_flush = i915_bo_flush,
.resolve_format = i915_resolve_format,
};