audio_buffer: optimization, only one call to _dvi_load_dma_op since it's inline. Use ptr assigment

pull/94/head
Marcelo Lorenzati 2023-03-27 21:56:19 -03:00
rodzic d47d004762
commit 961a38a65f
2 zmienionych plików z 33 dodań i 59 usunięć

Wyświetl plik

@ -241,73 +241,58 @@ static void __dvi_func(dvi_dma_irq_handler)(struct dvi_inst *inst) {
--inst->late_scanline_ctr;
}
struct dvi_scanline_dma_list *dma_list_selected = &inst->dma_list_vblank_nosync;
switch (inst->timing_state.v_state) {
case DVI_STATE_ACTIVE:
{
bool is_blank_line = false;
if (inst->timing_state.v_ctr < inst->blank_settings.top ||
inst->timing_state.v_ctr >= (inst->timing->v_active_lines - inst->blank_settings.bottom))
{
if (inst->timing_state.v_ctr < inst->blank_settings.top ||
inst->timing_state.v_ctr >= (inst->timing->v_active_lines - inst->blank_settings.bottom)) {
// Is a Blank Line
is_blank_line = true;
}
else
{
if (queue_try_peek_u32(&inst->q_tmds_valid, &tmdsbuf))
{
if (inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1)
{
} else {
if (queue_try_peek_u32(&inst->q_tmds_valid, &tmdsbuf)) {
if (inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1) {
queue_remove_blocking_u32(&inst->q_tmds_valid, &tmdsbuf);
inst->tmds_buf_release[0] = tmdsbuf;
}
}
else
{
} else {
// No valid scanline was ready (generates solid red scanline)
tmdsbuf = NULL;
if (inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1)
{
if (inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1) {
++inst->late_scanline_ctr;
}
}
if (inst->scanline_is_enabled && (inst->timing_state.v_ctr & 1))
{
if (inst->scanline_is_enabled && (inst->timing_state.v_ctr & 1)) {
is_blank_line = true;
}
}
if (is_blank_line)
{
_dvi_load_dma_op(inst->dma_cfg, &inst->dma_list_active_blank);
}
else if (tmdsbuf)
{
if (is_blank_line) {
dma_list_selected = &inst->dma_list_active_blank;
} else if (tmdsbuf) {
dvi_update_scanline_data_dma(inst->timing, tmdsbuf, &inst->dma_list_active, inst->data_island_is_enabled);
_dvi_load_dma_op(inst->dma_cfg, &inst->dma_list_active);
dma_list_selected = &inst->dma_list_active;
} else {
dma_list_selected = &inst->dma_list_error;
}
else
{
_dvi_load_dma_op(inst->dma_cfg, &inst->dma_list_error);
}
if (inst->scanline_callback && inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1)
{
if (inst->scanline_callback && inst->timing_state.v_ctr % DVI_VERTICAL_REPEAT == DVI_VERTICAL_REPEAT - 1) {
inst->scanline_callback(inst->timing_state.v_ctr / DVI_VERTICAL_REPEAT);
}
}
break;
case DVI_STATE_SYNC:
_dvi_load_dma_op(inst->dma_cfg, &inst->dma_list_vblank_sync);
dma_list_selected = &inst->dma_list_vblank_sync;
if (inst->timing_state.v_ctr == 0) {
++inst->dvi_frame_count;
}
break;
default:
_dvi_load_dma_op(inst->dma_cfg, &inst->dma_list_vblank_nosync);
break;
default: break;
}
_dvi_load_dma_op(inst->dma_cfg, dma_list_selected);
if (inst->data_island_is_enabled) {
dvi_update_data_packet(inst);

Wyświetl plik

@ -239,7 +239,6 @@ void __dvi_func(dvi_timing_state_advance)(const struct dvi_timing *t, struct dvi
(s->v_state == DVI_STATE_SYNC && s->v_ctr == t->v_sync_width) ||
(s->v_state == DVI_STATE_BACK_PORCH && s->v_ctr == t->v_back_porch) ||
(s->v_state == DVI_STATE_ACTIVE && s->v_ctr == t->v_active_lines)) {
s->v_state = (s->v_state + 1) % DVI_STATE_COUNT;
s->v_ctr = 0;
}
@ -302,19 +301,15 @@ void dvi_setup_scanline_for_vblank_with_audio(const struct dvi_timing *t, const
const uint32_t *sym_preamble_to_data12 = &dvi_ctrl_syms[1];
const uint32_t *data_packet0 = getDefaultDataPacket0(vsync, t->h_sync_polarity);
for (int i = 0; i < N_TMDS_LANES; ++i)
{
for (int i = 0; i < N_TMDS_LANES; ++i) {
dma_cb_t *cblist = dvi_lane_from_list(l, i);
if (i == TMDS_SYNC_LANE)
{
if (i == TMDS_SYNC_LANE) {
_set_data_cb(&cblist[0], &dma_cfg[i], sym_hsync_off, t->h_front_porch / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[1], &dma_cfg[i], data_packet0, N_DATA_ISLAND_WORDS, 0, false);
_set_data_cb(&cblist[2], &dma_cfg[i], sym_hsync_on, (t->h_sync_width - W_DATA_ISLAND) / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[3], &dma_cfg[i], sym_hsync_off, t->h_back_porch / DVI_SYMBOLS_PER_WORD, 2, true);
_set_data_cb(&cblist[4], &dma_cfg[i], sym_hsync_off, t->h_active_pixels / DVI_SYMBOLS_PER_WORD, 2, false);
}
else
{
} else {
_set_data_cb(&cblist[0], &dma_cfg[i], sym_no_sync, (t->h_front_porch - W_PREAMBLE) / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[1], &dma_cfg[i], sym_preamble_to_data12, W_PREAMBLE / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[2], &dma_cfg[i], getDefaultDataPacket12(), N_DATA_ISLAND_WORDS, 0, false);
@ -367,22 +362,18 @@ void dvi_setup_scanline_for_active_with_audio(const struct dvi_timing *t, const
const uint32_t *sym_preamble_to_video2 = &dvi_ctrl_syms[0];
const uint32_t *data_packet0 = getDefaultDataPacket0(!t->v_sync_polarity, t->h_sync_polarity);
for (int i = 0; i < N_TMDS_LANES; ++i)
{
for (int i = 0; i < N_TMDS_LANES; ++i) {
dma_cb_t *cblist = dvi_lane_from_list(l, i);
int active_block;
if (i == TMDS_SYNC_LANE)
{
if (i == TMDS_SYNC_LANE) {
_set_data_cb(&cblist[0], &dma_cfg[i], sym_hsync_off, t->h_front_porch / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[1], &dma_cfg[i], data_packet0, N_DATA_ISLAND_WORDS, 0, false);
_set_data_cb(&cblist[2], &dma_cfg[i], sym_hsync_on, (t->h_sync_width - W_DATA_ISLAND) / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[3], &dma_cfg[i], sym_hsync_off, (t->h_back_porch - W_GUARDBAND) / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[4], &dma_cfg[i], &video_gaurdband_syms[0], W_GUARDBAND / DVI_SYMBOLS_PER_WORD, 2, true);
active_block = 5;
}
else
{
} else {
_set_data_cb(&cblist[0], &dma_cfg[i], sym_no_sync, (t->h_front_porch - W_PREAMBLE) / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[1], &dma_cfg[i], sym_preamble_to_data12, W_PREAMBLE / DVI_SYMBOLS_PER_WORD, 2, false);
_set_data_cb(&cblist[2], &dma_cfg[i], getDefaultDataPacket12(), N_DATA_ISLAND_WORDS, 0, false);
@ -392,14 +383,11 @@ void dvi_setup_scanline_for_active_with_audio(const struct dvi_timing *t, const
active_block = 6;
}
if (tmdsbuf)
{
if (tmdsbuf) {
// Non-repeating DMA for the freshly-encoded TMDS buffer
_set_data_cb(&cblist[active_block], &dma_cfg[i], tmdsbuf + i * (t->h_active_pixels / DVI_SYMBOLS_PER_WORD),
t->h_active_pixels / DVI_SYMBOLS_PER_WORD, 0, false);
}
else
{
} else {
// Use read ring to repeat the correct DC-balanced symbol pair on blank scanlines (4 or 8 byte period)
_set_data_cb(&cblist[active_block], &dma_cfg[i], &(black ? black_scanline_tmds : empty_scanline_tmds)[2 * i / DVI_SYMBOLS_PER_WORD],
t->h_active_pixels / DVI_SYMBOLS_PER_WORD, DVI_SYMBOLS_PER_WORD == 2 ? 2 : 3, false);
@ -414,10 +402,11 @@ void __dvi_func(dvi_update_scanline_data_dma)(const struct dvi_timing *t, const
#else
const uint32_t *lane_tmdsbuf = tmdsbuf + i * t->h_active_pixels / DVI_SYMBOLS_PER_WORD;
#endif
if (i == TMDS_SYNC_LANE)
dvi_lane_from_list(l, i)[audio ? 5 : 3].read_addr = lane_tmdsbuf;
else
dvi_lane_from_list(l, i)[audio ? 6 : 1].read_addr = lane_tmdsbuf;
if (i == TMDS_SYNC_LANE) {
dvi_lane_from_list(l, i)[audio ? 5 : 3].read_addr = lane_tmdsbuf;
} else {
dvi_lane_from_list(l, i)[audio ? 6 : 1].read_addr = lane_tmdsbuf;
}
}
}