diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/state_trackers/dri/common/dri_context.h | 3 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/common/dri_drawable.c | 9 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/common/dri_drawable.h | 10 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/common/dri_screen.c | 5 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/common/dri_screen.h | 9 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/drm/dri2.c | 45 | ||||
| -rw-r--r-- | 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 b29e853383..692c49d7cd 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 be824e7e3f..88b79a0a76 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 62c7b0d41a..3f2e24fc15 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 ed302e37c1..e869b4b9b1 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 e27ff9d98e..53ccce145b 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 9965d706c8..88ffa1e89d 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 d2210098d1..ae96f1b20e 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,  }; | 
