diff options
author | Gurchetan Singh <gurchetansingh@chromium.org> | 2017-10-10 14:12:46 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-10-18 12:12:42 -0700 |
commit | 2d1877f0417e5891ad6e2795db7cf395916b15b3 (patch) | |
tree | df828c4502ed552de12e18317f4b98593f5b71ec | |
parent | c2ad63e7a5c60673cea7d96d14f7151430860e16 (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.c | 37 |
1 files changed, 25 insertions, 12 deletions
@@ -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, }; |