summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-03-07 15:56:06 -0800
committerEric Anholt <[email protected]>2014-03-13 14:19:16 -0700
commit0b02d8a633da7ee19793eb12bb5ea407afe0de6f (patch)
tree4c6429ba526212b166b1ffb6e74a4ba4ee220633
parent551d459af421a2eb937e9e16301bb64da4624f89 (diff)
dri3: Prefer the last chosen back when finding a new one.
With the buffer_age code, I need to be able to potentially call this more than once per frame, and it would be bad if a new special event showing up meant I chose a different back mid-frame. Now, once we've chosen a back for the frame, another find_back will choose it again since we know that it won't have ->busy set until swap. Note that this makes find_back return a buffer id instead of a backbuffer index. That's kind of a silly distinction anyway, since it's an identity mapping between the two (it's the front buffer that is at an offset). Reviewed-By: Adel Gadllah <[email protected]>
-rw-r--r--src/glx/dri3_glx.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index f27a773981f..ba801847671 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -1090,13 +1090,13 @@ dri3_find_back(xcb_connection_t *c, struct dri3_drawable *priv)
for (;;) {
for (b = 0; b < priv->num_back; b++) {
- int id = DRI3_BACK_ID(b);
+ int id = DRI3_BACK_ID((b + priv->cur_back) % priv->num_back);
struct dri3_buffer *buffer = priv->buffers[id];
- if (!buffer)
- return b;
- if (!buffer->busy)
- return b;
+ if (!buffer || !buffer->busy) {
+ priv->cur_back = id;
+ return id;
+ }
}
xcb_flush(c);
ev = xcb_wait_for_special_event(c, priv->special_event);
@@ -1123,13 +1123,10 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
int buf_id;
if (buffer_type == dri3_buffer_back) {
- int back = dri3_find_back(c, priv);
+ buf_id = dri3_find_back(c, priv);
- if (back < 0)
+ if (buf_id < 0)
return NULL;
-
- priv->cur_back = back;
- buf_id = DRI3_BACK_ID(priv->cur_back);
} else {
buf_id = DRI3_FRONT_ID;
}