Mesa (master): st/dri: move backend hooks to appropriate object

George Sapountzis gsap7 at kemper.freedesktop.org
Fri Jul 30 20:53:23 UTC 2010


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

Author: George Sapountzis <gsapountzis at gmail.com>
Date:   Sun Jul 18 18:23:36 2010 +0300

st/dri: move backend hooks to appropriate object

---

 .../state_trackers/dri/common/dri_context.h        |    3 +
 .../state_trackers/dri/common/dri_drawable.c       |    9 ++--
 .../state_trackers/dri/common/dri_drawable.h       |   10 ++++
 src/gallium/state_trackers/dri/common/dri_screen.c |    5 +-
 src/gallium/state_trackers/dri/common/dri_screen.h |    9 ----
 src/gallium/state_trackers/dri/drm/dri2.c          |   45 ++++++++++++++++---
 src/gallium/state_trackers/dri/sw/drisw.c          |   26 +++++++++--
 7 files changed, 78 insertions(+), 29 deletions(-)

diff --git a/src/gallium/state_trackers/dri/common/dri_context.h b/src/gallium/state_trackers/dri/common/dri_context.h
index b29e853..692c49d 100644
--- a/src/gallium/state_trackers/dri/common/dri_context.h
+++ b/src/gallium/state_trackers/dri/common/dri_context.h
@@ -60,6 +60,9 @@ struct dri_context
 
    /* gallium */
    struct st_context_iface *st;
+
+   /* hooks filled in by dri2 & drisw */
+   __DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
 };
 
 static INLINE struct dri_context *
diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c
index be824e7..88b79a0 100644
--- a/src/gallium/state_trackers/dri/common/dri_drawable.c
+++ b/src/gallium/state_trackers/dri/common/dri_drawable.c
@@ -67,10 +67,10 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
    new_stamp = (drawable->texture_stamp != drawable->dPriv->lastStamp);
 
    if (new_stamp || new_mask || screen->broken_invalidate) {
-      if (new_stamp && screen->update_drawable_info)
-         screen->update_drawable_info(drawable);
+      if (new_stamp && drawable->update_drawable_info)
+         drawable->update_drawable_info(drawable);
 
-      screen->allocate_textures(drawable, statts, count);
+      drawable->allocate_textures(drawable, statts, count);
 
       /* add existing textures */
       for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
@@ -99,10 +99,9 @@ dri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
 {
    struct dri_drawable *drawable =
       (struct dri_drawable *) stfbi->st_manager_private;
-   struct dri_screen *screen = dri_screen(drawable->sPriv);
 
    /* XXX remove this and just set the correct one on the framebuffer */
-   screen->flush_frontbuffer(drawable, statt);
+   drawable->flush_frontbuffer(drawable, statt);
 
    return TRUE;
 }
diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.h b/src/gallium/state_trackers/dri/common/dri_drawable.h
index 62c7b0d..3f2e24f 100644
--- a/src/gallium/state_trackers/dri/common/dri_drawable.h
+++ b/src/gallium/state_trackers/dri/common/dri_drawable.h
@@ -55,6 +55,16 @@ struct dri_drawable
 
    /* used only by DRISW */
    struct pipe_surface *drisw_surface;
+
+   /* hooks filled in by dri2 & drisw */
+   void (*allocate_textures)(struct dri_drawable *drawable,
+                             const enum st_attachment_type *statts,
+                             unsigned count);
+
+   void (*update_drawable_info)(struct dri_drawable *drawable);
+
+   void (*flush_frontbuffer)(struct dri_drawable *drawable,
+                             enum st_attachment_type statt);
 };
 
 static INLINE struct dri_drawable *
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
index ed302e3..e869b4b 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -294,11 +294,10 @@ dri_get_egl_image(struct st_manager *smapi,
 {
    struct dri_context *ctx =
       (struct dri_context *)stctxi->st_manager_private;
-   struct dri_screen *screen = dri_screen(ctx->sPriv);
    __DRIimage *img = NULL;
 
-   if (screen->lookup_egl_image) {
-      img = screen->lookup_egl_image(ctx, egl_image);
+   if (ctx->lookup_egl_image) {
+      img = ctx->lookup_egl_image(ctx, egl_image);
    }
 
    if (!img)
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h
index e27ff9d..53ccce1 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.h
+++ b/src/gallium/state_trackers/dri/common/dri_screen.h
@@ -64,15 +64,6 @@ struct dri_screen
    int fd;
    drmLock *drmLock;
 
-   /* hooks filled in by dri2 & drisw */
-   __DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
-   void (*allocate_textures)(struct dri_drawable *drawable,
-                             const enum st_attachment_type *statts,
-                             unsigned count);
-   void (*update_drawable_info)(struct dri_drawable *drawable);
-   void (*flush_frontbuffer)(struct dri_drawable *drawable,
-                             enum st_attachment_type statt);
-
    /* gallium */
    boolean d_depth_bits_last;
    boolean sd_depth_bits_last;
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 9965d70..88ffa1e 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -507,9 +507,6 @@ dri2_init_screen(__DRIscreen * sPriv)
 
    screen->sPriv = sPriv;
    screen->fd = sPriv->fd;
-   screen->lookup_egl_image = dri2_lookup_egl_image;
-   screen->allocate_textures = dri2_allocate_textures;
-   screen->flush_frontbuffer = dri2_flush_frontbuffer;
 
    sPriv->private = (void *)screen;
    sPriv->extensions = dri_screen_extensions;
@@ -531,16 +528,52 @@ fail:
    return NULL;
 }
 
+static boolean
+dri2_create_context(gl_api api, const __GLcontextModes * visual,
+                    __DRIcontext * cPriv, void *sharedContextPrivate)
+{
+   struct dri_context *ctx = NULL;
+
+   if (!dri_create_context(api, visual, cPriv, sharedContextPrivate))
+      return FALSE;
+
+   ctx = cPriv->driverPrivate;
+
+   ctx->lookup_egl_image = dri2_lookup_egl_image;
+
+   return TRUE;
+}
+
+static boolean
+dri2_create_buffer(__DRIscreen * sPriv,
+                   __DRIdrawable * dPriv,
+                   const __GLcontextModes * visual, boolean isPixmap)
+{
+   struct dri_drawable *drawable = NULL;
+
+   if (!dri_create_buffer(sPriv, dPriv, visual, isPixmap))
+      return FALSE;
+
+   drawable = dPriv->driverPrivate;
+
+   drawable->allocate_textures = dri2_allocate_textures;
+   drawable->flush_frontbuffer = dri2_flush_frontbuffer;
+
+   return TRUE;
+}
+
 /**
  * DRI driver virtual function table.
  *
  * DRI versions differ in their implementation of init_screen and swap_buffers.
  */
 const struct __DriverAPIRec driDriverAPI = {
+   .InitScreen = NULL,
+   .InitScreen2 = dri2_init_screen,
    .DestroyScreen = dri_destroy_screen,
-   .CreateContext = dri_create_context,
+   .CreateContext = dri2_create_context,
    .DestroyContext = dri_destroy_context,
-   .CreateBuffer = dri_create_buffer,
+   .CreateBuffer = dri2_create_buffer,
    .DestroyBuffer = dri_destroy_buffer,
    .MakeCurrent = dri_make_current,
    .UnbindContext = dri_unbind_context,
@@ -548,9 +581,7 @@ const struct __DriverAPIRec driDriverAPI = {
    .GetSwapInfo = NULL,
    .GetDrawableMSC = NULL,
    .WaitForMSC = NULL,
-   .InitScreen2 = dri2_init_screen,
 
-   .InitScreen = NULL,
    .SwapBuffers = NULL,
    .CopySubBuffer = NULL,
 };
diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c
index d221009..ae96f1b 100644
--- a/src/gallium/state_trackers/dri/sw/drisw.c
+++ b/src/gallium/state_trackers/dri/sw/drisw.c
@@ -275,9 +275,6 @@ drisw_init_screen(__DRIscreen * sPriv)
 
    screen->sPriv = sPriv;
    screen->fd = -1;
-   screen->allocate_textures = drisw_allocate_textures;
-   screen->update_drawable_info = drisw_update_drawable_info;
-   screen->flush_frontbuffer = drisw_flush_frontbuffer;
 
    swrast_no_present = debug_get_option_swrast_no_present();
 
@@ -298,21 +295,40 @@ fail:
    return NULL;
 }
 
+static boolean
+drisw_create_buffer(__DRIscreen * sPriv,
+                    __DRIdrawable * dPriv,
+                    const __GLcontextModes * visual, boolean isPixmap)
+{
+   struct dri_drawable *drawable = NULL;
+
+   if (!dri_create_buffer(sPriv, dPriv, visual, isPixmap))
+      return FALSE;
+
+   drawable = dPriv->driverPrivate;
+
+   drawable->allocate_textures = drisw_allocate_textures;
+   drawable->update_drawable_info = drisw_update_drawable_info;
+   drawable->flush_frontbuffer = drisw_flush_frontbuffer;
+
+   return TRUE;
+}
+
 /**
  * DRI driver virtual function table.
  *
  * DRI versions differ in their implementation of init_screen and swap_buffers.
  */
 const struct __DriverAPIRec driDriverAPI = {
+   .InitScreen = drisw_init_screen,
    .DestroyScreen = dri_destroy_screen,
    .CreateContext = dri_create_context,
    .DestroyContext = dri_destroy_context,
-   .CreateBuffer = dri_create_buffer,
+   .CreateBuffer = drisw_create_buffer,
    .DestroyBuffer = dri_destroy_buffer,
    .MakeCurrent = dri_make_current,
    .UnbindContext = dri_unbind_context,
 
-   .InitScreen = drisw_init_screen,
    .SwapBuffers = drisw_swap_buffers,
 };
 




More information about the mesa-commit mailing list