aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-11-15 22:11:46 -0800
committerJason Ekstrand <[email protected]>2017-12-04 10:04:19 -0800
commit3dabb4011f5336545df54acf80d1e3be17e9e34d (patch)
tree11dd341d4ecefb10181d84620be6fa6db0c30b82 /src
parenta44744e01d73f7187406200d57dd67aa235a7d13 (diff)
anv/image: Implement the wsi "extension"
Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Chad Versace <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_device.c11
-rw-r--r--src/intel/vulkan/anv_image.c30
2 files changed, 37 insertions, 4 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index fc5554ea2aa..258668fa0b0 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -1653,8 +1653,17 @@ VkResult anv_AllocateMemory(
if (pdevice->memory.heaps[mem->type->heapIndex].supports_48bit_addresses)
mem->bo->flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
- if (pdevice->has_exec_async)
+ const struct wsi_memory_allocate_info *wsi_info =
+ vk_find_struct_const(pAllocateInfo->pNext, WSI_MEMORY_ALLOCATE_INFO_MESA);
+ if (wsi_info && wsi_info->implicit_sync) {
+ /* We need to set the WRITE flag on window system buffers so that GEM
+ * will know we're writing to them and synchronize uses on other rings
+ * (eg if the display server uses the blitter ring).
+ */
+ mem->bo->flags |= EXEC_OBJECT_WRITE;
+ } else if (pdevice->has_exec_async) {
mem->bo->flags |= EXEC_OBJECT_ASYNC;
+ }
*pMem = anv_device_memory_to_handle(mem);
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 5c63d676d6a..4d13e05e11f 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -92,7 +92,8 @@ choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
}
static isl_tiling_flags_t
-choose_isl_tiling_flags(const struct anv_image_create_info *anv_info)
+choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
+ const struct isl_drm_modifier_info *isl_mod_info)
{
const VkImageCreateInfo *base_info = anv_info->vk_info;
isl_tiling_flags_t flags = 0;
@@ -111,6 +112,9 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info)
if (anv_info->isl_tiling_flags)
flags &= anv_info->isl_tiling_flags;
+ if (isl_mod_info)
+ flags &= 1 << isl_mod_info->tiling;
+
assert(flags);
return flags;
@@ -493,6 +497,19 @@ make_surface(const struct anv_device *dev,
return VK_SUCCESS;
}
+static const struct isl_drm_modifier_info *
+get_legacy_scanout_drm_format_mod(VkImageTiling tiling)
+{
+ switch (tiling) {
+ case VK_IMAGE_TILING_OPTIMAL:
+ return isl_drm_modifier_get_info(I915_FORMAT_MOD_X_TILED);
+ case VK_IMAGE_TILING_LINEAR:
+ return isl_drm_modifier_get_info(DRM_FORMAT_MOD_LINEAR);
+ default:
+ unreachable("bad VkImageTiling");
+ }
+}
+
VkResult
anv_image_create(VkDevice _device,
const struct anv_image_create_info *create_info,
@@ -501,11 +518,17 @@ anv_image_create(VkDevice _device,
{
ANV_FROM_HANDLE(anv_device, device, _device);
const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
+ const struct isl_drm_modifier_info *isl_mod_info = NULL;
struct anv_image *image = NULL;
VkResult r;
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
+ const struct wsi_image_create_info *wsi_info =
+ vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
+ if (wsi_info && wsi_info->scanout)
+ isl_mod_info = get_legacy_scanout_drm_format_mod(pCreateInfo->tiling);
+
anv_assert(pCreateInfo->mipLevels > 0);
anv_assert(pCreateInfo->arrayLayers > 0);
anv_assert(pCreateInfo->samples > 0);
@@ -528,14 +551,15 @@ anv_image_create(VkDevice _device,
image->samples = pCreateInfo->samples;
image->usage = pCreateInfo->usage;
image->tiling = pCreateInfo->tiling;
- image->drm_format_mod = DRM_FORMAT_MOD_INVALID;
image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR;
+ image->drm_format_mod = isl_mod_info ? isl_mod_info->modifier :
+ DRM_FORMAT_MOD_INVALID;
const struct anv_format *format = anv_get_format(image->vk_format);
assert(format != NULL);
const isl_tiling_flags_t isl_tiling_flags =
- choose_isl_tiling_flags(create_info);
+ choose_isl_tiling_flags(create_info, isl_mod_info);
image->n_planes = format->n_planes;