static void
dri3_free_render_buffer(struct dri3_drawable *pdraw, struct dri3_buffer *buffer);
+static void
+dri3_update_num_back(struct dri3_drawable *priv)
+{
+ priv->num_back = 1;
+ if (priv->flipping)
+ priv->num_back++;
+ if (priv->swap_interval == 0)
+ priv->num_back++;
+}
+
static void
dri3_destroy_drawable(__GLXDRIdrawable *base)
{
break;
}
+ dri3_update_num_back(pdraw);
+
(void) __glXInitialize(psc->base.dpy);
/* Create a new drawable */
priv->recv_sbc = (priv->send_sbc & 0xffffffff00000000LL) | ce->serial;
if (priv->recv_sbc > priv->send_sbc)
priv->recv_sbc -= 0x100000000;
+ switch (ce->mode) {
+ case XCB_PRESENT_COMPLETE_MODE_FLIP:
+ priv->flipping = true;
+ break;
+ case XCB_PRESENT_COMPLETE_MODE_COPY:
+ priv->flipping = false;
+ break;
+ }
+ dri3_update_num_back(priv);
} else {
priv->recv_msc_serial = ce->serial;
}
if (buf && buf->pixmap == ie->pixmap) {
buf->busy = 0;
+ if (priv->num_back <= b && b < DRI3_MAX_BACK) {
+ dri3_free_render_buffer(priv, buf);
+ priv->buffers[b] = NULL;
+ }
break;
}
}
xcb_present_generic_event_t *ge;
for (;;) {
-
- for (b = 0; b < DRI3_NUM_BACK; b++) {
- int id = DRI3_BACK_ID(b);
- struct dri3_buffer *buffer = priv->buffers[id];
+ for (b = 0; b < priv->num_back; b++) {
+ int id = DRI3_BACK_ID(b);
+ struct dri3_buffer *buffer = priv->buffers[id];
if (!buffer)
return b;
switch (buffer_type) {
case dri3_buffer_back:
first_id = DRI3_BACK_ID(0);
- n_id = DRI3_NUM_BACK;
+ n_id = DRI3_MAX_BACK;
break;
case dri3_buffer_front:
first_id = DRI3_FRONT_ID;
}
priv->swap_interval = interval;
+ dri3_update_num_back(priv);
return 0;
}
__DRIcontext *driContext;
};
-#define DRI3_NUM_BACK 2
+#define DRI3_MAX_BACK 3
#define DRI3_BACK_ID(i) (i)
-#define DRI3_FRONT_ID (DRI3_NUM_BACK)
-
-static inline int
-dri3_buf_id_next(int buf_id)
-{
- if (buf_id == DRI3_NUM_BACK - 1)
- return 0;
- return buf_id + 1;
-}
-
-static inline int
-dri3_buf_id_prev(int buf_id)
-{
- if (buf_id == 0)
- return DRI3_NUM_BACK - 1;
- return buf_id - 1;
-}
+#define DRI3_FRONT_ID (DRI3_MAX_BACK)
static inline int
dri3_pixmap_buf_id(enum dri3_buffer_type buffer_type)
return DRI3_FRONT_ID;
}
-#define DRI3_NUM_BUFFERS (1 + DRI3_NUM_BACK)
+#define DRI3_NUM_BUFFERS (1 + DRI3_MAX_BACK)
struct dri3_drawable {
__GLXDRIdrawable base;
uint8_t have_back;
uint8_t have_fake_front;
uint8_t is_pixmap;
+ uint8_t flipping;
/* SBC numbers are tracked by using the serial numbers
* in the present request and complete events
struct dri3_buffer *buffers[DRI3_NUM_BUFFERS];
int cur_back;
+ int num_back;
uint32_t *stamp;