anv/image: Implement the wsi "extension"

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
Jason Ekstrand 2017-11-15 22:11:46 -08:00
parent a44744e01d
commit 3dabb4011f
2 changed files with 37 additions and 4 deletions

View File

@ -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);

View File

@ -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;