From 77eae2836638baf2f61b321eb61125da99bb4445 Mon Sep 17 00:00:00 2001 From: graham sanderson Date: Mon, 1 Nov 2021 12:59:04 -0500 Subject: [PATCH] Add PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION for callback when scanlines are available (non host only) --- .../include/pico/scanvideo/scanvideo_base.h | 4 ++++ src/rp2_common/pico_scanvideo_dpi/scanvideo.c | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/common/pico_scanvideo/include/pico/scanvideo/scanvideo_base.h b/src/common/pico_scanvideo/include/pico/scanvideo/scanvideo_base.h index 44096a6..2002db6 100644 --- a/src/common/pico_scanvideo/include/pico/scanvideo/scanvideo_base.h +++ b/src/common/pico_scanvideo/include/pico/scanvideo/scanvideo_base.h @@ -265,6 +265,10 @@ void scanvideo_end_scanline_generation(scanvideo_scanline_buffer_t *scanline_buf typedef uint (*scanvideo_scanline_repeat_count_fn)(uint32_t scanline_id); void scanvideo_set_scanline_repeat_fn(scanvideo_scanline_repeat_count_fn fn); +#if PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION +typedef void (*scanvideo_scanline_release_fn)(); +void scanvideo_set_scanline_release_fn(scanvideo_scanline_release_fn fn); +#endif extern const scanvideo_timing_t vga_timing_640x480_60_default; extern const scanvideo_timing_t vga_timing_1280x1024_60_default; diff --git a/src/rp2_common/pico_scanvideo_dpi/scanvideo.c b/src/rp2_common/pico_scanvideo_dpi/scanvideo.c index f32d0f1..5065005 100644 --- a/src/rp2_common/pico_scanvideo_dpi/scanvideo.c +++ b/src/rp2_common/pico_scanvideo_dpi/scanvideo.c @@ -341,6 +341,9 @@ static bool video_timing_enabled = false; static bool display_enabled = true; static scanvideo_scanline_repeat_count_fn _scanline_repeat_count_fn; +#if PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION +static scanvideo_scanline_release_fn _scanline_release_fn; +#endif inline static void list_prepend(full_scanline_buffer_t **phead, full_scanline_buffer_t *fsb) { scanline_assert(fsb); @@ -466,6 +469,9 @@ inline static void free_local_free_list_irqs_enabled(full_scanline_buffer_t *loc spin_unlock(shared_state.free_list.lock, save); // note also this is useful for triggering scanvideo_wait_for_scanline_complete check __sev(); +#if PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION + if (_scanline_release_fn) _scanline_release_fn(); +#endif } } @@ -872,7 +878,6 @@ static void __video_time_critical_func(prepare_for_vblank_scanline_irqs_enabled) // because IRQs are enabled, we may obviously be pre-empted before or between either of these release_scanline_irqs_enabled(buffers_to_free_count, &local_free_list); - free_local_free_list_irqs_enabled(local_free_list); if (signal) { @@ -1041,7 +1046,6 @@ extern bool scanvideo_in_vblank() { return *(volatile bool *) &shared_state.scanline.in_vblank; } - static uint default_scanvideo_scanline_repeat_count_fn(uint32_t scanline_id) { return 1; } @@ -1254,6 +1258,13 @@ void scanvideo_set_scanline_repeat_fn(scanvideo_scanline_repeat_count_fn fn) { _scanline_repeat_count_fn = fn ? fn : default_scanvideo_scanline_repeat_count_fn; } +#if PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION +void scanvideo_set_scanline_release_fn(scanvideo_scanline_release_fn fn) { + _scanline_release_fn = fn; +} +#endif + + bool scanvideo_setup(const scanvideo_mode_t *mode) { return scanvideo_setup_with_timing(mode, mode->default_timing); } @@ -1377,7 +1388,7 @@ bool scanvideo_setup_with_timing(const scanvideo_mode_t *mode, const scanvideo_t #if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY int program_wait_index = -1; #endif -#if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY || PARAM_ASSERTIONS_ENABLED(SCANVIDEO_DBI) +#if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY || PARAM_ASSERTIONS_ENABLED(SCANVIDEO_DPI) for (int i = 0; i < mode->pio_program->program->length; i++) { if (instructions[i] == PIO_WAIT_IRQ4) { #if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY