Mesa (master): st/egl: Add native_surface::present callback.

Chia-I Wu olv at kemper.freedesktop.org
Wed Nov 3 08:29:26 UTC 2010


Module: Mesa
Branch: master
Commit: 94bf657b2390a1cb72d748047e5c7014e4bc1752
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=94bf657b2390a1cb72d748047e5c7014e4bc1752

Author: Chia-I Wu <olv at lunarg.com>
Date:   Wed Nov  3 15:22:36 2010 +0800

st/egl: Add native_surface::present callback.

The callback presents the given attachment to the native engine.  It
allows the swap behavior and interval to be controlled.  It will replace
native_surface::flush_frontbuffer and native_surface::swap_buffers
shortly.

---

 src/gallium/state_trackers/egl/common/native.h     |   20 +++++++++++-
 src/gallium/state_trackers/egl/drm/modeset.c       |   27 +++++++++++++++
 src/gallium/state_trackers/egl/drm/native_drm.c    |    3 ++
 .../state_trackers/egl/fbdev/native_fbdev.c        |   30 +++++++++++++++++
 src/gallium/state_trackers/egl/gdi/native_gdi.c    |   29 +++++++++++++++++
 src/gallium/state_trackers/egl/x11/native_dri2.c   |   34 +++++++++++++++++++-
 src/gallium/state_trackers/egl/x11/native_ximage.c |   29 +++++++++++++++++
 7 files changed, 170 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h
