summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_manager.c
diff options
context:
space:
mode:
authorThomas Hellstrom <[email protected]>2017-06-20 21:12:50 +0200
committerThomas Hellstrom <[email protected]>2017-08-02 11:55:35 +0200
commiteceb6710024716433069d705fbd873d6d136c2cc (patch)
treeef0895f5a8704536e1a02308861100af85bac934 /src/mesa/state_tracker/st_manager.c
parenteb88ece9e36cb4a5b09dcb800aa9e34ed4ba42c0 (diff)
mesa/st: Reduce the number of frontbuffer flush calls
The mesa state tracker was needlessly flushing the front buffer even if it hadn't been drawn to since the last flush. This was happening during glXSwapBuffers if we at some point previously had set that frontbuffer as a read- or draw renderbuffer, or at glFlush() or glFinish() if we at some point previously had rendered to the front buffer. Since the frontbuffer flush typically means a full drawable copy, it's a pretty big waste. Signed-off-by: Thomas Hellstrom <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Reviewed-by: Sinclair Yeh <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker/st_manager.c')
-rw-r--r--src/mesa/state_tracker/st_manager.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index 62924b099e9..28cf0234cd6 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -1036,11 +1036,15 @@ st_manager_flush_frontbuffer(struct st_context *st)
if (stfb)
strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
- if (!strb)
- return;
- /* never a dummy fb */
- stfb->iface->flush_front(&st->iface, stfb->iface, ST_ATTACHMENT_FRONT_LEFT);
+ /* Do we have a front color buffer and has it been drawn to since last
+ * frontbuffer flush?
+ */
+ if (strb && strb->defined) {
+ stfb->iface->flush_front(&st->iface, stfb->iface,
+ ST_ATTACHMENT_FRONT_LEFT);
+ strb->defined = GL_FALSE;
+ }
}
/**