diff options
Diffstat (limited to 'video/out/dr_helper.h')
-rw-r--r-- | video/out/dr_helper.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/video/out/dr_helper.h b/video/out/dr_helper.h index cf37c570e2..ff1d268426 100644 --- a/video/out/dr_helper.h +++ b/video/out/dr_helper.h @@ -3,18 +3,35 @@ // This is a helper for implementing thread-safety for DR callbacks. These need // to allocate GPU buffers on the GPU thread (e.g. OpenGL with its forced TLS), // and the buffers also need to be freed on the GPU thread. +// This is not a helpful "Dr.", rather it represents Satan in form of C code. struct dr_helper; struct mp_image; struct mp_dispatch_queue; -// This MUST be called on the "target" thread (it will call pthread_self()). // dr_helper_get_image() calls will use the dispatch queue to run get_image on -// the target thread too. +// a target thread, which processes the dispatch queue. +// Note: the dispatch queue must process outstanding async. work before the +// dr_helper instance can be destroyed. struct dr_helper *dr_helper_create(struct mp_dispatch_queue *dispatch, struct mp_image *(*get_image)(void *ctx, int imgfmt, int w, int h, int stride_align), void *get_image_ctx); +// Make DR release calls (freeing images) reentrant if they are called on this +// (pthread_self()) thread. That means any free call will directly release the +// image as allocated with get_image(). +// Only 1 thread can use this at a time. Note that it would make no sense to +// call this on more than 1 thread, as get_image is assumed not thread-safe. +void dr_helper_acquire_thread(struct dr_helper *dr); + +// This _must_ be called on the same thread as dr_helper_acquire_thread() was +// called. Every release call must be paired with an acquire call. +void dr_helper_release_thread(struct dr_helper *dr); + +// Allocate an image by running the get_image callback on the target thread. +// Always blocks on dispatch queue processing. This implies there is no way to +// allocate a DR'ed image on the render thread (at least not in a way which +// actually works if you want foreign threads to be able to free them). struct mp_image *dr_helper_get_image(struct dr_helper *dr, int imgfmt, int w, int h, int stride_align); |