[Mesa-dev] [PATCH mesa 1/3] vulkan: Define new VK_MESA_query_timestamp extension [v3]

Keith Packard keithp at keithp.com
Tue Jul 10 00:35:28 UTC 2018


This extension adds a single function to query the current GPU
timestamp, just like glGetInteger64v(GL_TIMESTAMP, &timestamp). This
function is needed to complete the implementation of
GOOGLE_display_timing, which needs to be able to correlate GPU and CPU
timestamps.

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 at intel.com>

v3:	Report both device and surface timestamps

	This will allow us to get timestamps more closely aligned by
	getting both in a single call from the kernel.

	To make this independent of the timebase used by the WSI
	layer, provide a new wsi hook which converts CLOCK_MONOTONIC
	into the matching WSI timebase. Right now, all of our backends
	use CLOCK_MONOTONIC, so there's nothing actually doing
	conversions, but it seemed best to put the infrastructure in
	place so that I could validate the extension interface would
	work if that became necessary.

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 include/vulkan/vk_mesa_query_timestamp.h | 46 ++++++++++++++++++++++++
 src/vulkan/registry/vk.xml               | 20 +++++++++++
 src/vulkan/wsi/wsi_common.c              | 17 +++++++++
 src/vulkan/wsi/wsi_common.h              |  7 ++++
 src/vulkan/wsi/wsi_common_private.h      |  4 +++
 5 files changed, 94 insertions(+)
 create mode 100644 include/vulkan/vk_mesa_query_timestamp.h

diff --git a/include/vulkan/vk_mesa_query_timestamp.h b/include/vulkan/vk_mesa_query_timestamp.h
new file mode 100644
index 00000000000..262f094db27
--- /dev/null
+++ b/include/vulkan/vk_mesa_query_timestamp.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2018 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef __VK_MESA_QUERY_TIMESTAMP_H__
+#define __VK_MESA_QUERY_TIMESTAMP_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct VkCurrentTimestampMESA {
+    uint64_t    deviceTimestamp;
+    uint64_t    surfaceTimestamp;
+} VkCurrentTimestampMESA;
+
+typedef VkResult (VKAPI_PTR *PFN_vkQueryCurrentTimestampMESA)(
+    VkDevice device, VkSurfaceKHR surface, VkCurrentTimestampMESA *timestamp);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkQueryCurrentTimestampMESA(
+    VkDevice device, VkSurfaceKHR surface, VkCurrentTimestampMESA *timestamp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __VK_MESA_QUERY_TIMESTAMP_H__ */
+
diff --git a/src/vulkan/registry/vk.xml b/src/vulkan/registry/vk.xml
index 4419c6fbf96..9c5a2f79398 100644
--- a/src/vulkan/registry/vk.xml
+++ b/src/vulkan/registry/vk.xml
@@ -3198,6 +3198,10 @@ server.
             <member><type>VkBool32</type>                           <name>conditionalRendering</name></member>
             <member><type>VkBool32</type>                           <name>inheritedConditionalRendering</name></member>
         </type>
+	<type catagory="struct" name="VkCurrentTimestampMESA">
+	  <member><type>uint64_t</type>         <name>deviceTimestamp</name></member>
+	  <member><type>uint64_t</type>        <name>surfaceTimestamp</name></member>
+	</type>
     </types>
 
     <comment>Vulkan enumerant (token) definitions</comment>
@@ -6239,6 +6243,12 @@ server.
             <param><type>uint32_t</type> <name>maxDrawCount</name></param>
             <param><type>uint32_t</type> <name>stride</name></param>
         </command>
+        <command>
+            <proto><type>VkResult</type> <name>vkQueryCurrentTimestampMESA</name></proto>
+            <param><type>VkDevice</type> <name>device</name></param>
+	    <param><type>VkSurfaceKHR</type> <name>surface</name></param>
+            <param><type>VkCurrentTimestampMESA</type>* <name>pTimestamp</name></param>
+        </command>
     </commands>
 
     <feature api="vulkan" name="VK_VERSION_1_0" number="1.0" comment="Vulkan core API interface definitions">
@@ -9008,5 +9018,15 @@ server.
                 <enum value=""VK_KHR_extension_214""              name="VK_KHR_EXTENSION_214_EXTENSION_NAME"/>
             </require>
         </extension>
+        <extension name="VK_MESA_query_timestamp" number="215"
+		   type="device" author="MESA"
+		   contact="Keith Packard @keithp"
+		   supported="vulkan">
+            <require>
+                <enum value="1"                                         name="VK_MESA_QUERY_TIMESTAMP_SPEC_VERSION"/>
+                <enum value=""VK_MESA_query_timestamp""       name="VK_MESA_QUERY_TIMESTAMP_NAME"/>
+                <command name="vkQueryCurrentTimestampMESA"/>
+            </require>
+        </extension>
     </extensions>
 </registry>
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index f2d90a6bba2..9316470ad20 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -975,3 +975,20 @@ wsi_common_queue_present(const struct wsi_device *wsi,
 
    return final_result;
 }
+
+VkResult
+wsi_common_convert_timestamp(const struct wsi_device *wsi,
+                             VkDevice device_h,
+                             VkSurfaceKHR surface_h,
+                             uint64_t monotonic_timestamp,
+                             uint64_t *surface_timestamp)
+{
+   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, surface_h);
+   struct wsi_interface *iface = wsi->wsi[surface->platform];
+
+   if (iface->convert_timestamp)
+      return iface->convert_timestamp(surface, wsi, monotonic_timestamp,
+                                      surface_timestamp);
+   *surface_timestamp = monotonic_timestamp;
+   return VK_SUCCESS;
+}
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 33e4f849ac9..0a57dc4eb23 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -235,4 +235,11 @@ wsi_common_queue_present(const struct wsi_device *wsi,
                          int queue_family_index,
                          const VkPresentInfoKHR *pPresentInfo);
 
+VkResult
+wsi_common_convert_timestamp(const struct wsi_device *wsi,
+                             VkDevice device_h,
+                             VkSurfaceKHR surface_h,
+                             uint64_t monotonic_timestamp,
+                             uint64_t *surface_timestamp);
+
 #endif
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index 9f2aacd6560..843b4c9b286 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -126,6 +126,10 @@ struct wsi_interface {
                                 const VkSwapchainCreateInfoKHR* pCreateInfo,
                                 const VkAllocationCallbacks* pAllocator,
                                 struct wsi_swapchain **swapchain);
+   VkResult (*convert_timestamp)(VkIcdSurfaceBase *surface,
+                                 const struct wsi_device *wsi_device,
+                                 uint64_t monotonic_timestamp,
+                                 uint64_t *surface_timestamp);
 };
 
 VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device,
-- 
2.18.0



More information about the mesa-dev mailing list