st/dri: move backend hooks to appropriate object
authorGeorge Sapountzis <gsapountzis@gmail.com>
Sun, 18 Jul 2010 15:23:36 +0000 (18:23 +0300)
committerGeorge Sapountzis <gsapountzis@gmail.com>
Fri, 30 Jul 2010 20:43:26 +0000 (23:43 +0300)
src/gallium/state_trackers/dri/common/dri_context.h
src/gallium/state_trackers/dri/common/dri_drawable.c
src/gallium/state_trackers/dri/common/dri_drawable.h
src/gallium/state_trackers/dri/common/dri_screen.c
src/gallium/state_trackers/dri/common/dri_screen.h
src/gallium/state_trackers/dri/drm/dri2.c
src/gallium/state_trackers/dri/sw/drisw.c

index b29e8533837a50df2a705f6512cb6a80eb875d95..692c49d7cd536f4f6c069ca42bb5c641a0f114bb 100644 (file)
@@ -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 *
index be824e7e3f9f441321beb4ec3bcebd0bed7034bc..88b79a0a76994dca8a0eb90c330298c6ce8ebbce 100644 (file)
@@ -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;
 }
index 62c7b0d41a339e01755cd1c14d9183842e12c890..3f2e24fc1585a37adb56de1d019af3ad9fd89c43 100644 (file)
@@ -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 *
index ed302e37c1f559375340c4691b19d428c4740072..e869b4b9b18a1e4081c9dab86bbde929fe9fa7a7 100644 (file)
@@ -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)
index e27ff9d98e4c235fb47836780df4337f24b947c0..53ccce145ba2eab125318adfb6071724c59ee91d 100644 (file)
@@ -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;
index 9965d706c894b98568a1c3b62437bf27ebb2a0f0..88ffa1e89d30294774bd5e2294cb9d74cbcf0cc8 100644 (file)
@@ -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,
 };
index d2210098d1b1b340c1b1aea79f8fef2cc04d9e7f..ae96f1b20e283edd766745666cf370cb3a88b9b4 100644 (file)
@@ -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,
 };