diff options
| -rw-r--r-- | src/gallium/state_trackers/dri/dri_st_api.c | 57 | 
1 files changed, 40 insertions, 17 deletions
| diff --git a/src/gallium/state_trackers/dri/dri_st_api.c b/src/gallium/state_trackers/dri/dri_st_api.c index 2cdfd257b0..84c94cb06d 100644 --- a/src/gallium/state_trackers/dri/dri_st_api.c +++ b/src/gallium/state_trackers/dri/dri_st_api.c @@ -261,6 +261,18 @@ dri_drawable_get_buffers(struct dri_drawable *drawable,     return buffers;  } +static void +dri_allocate_textures(struct dri_drawable *drawable, +                      const enum st_attachment_type *statts, +                      unsigned count) +{ +   __DRIbuffer *buffers; +   unsigned num_buffers = count; + +   buffers = dri_drawable_get_buffers(drawable, statts, &num_buffers); +   dri_drawable_process_buffers(drawable, buffers, num_buffers); +} +  static boolean  dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,                              const enum st_attachment_type *statts, @@ -269,30 +281,31 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,  {     struct dri_drawable *drawable =        (struct dri_drawable *) stfbi->st_manager_private; -   unsigned statt_mask, i; +   unsigned statt_mask, new_mask; +   boolean new_stamp; +   int i;     statt_mask = 0x0;     for (i = 0; i < count; i++)        statt_mask |= (1 << statts[i]); +   /* record newly allocated textures */ +   new_mask = (statt_mask & ~drawable->texture_mask); +     /*      * dPriv->pStamp is the server stamp.  It should be accessed with a lock, at      * least for DRI1.  dPriv->lastStamp is the client stamp.  It has the value      * of the server stamp when last checked. -    * -    * This function updates the textures and records the stamp of the textures.      */ -   if (drawable->texture_stamp != drawable->dPriv->lastStamp || -       (statt_mask & ~drawable->texture_mask)) { +   new_stamp = (drawable->texture_stamp != drawable->dPriv->lastStamp); + +   if (new_stamp || new_mask) { +        if (__dri1_api_hooks) {           dri1_allocate_textures(drawable, statt_mask);        }        else { -         __DRIbuffer *buffers; -         unsigned num_buffers = count; - -         buffers = dri_drawable_get_buffers(drawable, statts, &num_buffers); -         dri_drawable_process_buffers(drawable, buffers, num_buffers); +         dri_allocate_textures(drawable, statts, count);        }        /* add existing textures */ @@ -316,23 +329,33 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,     return TRUE;  } +static void +dri_flush_frontbuffer(struct dri_drawable *drawable, +                      enum st_attachment_type statt) +{ +   __DRIdrawable *dri_drawable = drawable->dPriv; +   struct __DRIdri2LoaderExtensionRec *loader = drawable->sPriv->dri2.loader; + +   if (loader->flushFrontBuffer == NULL) +      return; + +   if (statt == ST_ATTACHMENT_FRONT_LEFT) { +      loader->flushFrontBuffer(dri_drawable, dri_drawable->loaderPrivate); +   } +} +  static boolean  dri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,                                 enum st_attachment_type statt)  {     struct dri_drawable *drawable =        (struct dri_drawable *) stfbi->st_manager_private; -   struct __DRIdri2LoaderExtensionRec *loader = -      drawable->sPriv->dri2.loader;     if (__dri1_api_hooks) {        dri1_flush_frontbuffer(drawable, statt); -      return TRUE;     } - -   if (statt == ST_ATTACHMENT_FRONT_LEFT && loader->flushFrontBuffer) { -      loader->flushFrontBuffer(drawable->dPriv, -            drawable->dPriv->loaderPrivate); +   else { +      dri_flush_frontbuffer(drawable, statt);     }     return TRUE; | 
