From: Matthew Auld <[email protected]>

All userspace objects must be cleared when allocating the backing store,
before they are potentially visible to userspace.  For now use simple
CPU based clearing to do this for device local-memory objects, note that
in the near future this will instead use the blitter engine.

Signed-off-by: Matthew Auld <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Thomas Hellström <[email protected]>
Cc: Daniele Ceraolo Spurio <[email protected]>
Cc: Lionel Landwerlin <[email protected]>
Cc: Jon Bloomfield <[email protected]>
Cc: Jordan Justen <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Kenneth Graunke <[email protected]>
Cc: Jason Ekstrand <[email protected]>
Cc: Dave Airlie <[email protected]>
Cc: [email protected]
Cc: [email protected]
Reviewed-by: Kenneth Graunke <[email protected]>
Link: 
https://patchwork.freedesktop.org/patch/msgid/[email protected]
(cherry picked from commit 0e997a36ecb61b161a22980ec9240ee7537f3f62)
---
 drivers/gpu/drm/i915/gem/i915_gem_create.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c 
b/drivers/gpu/drm/i915/gem/i915_gem_create.c
index 957f790c644b..f6729feae582 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_create.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_create.c
@@ -71,6 +71,7 @@ static int
 i915_gem_setup(struct drm_i915_gem_object *obj, u64 size)
 {
        struct intel_memory_region *mr = obj->mm.placements[0];
+       unsigned int flags;
        int ret;
 
        size = round_up(size, object_max_page_size(obj));
@@ -83,7 +84,16 @@ i915_gem_setup(struct drm_i915_gem_object *obj, u64 size)
        if (i915_gem_object_size_2big(size))
                return -E2BIG;
 
-       ret = mr->ops->init_object(mr, obj, size, 0);
+       /*
+        * For now resort to CPU based clearing for device local-memory, in the
+        * near future this will use the blitter engine for accelerated, GPU
+        * based clearing.
+        */
+       flags = 0;
+       if (mr->type == INTEL_MEMORY_LOCAL)
+               flags = I915_BO_ALLOC_CPU_CLEAR;
+
+       ret = mr->ops->init_object(mr, obj, size, flags);
        if (ret)
                return ret;
 

Reply via email to