kopia lustrzana https://github.com/raspberrypi/pico-extras
Add PICO_SCANVIDEO_SCANLINE_RELEASE_FUNCTION for callback when scanlines are available (non host only)
rodzic
2309d56a3a
commit
77eae28366
|
@ -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);
|
typedef uint (*scanvideo_scanline_repeat_count_fn)(uint32_t scanline_id);
|
||||||
void scanvideo_set_scanline_repeat_fn(scanvideo_scanline_repeat_count_fn fn);
|
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_640x480_60_default;
|
||||||
extern const scanvideo_timing_t vga_timing_1280x1024_60_default;
|
extern const scanvideo_timing_t vga_timing_1280x1024_60_default;
|
||||||
|
|
|
@ -341,6 +341,9 @@ static bool video_timing_enabled = false;
|
||||||
static bool display_enabled = true;
|
static bool display_enabled = true;
|
||||||
|
|
||||||
static scanvideo_scanline_repeat_count_fn _scanline_repeat_count_fn;
|
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) {
|
inline static void list_prepend(full_scanline_buffer_t **phead, full_scanline_buffer_t *fsb) {
|
||||||
scanline_assert(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);
|
spin_unlock(shared_state.free_list.lock, save);
|
||||||
// note also this is useful for triggering scanvideo_wait_for_scanline_complete check
|
// note also this is useful for triggering scanvideo_wait_for_scanline_complete check
|
||||||
__sev();
|
__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
|
// 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);
|
release_scanline_irqs_enabled(buffers_to_free_count, &local_free_list);
|
||||||
|
|
||||||
free_local_free_list_irqs_enabled(local_free_list);
|
free_local_free_list_irqs_enabled(local_free_list);
|
||||||
|
|
||||||
if (signal) {
|
if (signal) {
|
||||||
|
@ -1041,7 +1046,6 @@ extern bool scanvideo_in_vblank() {
|
||||||
return *(volatile bool *) &shared_state.scanline.in_vblank;
|
return *(volatile bool *) &shared_state.scanline.in_vblank;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uint default_scanvideo_scanline_repeat_count_fn(uint32_t scanline_id) {
|
static uint default_scanvideo_scanline_repeat_count_fn(uint32_t scanline_id) {
|
||||||
return 1;
|
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;
|
_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) {
|
bool scanvideo_setup(const scanvideo_mode_t *mode) {
|
||||||
return scanvideo_setup_with_timing(mode, mode->default_timing);
|
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
|
#if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY
|
||||||
int program_wait_index = -1;
|
int program_wait_index = -1;
|
||||||
#endif
|
#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++) {
|
for (int i = 0; i < mode->pio_program->program->length; i++) {
|
||||||
if (instructions[i] == PIO_WAIT_IRQ4) {
|
if (instructions[i] == PIO_WAIT_IRQ4) {
|
||||||
#if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY
|
#if PICO_SCANVIDEO_ENABLE_VIDEO_RECOVERY
|
||||||
|
|
Ładowanie…
Reference in New Issue