summaryrefslogtreecommitdiff
path: root/src/loader
diff options
context:
space:
mode:
authorMichel Dänzer <mdaenzer@redhat.com>2020-10-02 15:20:17 +0200
committerMarge Bot <eric+marge@anholt.net>2020-10-22 15:52:33 +0000
commit60585fc4e34858aa277286209f3cf61e83770181 (patch)
tree2f628756ab317eeba0b10d5dbd304150440d1532 /src/loader
parentea326912575fad09af59486ad62d126c4ea0ede7 (diff)
loader/dri3: Only allocate additional buffers if needed
Previously, we would always allocate 3 buffers for page flipping. But 2 buffers can suffice for clients which always wait for buffer swaps to complete before starting a new frame. Therefore, keep track of the maximum number of buffers separately from the current number, and only bump the latter if both current buffers are busy. Cc: mesa-stable Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7033>
Diffstat (limited to 'src/loader')
-rw-r--r--src/loader/loader_dri3_helper.c40
-rw-r--r--src/loader/loader_dri3_helper.h3
2 files changed, 31 insertions, 12 deletions
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index 1984c20c909..6a65f3112d4 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -272,12 +272,23 @@ dri3_fence_await(xcb_connection_t *c, struct loader_dri3_drawable *draw,
}
static void
-dri3_update_num_back(struct loader_dri3_drawable *draw)
+dri3_update_max_num_back(struct loader_dri3_drawable *draw)
{
- if (draw->last_present_mode == XCB_PRESENT_COMPLETE_MODE_FLIP)
- draw->num_back = 3;
- else
- draw->num_back = 2;
+ switch (draw->last_present_mode) {
+ case XCB_PRESENT_COMPLETE_MODE_FLIP:
+ /* Leave cur_num_back unchanged, it'll grow as needed */
+ draw->max_num_back = 3;
+ break;
+
+ default:
+ /* On transition from flips to copies, start with a single buffer again,
+ * a second one will be allocated if needed
+ */
+ if (draw->max_num_back != 2)
+ draw->cur_num_back = 1;
+
+ draw->max_num_back = 2;
+ }
}
void
@@ -395,7 +406,7 @@ loader_dri3_drawable_init(xcb_connection_t *conn,
}
draw->swap_interval = swap_interval;
- dri3_update_num_back(draw);
+ dri3_update_max_num_back(draw);
/* Create a new drawable */
draw->dri_drawable =
@@ -643,6 +654,7 @@ dri3_find_back(struct loader_dri3_drawable *draw)
{
int b;
int num_to_consider;
+ int max_num;
mtx_lock(&draw->mtx);
/* Increase the likelyhood of reusing current buffer */
@@ -651,15 +663,18 @@ dri3_find_back(struct loader_dri3_drawable *draw)
/* Check whether we need to reuse the current back buffer as new back.
* In that case, wait until it's not busy anymore.
*/
- num_to_consider = draw->num_back;
if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1) {
num_to_consider = 1;
+ max_num = 1;
draw->cur_blit_source = -1;
+ } else {
+ num_to_consider = draw->cur_num_back;
+ max_num = draw->max_num_back;
}
for (;;) {
for (b = 0; b < num_to_consider; b++) {
- int id = LOADER_DRI3_BACK_ID((b + draw->cur_back) % draw->num_back);
+ int id = LOADER_DRI3_BACK_ID((b + draw->cur_back) % draw->cur_num_back);
struct loader_dri3_buffer *buffer = draw->buffers[id];
if (!buffer || !buffer->busy) {
@@ -668,7 +683,10 @@ dri3_find_back(struct loader_dri3_drawable *draw)
return id;
}
}
- if (!dri3_wait_for_event_locked(draw, NULL)) {
+
+ if (num_to_consider < max_num) {
+ num_to_consider = ++draw->cur_num_back;
+ } else if (!dri3_wait_for_event_locked(draw, NULL)) {
mtx_unlock(&draw->mtx);
return -1;
}
@@ -2014,10 +2032,10 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
if (!dri3_update_drawable(draw))
return false;
- dri3_update_num_back(draw);
+ dri3_update_max_num_back(draw);
/* Free no longer needed back buffers */
- for (buf_id = draw->num_back; buf_id < LOADER_DRI3_MAX_BACK; buf_id++) {
+ for (buf_id = draw->cur_num_back; buf_id < LOADER_DRI3_MAX_BACK; buf_id++) {
if (draw->cur_blit_source != buf_id && draw->buffers[buf_id]) {
dri3_free_render_buffer(draw, draw->buffers[buf_id]);
draw->buffers[buf_id] = NULL;
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index af5fdbc4193..3d50852ba86 100644
--- a/src/loader/loader_dri3_helper.h
+++ b/src/loader/loader_dri3_helper.h
@@ -146,7 +146,8 @@ struct loader_dri3_drawable {
struct loader_dri3_buffer *buffers[LOADER_DRI3_NUM_BUFFERS];
int cur_back;
- int num_back;
+ int cur_num_back;
+ int max_num_back;
int cur_blit_source;
uint32_t *stamp;