egl: Update to Wayland 1.2 server API
[mesa.git] / src / gallium / state_trackers / egl / common / native.h
index 9f34c517ef8cd9038cdbb5fad6ae340abe0ac818..797933d8d753c718b470a3d726344e7aee03dc3f 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Mesa 3-D graphics library
- * Version:  7.8
  *
  * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
  *
 #include "pipe/p_state.h"
 #include "state_tracker/sw_winsys.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "native_buffer.h"
 #include "native_modeset.h"
+#include "native_wayland_bufmgr.h"
 
 /**
  * Only color buffers are listed.  The others are allocated privately through,
@@ -54,7 +59,56 @@ enum native_param_type {
     * Return TRUE if window/pixmap surfaces use the buffers of the native
     * types.
     */
-   NATIVE_PARAM_USE_NATIVE_BUFFER
+   NATIVE_PARAM_USE_NATIVE_BUFFER,
+
+   /**
+    * Return TRUE if native_surface::present can preserve the buffer.
+    */
+   NATIVE_PARAM_PRESERVE_BUFFER,
+
+   /**
+    * Return the maximum supported swap interval.
+    */
+   NATIVE_PARAM_MAX_SWAP_INTERVAL,
+
+   /**
+    * Return TRUE if the display supports premultiplied alpha, regardless of
+    * the surface color format.
+    *
+    * Note that returning TRUE for this parameter will make
+    * EGL_VG_ALPHA_FORMAT_PRE_BIT to be set for all EGLConfig's with non-zero
+    * EGL_ALPHA_SIZE.  EGL_VG_ALPHA_FORMAT attribute of a surface will affect
+    * how the surface is presented.
+    */
+   NATIVE_PARAM_PREMULTIPLIED_ALPHA,
+
+   /**
+    * Return TRUE if native_surface::present supports presenting a partial
+    * surface.
+    */
+   NATIVE_PARAM_PRESENT_REGION
+};
+
+/**
+ * Control how a surface presentation should happen.
+ */
+struct native_present_control {
+   /**< the attachment to present */
+   enum native_attachment natt;
+
+   /**< the contents of the presented attachment should be preserved */
+   boolean preserve;
+
+   /**< wait until the given vsyncs has passed since the last presentation */
+   uint swap_interval;
+
+   /**< pixels use premultiplied alpha */
+   boolean premultiplied_alpha;
+
+   /**< The region to present. y=0=top.
+        If num_rects is 0, the whole surface is to be presented */
+   int num_rects;
+   const int *rects; /* x, y, width, height */
 };
 
 struct native_surface {
@@ -66,17 +120,10 @@ struct native_surface {
    void (*destroy)(struct native_surface *nsurf);
 
    /**
-    * Swap the front and back buffers so that the back buffer is visible.  It
-    * is no-op if the surface is single-buffered.  The contents of the back
-    * buffer after swapping may or may not be preserved.
-    */
-   boolean (*swap_buffers)(struct native_surface *nsurf);
-
-   /**
-    * Make the front buffer visible.  In some native displays, changes to the
-    * front buffer might not be visible immediately and require manual flush.
+    * Present the given buffer to the native engine.
     */
-   boolean (*flush_frontbuffer)(struct native_surface *nsurf);
+   boolean (*present)(struct native_surface *nsurf,
+                      const struct native_present_control *ctrl);
 
    /**
     * Validate the buffers of the surface.  textures, if not NULL, points to an
@@ -116,8 +163,6 @@ struct native_config {
    int native_visual_id;
    int native_visual_type;
    int level;
-   int samples;
-   boolean slow_config;
    boolean transparent_rgb;
    int transparent_rgb_values[3];
 };
@@ -133,11 +178,21 @@ struct native_display {
     */
    struct pipe_screen *screen;
 
+   /**
+    * Context used for copy operations.
+    */
+   struct pipe_context *pipe;
+
    /**
     * Available for caller's use.
     */
    void *user_data;
 
+   /**
+    * Initialize and create the pipe screen.
+    */
+   boolean (*init_screen)(struct native_display *ndpy);
+
    void (*destroy)(struct native_display *ndpy);
 
    /**
@@ -156,16 +211,21 @@ struct native_display {
                                                int *num_configs);
 
    /**
-    * Test if a pixmap is supported by the given config.  Required unless no
-    * config has pixmap_bit set.
-    *
-    * This function is usually called to find a config that supports a given
-    * pixmap.  Thus, it is usually called with the same pixmap in a row.
+    * Get the color format of the pixmap.  Required unless no config has
+    * pixmap_bit set.
     */
-   boolean (*is_pixmap_supported)(struct native_display *ndpy,
-                                  EGLNativePixmapType pix,
-                                  const struct native_config *nconf);
+   boolean (*get_pixmap_format)(struct native_display *ndpy,
+                                EGLNativePixmapType pix,
+                                enum pipe_format *format);
 
+   /**
+    * Copy the contents of the resource to the pixmap's front-left attachment.
+    * This is used to implement eglCopyBuffers.  Required unless no config has
+    * pixmap_bit set.
+    */
+   boolean (*copy_to_pixmap)(struct native_display *ndpy,
+                             EGLNativePixmapType pix,
+                             struct pipe_resource *src);
 
    /**
     * Create a window surface.  Required unless no config has window_bit set.
@@ -175,13 +235,17 @@ struct native_display {
                                                    const struct native_config *nconf);
 
    /**
-    * Create a pixmap surface.  Required unless no config has pixmap_bit set.
+    * Create a pixmap surface.  The native config may be NULL.  In that case, a
+    * "best config" will be picked.  Required unless no config has pixmap_bit
+    * set.
     */
    struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
                                                    EGLNativePixmapType pix,
                                                    const struct native_config *nconf);
 
+   const struct native_display_buffer *buffer;
    const struct native_display_modeset *modeset;
+   struct native_display_wayland_bufmgr *wayland_bufmgr;
 };
 
 /**
@@ -201,6 +265,9 @@ struct native_event_handler {
                                          const char *name, int fd);
    struct pipe_screen *(*new_sw_screen)(struct native_display *ndpy,
                                         struct sw_winsys *ws);
+
+   struct pipe_resource *(*lookup_egl_image)(struct native_display *ndpy,
+                                             void *egl_image);
 };
 
 /**
@@ -212,24 +279,64 @@ native_attachment_mask_test(uint mask, enum native_attachment att)
    return !!(mask & (1 << att));
 }
 
+/**
+ * Get the display copy context
+ */
+static INLINE struct pipe_context *
+ndpy_get_copy_context(struct native_display *ndpy)
+{
+   if (!ndpy->pipe)
+      ndpy->pipe = ndpy->screen->context_create(ndpy->screen, NULL);
+   return ndpy->pipe;
+}
+
+/**
+ * Free display screen and context resources
+ */
+static INLINE void
+ndpy_uninit(struct native_display *ndpy)
+{
+   if (ndpy->pipe)
+      ndpy->pipe->destroy(ndpy->pipe);
+   if (ndpy->screen)
+      ndpy->screen->destroy(ndpy->screen);
+}
+
 struct native_platform {
    const char *name;
 
-   struct native_display *(*create_display)(void *dpy,
-                                            struct native_event_handler *handler,
-                                            void *user_data);
+   /**
+    * Create the native display and usually establish a connection to the
+    * display server.
+    *
+    * No event should be generated at this stage.
+    */
+   struct native_display *(*create_display)(void *dpy, boolean use_sw);
 };
 
 const struct native_platform *
-native_get_gdi_platform(void);
+native_get_gdi_platform(const struct native_event_handler *event_handler);
+
+const struct native_platform *
+native_get_x11_platform(const struct native_event_handler *event_handler);
+
+const struct native_platform *
+native_get_wayland_platform(const struct native_event_handler *event_handler);
 
 const struct native_platform *
-native_get_x11_platform(void);
+native_get_drm_platform(const struct native_event_handler *event_handler);
 
 const struct native_platform *
-native_get_kms_platform(void);
+native_get_fbdev_platform(const struct native_event_handler *event_handler);
 
 const struct native_platform *
-native_get_fbdev_platform(void);
+native_get_null_platform(const struct native_event_handler *event_handler);
+
+const struct native_platform *
+native_get_android_platform(const struct native_event_handler *event_handler);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* _NATIVE_H_ */