1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-25 22:09:35 +00:00
GLideN64/src/FrameBufferEmulationIssues.txt
2019-02-02 18:34:10 +07:00

112 lines
6.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Проблемы с эмуляцией фрейм буфера.
Zelda MM:
проверка на то, что содержимое буфера заполнено pBuffer->fillcolor обламывается на экране паузы.
Причина: Кадр копируется в буфер, который с начале отрисовки используется под depth buffer и чистится 0xfffcfffc.
Программа между вызовами dysplay list что-то сама пишет в этот буфер (выставляет alpha в 1), и на следующем кадре
проверка не срабатывает.
detect fb final results:
rdp.frame_buffers[0].status = ci_main, addr: 00000500, height: 0
rdp.frame_buffers[1].status = ci_zimg, addr: 00383ac0, height: 240
rdp.frame_buffers[2].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[3].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[4].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[5].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[6].status = ci_copy, addr: 00383ac0, height: 240
rdp.frame_buffers[7].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[8].status = ci_aux, addr: 00784600, height: 240
rdp.frame_buffers[9].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[10].status = ci_main, addr: 00000500, height: 240
DetectFrameBufferUsage End
detect fb final results:
rdp.frame_buffers[0].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[1].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[2].status = ci_main, addr: 00000500, height: 240
rdp.frame_buffers[3].status = ci_main, addr: 00000500, height: 240
DetectFrameBufferUsage End
Решение: проверять только 16бит буфер и без альфа бита.
Zelda OOT:
Та же проблема с экраном паузы, что в Zelda MM
К тому же экран не работает если включен subscreen fix!
Mario Tennis:
Scoreboard. Таблица счёта и датчик скорости подачи выглядят как чёрный фон с текстом.
Причина: текстуры таблицы и датчика грузятся в память. Текста в них нет, пустые области.
Мы видим эти текстуры при отключенной эмуляции буфера кадра. Когда нужно обновить текст,
игра заводит вспомогательный буфер кадра по адресу, где лежит текстура, и рендит текст в нужных местах.
Потом текстура с текстом накладывается на полигоны таблицы. Так как адрес буфера совпадает с адресом текстуры,
буфер используется вместо нее, а в нем только текст.
Решение: после отрисовки копировать содержимое буфера обратно в RDRAM. Нужно найти нормальное условие для
определения такого буфера. Пока адреса буферов захардкоданы.
F1 Pole Position:
Проблемы с фоном в меню. После титров запускается демо с 3D моделями. Используется буфер глубины.
Пре переходе снова к меню тектуры фона грузятся в область, которая использовалась под z буфер.
У буфера флаг cleared сброшен после записи z буфера в RDRAM, проверка валидности не находит проблем. и тектура
грузится из пустого буфера.
Решение: Depth copy to RDRAM записывает checksum записанных данных в буфер, соотвествующий буферу глубины.
Тогда в дальнейшем проверка по checksum удалит этот буфер.
Upd: Решение плохое. Ломает subscreen in Zelda OOT. Игра меняет область z буфера (выставляет alpha = 1) когда использует его как фон для
экрана паузы. Checksum не бъет. Решение - разделить опции hack_noDepthFrameBuffers и hack_blurPauseScreen
Для этой игры включить hack_noDepthFrameBuffers и просто убирать буфер глубины при попытке считать из него текстуру.
Mickey's Speedway USA:
pause screen работает так: в область текущего буфера глубины копируется буфер кадра, который в данный момент отображаетс я на экране.
Далее этот буфер размывается на уровне CPU и потом используется как текстура. Подобный механизм работает в Conker BFD.
Чтобы получить размытие нужно копировать буфер кадра в RDRAM, а в момент вызова паузы скопировать его (memcopy) в
буфер глубины в RDRAM. При этом нужно чтобы эта область не очистилась через gDPFillRDRAM при смене буфера.
Для починки отключил вызов gDPFillRDRAM если m_isDepthBuffer == true.
Jet Force Gemini:
Обнаружилась проблема с вспомогательным 8бит буфером для теней. Буфер создается отдельным display list'ом.
Буфер создается, очищается fillrect, стоит флаг cleared. После этого игра пишет пару байт в середине буфера, и
в следующем display list, где буфер используется, проверка по RDRAM не срабатывает.
Пришлось сделать проверку не строгой, а отсекать если количество ошибочных пикселов в буфере меньше порогового значения.
Пока сделал порог в 1%.
Pokemon Stadium 2:
Возникла проблема с портретами покемонов. Портреты создаются в вспомогательных буферах когда на экране отображается
меню выбора покемонов. В этот момент работает interlaced видео режим. Потом игра переключается в режим битвы,
и переключает видео режим в non-interlaced. При переключениии режимов все буферы сбрасывались и портреты терялись.
Пришлось сделать сброс только для полноэкранных буферов.
Pokemon Stadium:
Игра использует кучу вспомогательных буферов для отрисовки меню. При этом буфера могут иметь одинаковую ширину, но разную
высоту. И располагаться друг за другом. Код, который проверяет пересечение нового буфера с существующими и выбрасывает все
пересекающиеся буфера, в данном случае выкидывал большую часть буферов из за неверно проставленной высоты, а значит и
нижнего адреса буфера.
Пришлось править код коррекции высоты буфера, и вызывать метод поиска пересечений после коррекции.
Blast Corps:
Возникла проблема с depth image, которая приводила к остановке видео драйвера. Игра создавала вспомогательный depth image
для вспомогательного color image. Адрес вспомогательного depth image совпадал с адресом основного, но ширина ставилась такая же
как у вспомогательного color image. Из-за последовательности команд плагин не вовремя просекал изменение размеров depth image,
что приводило к установке неверного depth buffer для FBO и к краху драйвера.
Решение: При вызове setcolorimage, если color image == depth image, вызывать depthBufferList().saveBuffer, который
при необходимости пересоздаст depth buffer.
StarCraft:
Выяснял причину страшных глюков в LLE. Обнаружил прекрасное.
Игра выделяет текущий буфер кадра по адресу 0x00176540. Конец буфера 0x0019bd3f
Запускается BgCopy, которая рисует подложку на весь экран. Адрес 8 битной картинки для отрисовки 0x00189140
Т.е. картинка находится посреди буфера, который команда BgCopy должна заполнить этой картинкой.
Поскольку картинка 8 битная а буфер 16 битный, на консоли всё работает: читаем картинку из середины буфера и рисуем ее же в начале.
При отрисовке картинка конечно же затирается, но консоль читает и рисует ее по частям и затираемые данные на этот момент уже не нужны.
Плагину сносит крышу проверка на валидность буфера. В HLE CheckForFrameBufferTexture для задников не вызывается,
а _loadBGImage игнорирует попадание адреса картинки в буфер если картинка 8 битная.