Bite the bullet and flip the video buffer in software.

Until a better solution is found.

Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
Andrea Odetti 2020-12-12 19:27:28 +00:00
parent e461847a49
commit c2f4d8ed34
3 changed files with 28 additions and 4 deletions

View file

@ -91,7 +91,11 @@ See [sa2](source/frontends/sa2/README.md).
### ra2
There is an initial [libretro](https://docs.libretro.com/development/cores/developing-cores/) core, with minimal keyboard support and upside down video.
There is an initial [libretro](https://docs.libretro.com/development/cores/developing-cores/) core.
Keyboard works, but a lot of keys overlap with RetroArch shortcuts.
Video works, but the vertical flip is done in software.
Must be manually configured:
``cmake -DLIBRETRO_PATH=/path/to/libretro-common``

View file

@ -112,7 +112,10 @@ namespace
}
Game::Game() : mySpeed(true)
Game::Game()
: mySpeed(true)
, myWidth(GetFrameBufferWidth())
, myHeight(GetFrameBufferHeight())
{
EmulatorOptions options;
options.memclear = g_nMemoryClearType;
@ -125,6 +128,9 @@ Game::Game() : mySpeed(true)
InitializeRegistry(options);
initialiseEmulator();
const size_t size = myWidth * myHeight * sizeof(bgra_t);
myVideoBuffer.resize(size);
}
Game::~Game()
@ -270,8 +276,18 @@ void Game::processKeyUp(unsigned keycode, uint32_t character, uint16_t key_modif
void Game::drawVideoBuffer()
{
const size_t pitch = GetFrameBufferWidth() * 4;
video_cb(g_pFramebufferbits, GetFrameBufferWidth(), GetFrameBufferHeight(), pitch);
const size_t pitch = myWidth * sizeof(bgra_t);
// this should not be necessary
// either libretro handles it
// or we should change AW
// but for now, there is no alternative
for (size_t row = 0; row < myHeight; ++row)
{
const uint8_t * src = g_pFramebufferbits + row * pitch;
uint8_t * dst = myVideoBuffer.data() + (myHeight - row - 1) * pitch;
memcpy(dst, src, pitch);
}
video_cb(myVideoBuffer.data(), myWidth, myHeight, pitch);
}
bool Game::loadGame(const char * path)

View file

@ -20,7 +20,11 @@ public:
private:
Speed mySpeed; // fixed speed
const size_t myHeight;
const size_t myWidth;
static void processKeyDown(unsigned keycode, uint32_t character, uint16_t key_modifiers);
static void processKeyUp(unsigned keycode, uint32_t character, uint16_t key_modifiers);
std::vector<uint8_t> myVideoBuffer;
};