mirror of https://github.com/mpv-player/mpv
vo_drm: support controlling swapchain depth using swapchain-depth option
This commit is contained in:
parent
6290420380
commit
0c8eb80e98
|
@ -46,9 +46,6 @@
|
||||||
#define BITS_PER_PIXEL 32
|
#define BITS_PER_PIXEL 32
|
||||||
#define USE_MASTER 0
|
#define USE_MASTER 0
|
||||||
|
|
||||||
#define BUF_COUNT 4
|
|
||||||
#define SWAPCHAIN_DEPTH 3
|
|
||||||
|
|
||||||
struct framebuffer {
|
struct framebuffer {
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
|
@ -75,7 +72,9 @@ struct priv {
|
||||||
bool vt_switcher_active;
|
bool vt_switcher_active;
|
||||||
struct vt_switcher vt_switcher;
|
struct vt_switcher vt_switcher;
|
||||||
|
|
||||||
struct framebuffer bufs[BUF_COUNT];
|
int swapchain_depth;
|
||||||
|
unsigned int buf_count;
|
||||||
|
struct framebuffer *bufs;
|
||||||
int front_buf;
|
int front_buf;
|
||||||
bool active;
|
bool active;
|
||||||
bool waiting_for_flip;
|
bool waiting_for_flip;
|
||||||
|
@ -175,13 +174,15 @@ static bool fb_setup_buffers(struct vo *vo)
|
||||||
{
|
{
|
||||||
struct priv *p = vo->priv;
|
struct priv *p = vo->priv;
|
||||||
|
|
||||||
|
p->bufs = talloc_zero_array(p, struct framebuffer, p->buf_count);
|
||||||
|
|
||||||
p->front_buf = 0;
|
p->front_buf = 0;
|
||||||
for (unsigned int i = 0; i < BUF_COUNT; i++) {
|
for (unsigned int i = 0; i < p->buf_count; i++) {
|
||||||
p->bufs[i].width = p->kms->mode.mode.hdisplay;
|
p->bufs[i].width = p->kms->mode.mode.hdisplay;
|
||||||
p->bufs[i].height = p->kms->mode.mode.vdisplay;
|
p->bufs[i].height = p->kms->mode.mode.vdisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < BUF_COUNT; i++) {
|
for (unsigned int i = 0; i < p->buf_count; i++) {
|
||||||
if (!fb_setup_single(vo, p->kms->fd, &p->bufs[i])) {
|
if (!fb_setup_single(vo, p->kms->fd, &p->bufs[i])) {
|
||||||
MP_ERR(vo, "Cannot create framebuffer\n");
|
MP_ERR(vo, "Cannot create framebuffer\n");
|
||||||
for (unsigned int j = 0; j < i; j++) {
|
for (unsigned int j = 0; j < i; j++) {
|
||||||
|
@ -327,7 +328,7 @@ static int reconfig(struct vo *vo, struct mp_image_params *params)
|
||||||
p->last_input = NULL;
|
p->last_input = NULL;
|
||||||
|
|
||||||
struct framebuffer *buf = p->bufs;
|
struct framebuffer *buf = p->bufs;
|
||||||
for (unsigned int i = 0; i < BUF_COUNT; i++)
|
for (unsigned int i = 0; i < p->buf_count; i++)
|
||||||
memset(buf[i].map, 0, buf[i].size);
|
memset(buf[i].map, 0, buf[i].size);
|
||||||
|
|
||||||
if (mp_sws_reinit(p->sws) < 0)
|
if (mp_sws_reinit(p->sws) < 0)
|
||||||
|
@ -365,7 +366,7 @@ static struct framebuffer *get_new_fb(struct vo *vo)
|
||||||
struct priv *p = vo->priv;
|
struct priv *p = vo->priv;
|
||||||
|
|
||||||
p->front_buf++;
|
p->front_buf++;
|
||||||
p->front_buf %= BUF_COUNT;
|
p->front_buf %= p->buf_count;
|
||||||
|
|
||||||
return &p->bufs[p->front_buf];
|
return &p->bufs[p->front_buf];
|
||||||
}
|
}
|
||||||
|
@ -512,7 +513,7 @@ static void flip_page(struct vo *vo)
|
||||||
if (!p->active)
|
if (!p->active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (drain || p->fb_queue_len > SWAPCHAIN_DEPTH) {
|
while (drain || p->fb_queue_len > p->swapchain_depth) {
|
||||||
if (p->waiting_for_flip) {
|
if (p->waiting_for_flip) {
|
||||||
wait_on_flip(vo);
|
wait_on_flip(vo);
|
||||||
swapchain_step(vo);
|
swapchain_step(vo);
|
||||||
|
@ -539,7 +540,7 @@ static void uninit(struct vo *vo)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->kms) {
|
if (p->kms) {
|
||||||
for (unsigned int i = 0; i < BUF_COUNT; i++)
|
for (unsigned int i = 0; i < p->buf_count; i++)
|
||||||
fb_destroy(p->kms->fd, &p->bufs[i]);
|
fb_destroy(p->kms->fd, &p->bufs[i]);
|
||||||
kms_destroy(p->kms);
|
kms_destroy(p->kms);
|
||||||
p->kms = NULL;
|
p->kms = NULL;
|
||||||
|
@ -585,6 +586,8 @@ static int preinit(struct vo *vo)
|
||||||
p->imgfmt = IMGFMT_XRGB8888;
|
p->imgfmt = IMGFMT_XRGB8888;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->swapchain_depth = vo->opts->swapchain_depth;
|
||||||
|
p->buf_count = p->swapchain_depth + 1;
|
||||||
if (!fb_setup_buffers(vo)) {
|
if (!fb_setup_buffers(vo)) {
|
||||||
MP_ERR(vo, "Failed to set up buffers.\n");
|
MP_ERR(vo, "Failed to set up buffers.\n");
|
||||||
goto err;
|
goto err;
|
||||||
|
|
Loading…
Reference in New Issue