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). --- src/glx/dri3_glx.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 72ec8ec..e5862f3 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -1093,13 +1093,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); @@ -1126,13 +1126,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; } -- 1.9.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev