include: add preliminary XGL_WSI_X11 proposal
authorChia-I Wu <olvaffe@gmail.com>
Tue, 23 Sep 2014 02:37:08 +0000 (10:37 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Tue, 23 Sep 2014 07:04:20 +0000 (15:04 +0800)
It is built around DRI3 and Present.

include/xglWsiX11Ext.h [new file with mode: 0644]

diff --git a/include/xglWsiX11Ext.h b/include/xglWsiX11Ext.h
new file mode 100644 (file)
index 0000000..9f32553
--- /dev/null
@@ -0,0 +1,133 @@
+/* IN DEVELOPMENT.  DO NOT SHIP. */
+
+#ifndef __XGLWSIX11EXT_H__
+#define __XGLWSIX11EXT_H__
+
+#include <xcb/xcb.h>
+#include <xcb/randr.h>
+#include "xgl.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif // __cplusplus
+
+typedef struct _XGL_WSI_X11_CONNECTION_INFO {
+    xcb_connection_t*                           pConnection;
+    xcb_window_t                                root;
+    xcb_randr_provider_t                        provider;
+} XGL_WSI_X11_CONNECTION_INFO;
+
+typedef struct _XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO
+{
+    XGL_FORMAT          format;
+    XGL_FLAGS           usage;           // XGL_IMAGE_USAGE_FLAGS
+    XGL_EXTENT2D        extent;
+    XGL_FLAGS           flags;
+} XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO;
+
+typedef struct _XGL_WSI_X11_PRESENT_INFO
+{
+    /* which window to present to */
+    xcb_window_t destWindow;
+    XGL_IMAGE srcImage;
+
+    /**
+     * After the command buffers in the queue have been completed, if the MSC
+     * of \p crtc is less than or equal to \p target_msc, wait until it
+     * reaches \p target_msc.
+     *
+     * If the current MSC of \p crtc is greater than \p target_msc, adjust
+     * \p target_msc as following:
+     *
+     *   if (divisor) {
+     *       target_msc = crtc_msc - (crtc_msc % divisor) + remainder;
+     *       if (target_msc < crtc_msc)
+     *           target_msc += divisor;
+     *   } else {
+     *       target_msc = crtc_msc;
+     *   }
+     *
+     * In other words, either set \p target_msc to an absolute value (require
+     * xglWsiX11GetMSC(), potentially a round-trip to the server, to get the
+     * current MSC first), or set \p target_msc to zero and set a "swap
+     * interval".
+     */
+    xcb_randr_crtc_t crtc;
+    XGL_UINT64 target_msc;
+    XGL_UINT64 divisor;
+    XGL_UINT64 remainder;
+
+    /**
+     * After waiting for the current and target MSCs to match, the
+     * presentation is scheduled.  When \p async is false, it will occur the
+     * next time current MSC is incremented.  When \p async is true, it will
+     * occur as soon as possible.
+     */
+    XGL_BOOL async;
+
+    /**
+     * When \p flip is false, the contents of \p srcImage are copied to
+     * \p destWindow when the presentation occurs.  When \p flip is true,
+     * \p srcImage is made the front buffer of \p destWindow.
+     *
+     * An error may be returned if \p flip is true but \p destWindow can not
+     * be flipped to.
+     */
+    XGL_BOOL flip;
+} XGL_WSI_X11_PRESENT_INFO;
+
+/**
+ * Associate an X11 connection with a GPU.  This should be done before device
+ * creation.  If the device is already created,
+ * XGL_ERROR_DEVICE_ALREADY_CREATED is returned.
+ *
+ * Truth is, given a connection, we could find the associated GPU.  But
+ * without having a GPU as the first parameter, the loader could not find the
+ * dispatch table.
+ *
+ * This function is available when xglGetExtensionSupport says "XGL_WSI_X11"
+ * is supported.
+ */
+XGL_RESULT XGLAPI xglWsiX11AssociateConnection(
+    XGL_PHYSICAL_GPU                            gpu,
+    const XGL_WSI_X11_CONNECTION_INFO*          pConnectionInfo);
+
+/**
+ * Return the current MSC (Media Stream Counter, incremented for each vblank)
+ * of the CRTC.
+ */
+XGL_RESULT XGLAPI xglWsiX11GetMSC(
+    XGL_DEVICE                                  device,
+    xcb_randr_crtc_t                            crtc,
+    XGL_UINT64*                                 pMsc);
+
+/**
+ * Create an XGL_IMAGE that can be presented.  An XGL_GPU_MEMORY is created
+ * and bound automatically.  The memory returned can only be used in
+ * XGL_MEMORY_REF.  Destroying the memory or binding another memory to the
+ * image is not allowed.
+ */
+XGL_RESULT XGLAPI xglWsiX11CreatePresentableImage(
+    XGL_DEVICE                                  device,
+    const XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO* pCreateInfo,
+    XGL_IMAGE*                                  pImage,
+    XGL_GPU_MEMORY*                             pMem);
+
+/**
+ * Present an image to an X11 window.  The presentation always occurs after
+ * the command buffers in the queue have been completed, subject to other
+ * parameters specified in XGL_WSI_X11_PRESENT_INFO.
+ *
+ * Fence is reached when the presentation occurs.
+ */
+XGL_RESULT XGLAPI xglWsiX11QueuePresent(
+    XGL_QUEUE                                   queue,
+    const XGL_WSI_X11_PRESENT_INFO*             pPresentInfo,
+    XGL_FENCE                                   fence);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif // __cplusplus
+
+#endif // __XGLWSIX11EXT_H__