index 3c3f57e..446c6b4 100644
--- a/src/gallium/state_trackers/egl/common/native.h
+++ b/src/gallium/state_trackers/egl/common/native.h
@@ -54,7 +54,17 @@ 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
 };
 
 struct native_surface {
@@ -79,6 +89,14 @@ struct native_surface {
    boolean (*flush_frontbuffer)(struct native_surface *nsurf);
 
    /**
+    * Present the given buffer to the native engine.
+    */
+   boolean (*present)(struct native_surface *nsurf,
+                      enum native_attachment natt,
+                      boolean preserve,
+                      uint swap_interval);
+
+   /**
     * Validate the buffers of the surface.  textures, if not NULL, points to an
     * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
     * by the caller.  A sequence number is also returned.  The caller can use
diff --git a/src/gallium/state_trackers/egl/drm/modeset.c b/src/gallium/state_trackers/egl/drm/modeset.c
index 5ed22f7..453730f 100644
--- a/src/gallium/state_trackers/egl/drm/modeset.c
+++ b/src/gallium/state_trackers/egl/drm/modeset.c
@@ -167,6 +167,32 @@ drm_surface_swap_buffers(struct native_surface *nsurf)
    return TRUE;
 }
 
+static boolean
+drm_surface_present(struct native_surface *nsurf,
+                    enum native_attachment natt,
+                    boolean preserve,
+                    uint swap_interval)
+{
+   boolean ret;
+
+   if (preserve || swap_interval)
+      return FALSE;
+
+   switch (natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = drm_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = drm_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
 static void
 drm_surface_wait(struct native_surface *nsurf)
 {
@@ -227,6 +253,7 @@ drm_display_create_surface(struct native_display *ndpy,
    drmsurf->base.destroy = drm_surface_destroy;
    drmsurf->base.swap_buffers = drm_surface_swap_buffers;
    drmsurf->base.flush_frontbuffer = drm_surface_flush_frontbuffer;
+   drmsurf->base.present = drm_surface_present;
    drmsurf->base.validate = drm_surface_validate;
    drmsurf->base.wait = drm_surface_wait;
 
diff --git a/src/gallium/state_trackers/egl/drm/native_drm.c b/src/gallium/state_trackers/egl/drm/native_drm.c
index f6dc558..21555dc 100644
--- a/src/gallium/state_trackers/egl/drm/native_drm.c
+++ b/src/gallium/state_trackers/egl/drm/native_drm.c
@@ -103,6 +103,9 @@ drm_display_get_param(struct native_display *ndpy,
    int val;
 
    switch (param) {
+   case NATIVE_PARAM_USE_NATIVE_BUFFER:
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;
diff --git a/src/gallium/state_trackers/egl/fbdev/native_fbdev.c b/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
index e459402..728dba3 100644
--- a/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
+++ b/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
@@ -137,6 +137,32 @@ fbdev_surface_swap_buffers(struct native_surface *nsurf)
    return ret;
 }
 
+static boolean
+fbdev_surface_present(struct native_surface *nsurf,
+                      enum native_attachment natt,
+                      boolean preserve,
+                      uint swap_interval)
+{
+   boolean ret;
+
+   if (preserve || swap_interval)
+      return FALSE;
+
+   switch (natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = fbdev_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = fbdev_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
 static void
 fbdev_surface_wait(struct native_surface *nsurf)
 {
@@ -183,6 +209,7 @@ fbdev_display_create_scanout_surface(struct native_display *ndpy,
    fbsurf->base.destroy = fbdev_surface_destroy;
    fbsurf->base.swap_buffers = fbdev_surface_swap_buffers;
    fbsurf->base.flush_frontbuffer = fbdev_surface_flush_frontbuffer;
+   fbsurf->base.present = fbdev_surface_present;
    fbsurf->base.validate = fbdev_surface_validate;
    fbsurf->base.wait = fbdev_surface_wait;
 
@@ -279,6 +306,9 @@ fbdev_display_get_param(struct native_display *ndpy,
    int val;
 
    switch (param) {
+   case NATIVE_PARAM_USE_NATIVE_BUFFER:
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;
diff --git a/src/gallium/state_trackers/egl/gdi/native_gdi.c b/src/gallium/state_trackers/egl/gdi/native_gdi.c
index 91701e5..e010c1c 100644
--- a/src/gallium/state_trackers/egl/gdi/native_gdi.c
+++ b/src/gallium/state_trackers/egl/gdi/native_gdi.c
@@ -160,6 +160,32 @@ gdi_surface_swap_buffers(struct native_surface *nsurf)
 }
 
 static boolean
+gdi_surface_present(struct native_surface *nsurf,
+                    enum native_attachment natt,
+                    boolean preserve,
+                    uint swap_interval)
+{
+   boolean ret;
+
+   if (preserve || swap_interval)
+      return FALSE;
+
+   switch (natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = gdi_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = gdi_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
+static boolean
 gdi_surface_validate(struct native_surface *nsurf, uint attachment_mask,
                         unsigned int *seq_num, struct pipe_resource **textures,
                         int *width, int *height)
@@ -233,6 +259,7 @@ gdi_display_create_window_surface(struct native_display *ndpy,
    gsurf->base.destroy = gdi_surface_destroy;
    gsurf->base.swap_buffers = gdi_surface_swap_buffers;
    gsurf->base.flush_frontbuffer = gdi_surface_flush_frontbuffer;
+   xsurf->base.present = gdi_surface_present;
    gsurf->base.validate = gdi_surface_validate;
    gsurf->base.wait = gdi_surface_wait;
 
@@ -321,6 +348,8 @@ gdi_display_get_param(struct native_display *ndpy,
       /* private buffers are allocated */
       val = FALSE;
       break;
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;
diff --git a/src/gallium/state_trackers/egl/x11/native_dri2.c b/src/gallium/state_trackers/egl/x11/native_dri2.c
index 1169e27..a8df58a 100644
--- a/src/gallium/state_trackers/egl/x11/native_dri2.c
+++ b/src/gallium/state_trackers/egl/x11/native_dri2.c
@@ -338,6 +338,32 @@ dri2_surface_swap_buffers(struct native_surface *nsurf)
 }
 
 static boolean
+dri2_surface_present(struct native_surface *nsurf,
+                     enum native_attachment natt,
+                     boolean preserve,
+                     uint swap_interval)
+{
+   boolean ret;
+
+   if (swap_interval)
+      return FALSE;
+
+   switch (natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = dri2_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = dri2_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
+static boolean
 dri2_surface_validate(struct native_surface *nsurf, uint attachment_mask,
                       unsigned int *seq_num, struct pipe_resource **textures,
                       int *width, int *height)
@@ -432,6 +458,7 @@ dri2_display_create_surface(struct native_display *ndpy,
    dri2surf->base.destroy = dri2_surface_destroy;
    dri2surf->base.swap_buffers = dri2_surface_swap_buffers;
    dri2surf->base.flush_frontbuffer = dri2_surface_flush_frontbuffer;
+   dri2surf->base.present = dri2_surface_present;
    dri2surf->base.validate = dri2_surface_validate;
    dri2surf->base.wait = dri2_surface_wait;
 
@@ -630,9 +657,14 @@ dri2_display_get_param(struct native_display *ndpy,
 
    switch (param) {
    case NATIVE_PARAM_USE_NATIVE_BUFFER:
-      /* DRI2GetBuffers use the native buffers */
+      /* DRI2GetBuffers uses the native buffers */
+      val = TRUE;
+      break;
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+      /* DRI2CopyRegion is used */
       val = TRUE;
       break;
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;
diff --git a/src/gallium/state_trackers/egl/x11/native_ximage.c b/src/gallium/state_trackers/egl/x11/native_ximage.c
index 4b32f6e..8e1ea4f 100644
--- a/src/gallium/state_trackers/egl/x11/native_ximage.c
+++ b/src/gallium/state_trackers/egl/x11/native_ximage.c
@@ -175,6 +175,32 @@ ximage_surface_swap_buffers(struct native_surface *nsurf)
 }
 
 static boolean
+ximage_surface_present(struct native_surface *nsurf,
+                       enum native_attachment natt,
+                       boolean preserve,
+                       uint swap_interval)
+{
+   boolean ret;
+
+   if (preserve || swap_interval)
+      return FALSE;
+
+   switch (natt) {
+   case NATIVE_ATTACHMENT_FRONT_LEFT:
+      ret = ximage_surface_flush_frontbuffer(nsurf);
+      break;
+   case NATIVE_ATTACHMENT_BACK_LEFT:
+      ret = ximage_surface_swap_buffers(nsurf);
+      break;
+   default:
+      ret = FALSE;
+      break;
+   }
+
+   return ret;
+}
+
+static boolean
 ximage_surface_validate(struct native_surface *nsurf, uint attachment_mask,
                         unsigned int *seq_num, struct pipe_resource **textures,
                         int *width, int *height)
@@ -259,6 +285,7 @@ ximage_display_create_surface(struct native_display *ndpy,
    xsurf->base.destroy = ximage_surface_destroy;
    xsurf->base.swap_buffers = ximage_surface_swap_buffers;
    xsurf->base.flush_frontbuffer = ximage_surface_flush_frontbuffer;
+   xsurf->base.present = ximage_surface_present;
    xsurf->base.validate = ximage_surface_validate;
    xsurf->base.wait = ximage_surface_wait;
 
@@ -416,6 +443,8 @@ ximage_display_get_param(struct native_display *ndpy,
       /* private buffers are allocated */
       val = FALSE;
       break;
+   case NATIVE_PARAM_PRESERVE_BUFFER:
+   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
    default:
       val = 0;
       break;




More information about the mesa-commit mailing list