diff options
| -rw-r--r-- | src/gallium/state_trackers/dri/dri1.c | 46 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/dri1.h | 3 | ||||
| -rw-r--r-- | src/gallium/state_trackers/dri/dri_st_api.c | 13 | 
3 files changed, 37 insertions, 25 deletions
| diff --git a/src/gallium/state_trackers/dri/dri1.c b/src/gallium/state_trackers/dri/dri1.c index 240bc69efd..9108d41bd9 100644 --- a/src/gallium/state_trackers/dri/dri1.c +++ b/src/gallium/state_trackers/dri/dri1.c @@ -318,23 +318,23 @@ dri1_copy_to_front(struct dri_context *ctx,  }  void -dri1_flush_frontbuffer(struct dri_drawable *drawable, -                       struct pipe_texture *ptex) +dri1_flush_frontbuffer(struct dri_drawable *draw, +                       enum st_attachment_type statt)  { -   struct st_api *stapi = dri_get_st_api(); -   struct dri_screen *screen = dri_screen(drawable->sPriv); +   struct dri_context *ctx = dri_get_current(); +   struct dri_screen *screen = dri_screen(draw->sPriv);     struct pipe_screen *pipe_screen = screen->pipe_screen; -   struct dri_context *ctx;     struct pipe_fence_handle *dummy_fence; -   struct st_context_iface *st = stapi->get_current(stapi); - -   if (!st) -      return; +   struct pipe_texture *ptex; -   ctx = (struct dri_context *) st->st_manager_private; +   if (!ctx) +      return;			       /* For now */ -   dri1_copy_to_front(ctx, ptex, ctx->dPriv, NULL, &dummy_fence); -   pipe_screen->fence_reference(pipe_screen, &dummy_fence, NULL); +   ptex = draw->textures[statt]; +   if (ptex) { +      dri1_copy_to_front(ctx, ptex, ctx->dPriv, NULL, &dummy_fence); +      pipe_screen->fence_reference(pipe_screen, &dummy_fence, NULL); +   }     /**      * FIXME: Do we need swap throttling here? @@ -399,17 +399,31 @@ dri1_copy_sub_buffer(__DRIdrawable * dPriv, int x, int y, int w, int h)     }  } +/** + * Allocate framebuffer attachments. + * + * During fixed-size operation, the function keeps allocating new attachments + * as they are requested. Unused attachments are not removed, not until the + * framebuffer is resized or destroyed. + */  void  dri1_allocate_textures(struct dri_drawable *drawable, -                       unsigned width, unsigned height,                         unsigned mask)  {     struct dri_screen *screen = dri_screen(drawable->sPriv);     struct pipe_texture templ; +   unsigned width, height; +   boolean resized;     int i; +   width  = drawable->dPriv->w; +   height = drawable->dPriv->h; + +   resized = (drawable->old_w != width || +              drawable->old_h != height); +     /* remove outdated textures */ -   if (drawable->old_w != width || drawable->old_h != height) { +   if (resized) {        for (i = 0; i < ST_ATTACHMENT_COUNT; i++)           pipe_texture_reference(&drawable->textures[i], NULL);     } @@ -427,9 +441,6 @@ dri1_allocate_textures(struct dri_drawable *drawable,        /* the texture already exists or not requested */        if (drawable->textures[i] || !(mask & (1 << i))) { -         /* remember the texture */ -         if (drawable->textures[i]) -            mask |= (1 << i);           continue;        } @@ -462,7 +473,6 @@ dri1_allocate_textures(struct dri_drawable *drawable,     drawable->old_w = width;     drawable->old_h = height; -   drawable->texture_mask = mask;  }  static void diff --git a/src/gallium/state_trackers/dri/dri1.h b/src/gallium/state_trackers/dri/dri1.h index e83571e57b..f1004281b5 100644 --- a/src/gallium/state_trackers/dri/dri1.h +++ b/src/gallium/state_trackers/dri/dri1.h @@ -45,11 +45,10 @@ dri1_init_screen(__DRIscreen * sPriv);  void  dri1_flush_frontbuffer(struct dri_drawable *drawable, -                       struct pipe_texture *ptex); +                       enum st_attachment_type statt);  void  dri1_allocate_textures(struct dri_drawable *drawable, -                       unsigned width, unsigned height,                         unsigned mask);  void dri1_swap_buffers(__DRIdrawable * dPriv); diff --git a/src/gallium/state_trackers/dri/dri_st_api.c b/src/gallium/state_trackers/dri/dri_st_api.c index e721e55459..2cdfd257b0 100644 --- a/src/gallium/state_trackers/dri/dri_st_api.c +++ b/src/gallium/state_trackers/dri/dri_st_api.c @@ -285,8 +285,7 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,     if (drawable->texture_stamp != drawable->dPriv->lastStamp ||         (statt_mask & ~drawable->texture_mask)) {        if (__dri1_api_hooks) { -         dri1_allocate_textures(drawable, -               drawable->dPriv->w, drawable->dPriv->h, statt_mask); +         dri1_allocate_textures(drawable, statt_mask);        }        else {           __DRIbuffer *buffers; @@ -296,6 +295,12 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,           dri_drawable_process_buffers(drawable, buffers, num_buffers);        } +      /* add existing textures */ +      for (i = 0; i < ST_ATTACHMENT_COUNT; i++) { +         if (drawable->textures[i]) +            statt_mask |= (1 << i); +      } +        drawable->texture_stamp = drawable->dPriv->lastStamp;        drawable->texture_mask = statt_mask;     } @@ -321,9 +326,7 @@ dri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,        drawable->sPriv->dri2.loader;     if (__dri1_api_hooks) { -      struct pipe_texture *ptex = drawable->textures[statt]; -      if (ptex) -         dri1_flush_frontbuffer(drawable, ptex); +      dri1_flush_frontbuffer(drawable, statt);        return TRUE;     } | 
