diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/state_tracker/st_atom_framebuffer.c | 1 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_fbo.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_fbo.h | 1 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_flush.c | 11 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_context.h | 3 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_framebuffer.c | 12 | 
6 files changed, 28 insertions, 2 deletions
| diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index df0f0931ea..f23186c73d 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -123,6 +123,7 @@ update_framebuffer_state( struct st_context *st )              framebuffer->cbufs[framebuffer->nr_cbufs] = strb->surface;              framebuffer->nr_cbufs++;           } +         strb->defined = GL_TRUE; /* we'll be drawing something */        }     } diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 0b88d9bf7e..fe9befaa2c 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -125,6 +125,8 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     strb->Base.Height = height;     init_renderbuffer_bits(strb, template.format); +   strb->defined = GL_FALSE;  /* undefined contents now */ +     /* Probably need dedicated flags for surface usage too:       */     surface_usage = (PIPE_BUFFER_USAGE_GPU_READ | diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h index 44fa9fe9a4..fd77d0a95b 100644 --- a/src/mesa/state_tracker/st_cb_fbo.h +++ b/src/mesa/state_tracker/st_cb_fbo.h @@ -44,6 +44,7 @@ struct st_renderbuffer     struct pipe_texture *texture;     struct pipe_surface *surface; /* temporary view into texture */     enum pipe_format format;  /** preferred format, or PIPE_FORMAT_NONE */ +   GLboolean defined;        /**< defined contents? */     struct st_texture_object *rtt;  /**< GL render to texture's texture */     int rtt_level, rtt_face, rtt_slice; diff --git a/src/mesa/state_tracker/st_cb_flush.c b/src/mesa/state_tracker/st_cb_flush.c index fbaffd154f..8ceeeabcd3 100644 --- a/src/mesa/state_tracker/st_cb_flush.c +++ b/src/mesa/state_tracker/st_cb_flush.c @@ -47,10 +47,19 @@  #include "util/u_blit.h" +/** Check if we have a front color buffer and if it's been drawn to. */  static INLINE GLboolean  is_front_buffer_dirty(struct st_context *st)  { -   return st->frontbuffer_status == FRONT_STATUS_DIRTY; +   if (st->frontbuffer_status == FRONT_STATUS_DIRTY) { +      return GL_TRUE; +   } +   else { +      GLframebuffer *fb = st->ctx->DrawBuffer; +      struct st_renderbuffer *strb +         = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); +      return strb && strb->defined; +   }  } diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 6ffed56d9a..18adb35e87 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -45,6 +45,7 @@ struct blit_state;  struct bitmap_cache; +/** XXX we'd like to get rid of these */  #define FRONT_STATUS_UNDEFINED    0  #define FRONT_STATUS_DIRTY        1  #define FRONT_STATUS_COPY_OF_BACK 2 @@ -111,7 +112,7 @@ struct st_context        struct gl_fragment_program *fragment_program;     } cb; -   GLuint frontbuffer_status;  /**< one of FRONT_STATUS_ */ +   GLuint frontbuffer_status;  /**< one of FRONT_STATUS_ (XXX to be removed) */     char vendor[100];     char renderer[100]; diff --git a/src/mesa/state_tracker/st_framebuffer.c b/src/mesa/state_tracker/st_framebuffer.c index 07ccaa6aab..639373fff7 100644 --- a/src/mesa/state_tracker/st_framebuffer.c +++ b/src/mesa/state_tracker/st_framebuffer.c @@ -331,6 +331,12 @@ st_swapbuffers(struct st_framebuffer *stfb,              st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);           *front_left = strb->surface;        } +      /* mark back buffer contents as undefined */ +      { +         struct st_renderbuffer *back = +            st_renderbuffer(fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer); +         back->defined = GL_FALSE; +      }     }     else {        /* no front buffer, display the back buffer */ @@ -354,6 +360,12 @@ st_swapbuffers(struct st_framebuffer *stfb,              st_renderbuffer(fb->Attachment[BUFFER_FRONT_RIGHT].Renderbuffer);           *front_right = strb->surface;        } +      /* mark back buffer contents as undefined */ +      { +         struct st_renderbuffer *back = +            st_renderbuffer(fb->Attachment[BUFFER_BACK_RIGHT].Renderbuffer); +         back->defined = GL_FALSE; +      }     }     else {        /* no front right buffer, display back right buffer (if exists) */ | 
