anv: add VK_EXT_display_control to anv driver [v5]

This extension provides fences and frame count information to direct
display contexts. It uses new kernel ioctls to provide 64-bits of
vblank sequence and nanosecond resolution.

v2:	Adopt Jason Ekstrand's coding conventions

	Declare variables at first use, eliminate extra whitespace between
	types and names. Wrap lines to 80 columns.

	Add extension to list in alphabetical order

	Suggested-by: Jason Ekstrand <jason.ekstrand@intel.com>

v3:	Adapt to WSI fence API change. It now returns VkResult and
	no longer has an option for relative timeouts.

v4:	wsi_register_display_event and wsi_register_device_event now
	use the default allocator when NULL is provided, so remove the
	computation of 'alloc' here.

v5:	use zalloc2 instead of alloc2 for the WSI fence.

	Suggested-by: Jason Ekstrand <jason.ekstrand@intel.com>

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
Keith Packard
2017-06-15 21:00:56 -07:00
parent 86c8d93e5a
commit 16eb390834
4 changed files with 108 additions and 0 deletions

View File

@@ -324,6 +324,10 @@ anv_fence_impl_cleanup(struct anv_device *device,
anv_gem_syncobj_destroy(device, impl->syncobj);
break;
case ANV_FENCE_TYPE_WSI:
impl->fence_wsi->destroy(impl->fence_wsi);
break;
default:
unreachable("Invalid fence type");
}
@@ -673,6 +677,17 @@ done:
return result;
}
static VkResult
anv_wait_for_wsi_fence(struct anv_device *device,
const VkFence _fence,
uint64_t abs_timeout)
{
ANV_FROM_HANDLE(anv_fence, fence, _fence);
struct anv_fence_impl *impl = &fence->permanent;
return impl->fence_wsi->wait(impl->fence_wsi, abs_timeout);
}
static VkResult
anv_wait_for_fences(struct anv_device *device,
uint32_t fenceCount,
@@ -695,6 +710,9 @@ anv_wait_for_fences(struct anv_device *device,
result = anv_wait_for_syncobj_fences(device, 1, &pFences[i],
true, abs_timeout);
break;
case ANV_FENCE_TYPE_WSI:
result = anv_wait_for_wsi_fence(device, pFences[i], abs_timeout);
break;
case ANV_FENCE_TYPE_NONE:
result = VK_SUCCESS;
break;