and3rson/lilka

APP_FLAG_FULLSCREEN ignored by panel

Closed this issue · 5 comments

Не зникає панель під час роботи додатків, в яких встановлено APP_FLAG_FULLSCREEN та НЕ встановлено APP_FLAG_INTERLACED, таких як NesApp, ModPlayerApp, AbstractLuaRunnerApp та інші. В результаті, вгорі екрана відображається панель, а додаток рендериться зміщеним на 24 пікселі вниз і верхні рядки 24...48 займають артефакти від накладання нижньої частини кадру додатка на верхню.

20241213_095905

Відчуваю, що це, можливо, якось пов'язано зі змінами щодо інтерлейсу. Якщо примусово малювати все через інтерлейс, то баг зникає в усіх додатках. Для цього я спробував замінити в файлі appmanager.cpp
lilka::display.drawCanvas(app->backCanvas);
на
lilka::display.drawCanvasInterlaced(app->backCanvas, app->frame % 2);

На жаль, докопатися до суті і пофіксити коректно моїх скромних знань не вистачило...

can't reproduce

screenshot_19700101_000013
screenshot_19700101_000125
screenshot_19700101_000121
screenshot_19700101_000122
screenshot_19700101_002036
screenshot_19700101_000043
screenshot_20241213_231501

can't reproduce

А скріншоти і у мене красиві. У фреймбуфері дані коректні. здається, а на екрані мерехтять 24-48 рядки і панель стирчить у повноекранних додатках (крім лілтрекера, до речі). Може якісь таймінги в залізі, чи глюки компілятора - хтозна, я не справжній програміст. Поки що вдалося некрасиво пофіксити, додавши у display.cpp ще одну функцію аналогічну тій що відмальовує інтерлейс:

void Display::drawCanvasBad(Canvas* canvas) {
this->startWrite();
for (int y = 0; y < canvas->height(); y ++ ) {
this->writeAddrWindow(canvas->x(), canvas->y() + y, canvas->width(), 1);
this->writePixels(canvas->getFramebuffer() + y * canvas->width(), canvas->width());
}
this->endWrite();
}

ну і в display.h:
void drawCanvasBad(Canvas* canvas);

Після чого в appmanager.cpp:
lilka::display.drawCanvas(app->backCanvas);
на
lilka::display.drawCanvasBad(app->backCanvas);

боюсь що єдина різниця наявності інтерлейсу та його відсутності полягає в тому що кадр малюється швидше за рахунок того що по суті малюється тільки пів кадру за раз

твої зміни не впливають на відображення панелі, по суті ти просто описав рівноцінну drawCanvas функцію відмальовування кадру

навіть якщо повністю прибрати перевірку на APP_FLAG_FULLSCREEN, topApp буде намальовано поверх, звісно ж невеликим артефактами там де не буде встигати, але ні в якому разі без мерехтіння на 24-48 рядку(панель займає рядки з 0 по 24, nofrendo відмальовує на весь екран, ніяких зміщень на 24 пікселя там немає)

Тим не менш, зі штатною функцією глюк є, з моїм костилем - немає. Не одразу помітив, що панель не відображається як звичайно, то просто "слід" від неї, на якому не йде годинник і нічого не міняється.

20241214_092405.mp4

Таке враження наче десь якась команда зміни координат губиться чи не встигає, а моя тормозна функція трохи все сповільнила. Пробував потикати в різні місця delay - не допомагає. Замовив другий дисплей, приїде - спробую з ним, може мені глючний попався.

Мені дико соромно, в мене був не найновіший зріз репозиторію. В останній прошивці все коректно.