anv: Set correct write domain on window system BOs
authorKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Wed, 17 Feb 2016 19:19:56 +0000 (11:19 -0800)
committerKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Wed, 17 Feb 2016 19:19:56 +0000 (11:19 -0800)
We need to make sure GEM understands that we're writing to the BO, in
case it needs to synchronize with other rings (blitter use in display
server, for example).

src/vulkan/anv_batch_chain.c
src/vulkan/anv_device.c
src/vulkan/anv_private.h
src/vulkan/anv_wsi_wayland.c
src/vulkan/anv_wsi_x11.c

index 79e55197e855cb4936dfa4131da388d1ccb3326f..a050fa05c8ece880239c2b82373bb6ee4a14fdf2 100644 (file)
@@ -147,6 +147,9 @@ anv_reloc_list_add(struct anv_reloc_list *list,
    struct drm_i915_gem_relocation_entry *entry;
    int index;
 
    struct drm_i915_gem_relocation_entry *entry;
    int index;
 
+   const uint32_t domain =
+      target_bo->is_winsys_bo ? I915_GEM_DOMAIN_RENDER : 0;
+
    anv_reloc_list_grow(list, alloc, 1);
    /* TODO: Handle failure */
 
    anv_reloc_list_grow(list, alloc, 1);
    /* TODO: Handle failure */
 
@@ -158,8 +161,8 @@ anv_reloc_list_add(struct anv_reloc_list *list,
    entry->delta = delta;
    entry->offset = offset;
    entry->presumed_offset = target_bo->offset;
    entry->delta = delta;
    entry->offset = offset;
    entry->presumed_offset = target_bo->offset;
-   entry->read_domains = 0;
-   entry->write_domain = 0;
+   entry->read_domains = domain;
+   entry->write_domain = domain;
    VG(VALGRIND_CHECK_MEM_IS_DEFINED(entry, sizeof(*entry)));
 
    return target_bo->offset + delta;
    VG(VALGRIND_CHECK_MEM_IS_DEFINED(entry, sizeof(*entry)));
 
    return target_bo->offset + delta;
@@ -854,7 +857,7 @@ anv_cmd_buffer_add_bo(struct anv_cmd_buffer *cmd_buffer,
       obj->relocs_ptr = 0;
       obj->alignment = 0;
       obj->offset = bo->offset;
       obj->relocs_ptr = 0;
       obj->alignment = 0;
       obj->offset = bo->offset;
-      obj->flags = 0;
+      obj->flags = bo->is_winsys_bo ? EXEC_OBJECT_WRITE : 0;
       obj->rsvd1 = 0;
       obj->rsvd2 = 0;
    }
       obj->rsvd1 = 0;
       obj->rsvd2 = 0;
    }
index dfc29e454441092025a7f17b5389f5b4e9a12700..c3a370b0542a30da2c91f9f288e1923e221d927f 100644 (file)
@@ -1070,6 +1070,7 @@ anv_bo_init_new(struct anv_bo *bo, struct anv_device *device, uint64_t size)
    bo->index = 0;
    bo->offset = 0;
    bo->size = size;
    bo->index = 0;
    bo->offset = 0;
    bo->size = size;
+   bo->is_winsys_bo = false;
 
    return VK_SUCCESS;
 }
 
    return VK_SUCCESS;
 }
index e2ae011920090d595bbd868924eb83bd627e7394..951a571944d950e17b12159e462da0a9f71502b4 100644 (file)
@@ -297,6 +297,12 @@ struct anv_bo {
 
    uint64_t size;
    void *map;
 
    uint64_t size;
    void *map;
+
+   /* We need to set the WRITE flag on winsys bos so GEM will know we're
+    * writing to them and synchronize uses on other rings (eg if the display
+    * server uses the blitter ring).
+    */
+   bool is_winsys_bo;
 };
 
 /* Represents a lock-free linked list of "free" things.  This is used by
 };
 
 /* Represents a lock-free linked list of "free" things.  This is used by
index 4ae594b10d4a2b1a2755e12c8cf4b0a614d380d9..6f25eaf43ea0df6b98f012161404222cd5674028 100644 (file)
@@ -656,6 +656,7 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain, struct wsi_wl_image *image,
       goto fail_image;
 
    image->memory = anv_device_memory_from_handle(vk_memory);
       goto fail_image;
 
    image->memory = anv_device_memory_from_handle(vk_memory);
+   image->memory->bo.is_winsys_bo = true;
 
    result = anv_BindImageMemory(vk_device, vk_image, vk_memory, 0);
 
 
    result = anv_BindImageMemory(vk_device, vk_image, vk_memory, 0);
 
index 1e08bf31b4b0c35d95209a5179f1d86f8ca59289..843a6b625047ff07a8bca26ff379b44c0f549a1e 100644 (file)
@@ -624,6 +624,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
          &memory_h);
 
       memory = anv_device_memory_from_handle(memory_h);
          &memory_h);
 
       memory = anv_device_memory_from_handle(memory_h);
+      memory->bo.is_winsys_bo = true;
 
       anv_BindImageMemory(VK_NULL_HANDLE, anv_image_to_handle(image),
                           memory_h, 0);
 
       anv_BindImageMemory(VK_NULL_HANDLE, anv_image_to_handle(image),
                           memory_h, 0);