diff options
author | wm4 <wm4@nowhere> | 2015-05-01 18:25:29 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-05-01 18:26:58 +0200 |
commit | e23e4c7c603fc1cd911621d0f833031be4a6f7c7 (patch) | |
tree | 571a8e11f3cefeb90c72fb9279ea7e52d0f53fc9 /video/out/cocoa_common.m | |
parent | ffcad1a72b9a3bf5a7ac5ddcbfa71ec19b6faf9b (diff) | |
download | mpv-e23e4c7c603fc1cd911621d0f833031be4a6f7c7.tar.bz2 mpv-e23e4c7c603fc1cd911621d0f833031be4a6f7c7.tar.xz |
cocoa: don't accidentally drop initial screen drawing
With --idle --force-window, or when started from the bundle, the cocoa
code dropped the first frame. This resulted in a black frame on start
sometimes.
The reason was that the live resizing/redrawing code was invoked, which
simply set skip_swap_buffer to false, blocking redrawing whatever was
going to be rendered next. Normally this is done so that the following
works:
1. vo_opengl draw a frame, releases GL lock
2. live resizing kicks in, redraw the frame
3. vo_opengl wants to call SwapBuffers, drawing a stale buffer
overwritten by the live resizing code
This is solved by setting skip_swap_buffer in 2., and querying it in 3.
Fix this by resetting the skip_swap_buffer at a known good point: when
vo_opengl starts drawing a new frame.
The start_frame function returns bool, so that it can be merged with
is_active in a following commit.
Diffstat (limited to 'video/out/cocoa_common.m')
-rw-r--r-- | video/out/cocoa_common.m | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index e768e06e7d..8a0473e729 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -632,13 +632,21 @@ static void draw_changes_after_next_frame(struct vo *vo) } } +bool vo_cocoa_start_frame(struct vo *vo) +{ + struct vo_cocoa_state *s = vo->cocoa; + + s->skip_swap_buffer = false; + return true; +} + void vo_cocoa_swap_buffers(struct vo *vo) { struct vo_cocoa_state *s = vo->cocoa; if (s->skip_swap_buffer && !s->waiting_frame) { s->skip_swap_buffer = false; - return; + s->pending_events |= VO_EVENT_EXPOSE; } else { [s->gl_ctx flushBuffer]; } |