From a6e89dd13279a661e12a5bb73053ff909d0963ad Mon Sep 17 00:00:00 2001 From: Vladimir Kononovich Date: Sat, 19 Dec 2020 23:31:01 +0300 Subject: [PATCH] Reformat Libretro (Resharper) --- Libretro/LibretroKeyManager.h | 42 +- Libretro/LibretroMessageManager.h | 14 +- Libretro/LibretroRenderer.h | 47 +- Libretro/LibretroSoundManager.h | 10 +- Libretro/libretro.cpp | 1364 +++++++------- Libretro/libretro.h | 2843 +++++++++++++++-------------- 6 files changed, 2244 insertions(+), 2076 deletions(-) diff --git a/Libretro/LibretroKeyManager.h b/Libretro/LibretroKeyManager.h index aad8964..9679b55 100644 --- a/Libretro/LibretroKeyManager.h +++ b/Libretro/LibretroKeyManager.h @@ -10,18 +10,22 @@ private: shared_ptr _console; retro_input_state_t _getInputState = nullptr; retro_input_poll_t _pollInput = nullptr; - bool _mouseButtons[3] = { false, false, false }; - bool _wasPushed[16] = { }; + bool _mouseButtons[3] = {false, false, false}; + bool _wasPushed[16] = {}; bool ProcessAction(uint32_t button) { - if(_getInputState(0, RETRO_DEVICE_JOYPAD, 0, button)) { - if(!_wasPushed[button]) { + if (_getInputState(0, RETRO_DEVICE_JOYPAD, 0, button)) + { + if (!_wasPushed[button]) + { //Newly pressed, process action _wasPushed[button] = true; return true; } - } else { + } + else + { _wasPushed[button] = false; } return false; @@ -52,11 +56,13 @@ public: // Inherited via IKeyManager virtual void RefreshState() override { - if(_pollInput) { + if (_pollInput) + { _pollInput(); } - if(_getInputState) { + if (_getInputState) + { int32_t x = _getInputState(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); int32_t y = _getInputState(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); @@ -68,18 +74,24 @@ public: int16_t dx = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); int16_t dy = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); KeyManager::SetMouseMovement(dx, dy); - - _mouseButtons[(int)MouseButton::LeftButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) != 0; - _mouseButtons[(int)MouseButton::RightButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT) != 0; - _mouseButtons[(int)MouseButton::MiddleButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE) != 0; + + _mouseButtons[(int)MouseButton::LeftButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, + RETRO_DEVICE_ID_MOUSE_LEFT) != 0; + _mouseButtons[(int)MouseButton::RightButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, + RETRO_DEVICE_ID_MOUSE_RIGHT) != 0; + _mouseButtons[(int)MouseButton::MiddleButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, + RETRO_DEVICE_ID_MOUSE_MIDDLE) != 0; } } virtual bool IsKeyPressed(uint32_t keyCode) override { - if(keyCode > 0 && _getInputState) { + if (keyCode > 0 && _getInputState) + { return _getInputState(keyCode >> 8, RETRO_DEVICE_JOYPAD, 0, (keyCode - 1) & 0xFF) != 0; - } else { + } + else + { return false; } } @@ -97,7 +109,7 @@ public: { return vector(); } - + virtual string GetKeyName(uint32_t keyCode) override { return string(); @@ -119,4 +131,4 @@ public: virtual void SetDisabled(bool disabled) override { } -}; \ No newline at end of file +}; diff --git a/Libretro/LibretroMessageManager.h b/Libretro/LibretroMessageManager.h index 423fee7..d360f86 100644 --- a/Libretro/LibretroMessageManager.h +++ b/Libretro/LibretroMessageManager.h @@ -25,14 +25,18 @@ public: // Inherited via IMessageManager virtual void DisplayMessage(string title, string message) override { - if(title.empty()) { - if(_log) { + if (title.empty()) + { + if (_log) + { _log(RETRO_LOG_INFO, message.c_str()); } - } else { + } + else + { string osdMessage = "[" + title + "] " + message; - retro_message msg = { osdMessage.c_str(), 180 }; + retro_message msg = {osdMessage.c_str(), 180}; _retroEnv(RETRO_ENVIRONMENT_SET_MESSAGE, &msg); } } -}; \ No newline at end of file +}; diff --git a/Libretro/LibretroRenderer.h b/Libretro/LibretroRenderer.h index 9ad0c58..f47f41b 100644 --- a/Libretro/LibretroRenderer.h +++ b/Libretro/LibretroRenderer.h @@ -30,18 +30,20 @@ public: } // Inherited via IRenderingDevice - virtual void UpdateFrame(void *frameBuffer, uint32_t width, uint32_t height) override + virtual void UpdateFrame(void* frameBuffer, uint32_t width, uint32_t height) override { - if(!_skipMode && _sendFrame) { + if (!_skipMode && _sendFrame) + { //Use Blargg's NTSC filter's max size as a minimum resolution, to prevent changing resolution too often int32_t newWidth = std::max(width, SNES_NTSC_OUT_WIDTH(256)); int32_t newHeight = std::max(height, 239 * 2); - if(_retroEnv != nullptr && (_previousWidth != newWidth || _previousHeight != newHeight)) { + if (_retroEnv != nullptr && (_previousWidth != newWidth || _previousHeight != newHeight)) + { //Resolution change is needed retro_system_av_info avInfo = {}; GetSystemAudioVideoInfo(avInfo, newWidth, newHeight); _retroEnv(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &avInfo); - + _previousWidth = newWidth; _previousHeight = newHeight; } @@ -49,12 +51,14 @@ public: _sendFrame(frameBuffer, width, height, sizeof(uint32_t) * width); } } - - void GetSystemAudioVideoInfo(retro_system_av_info &info, int32_t maxWidth = 0, int32_t maxHeight = 0) + + void GetSystemAudioVideoInfo(retro_system_av_info& info, int32_t maxWidth = 0, int32_t maxHeight = 0) { AudioConfig audio = _console->GetSettings()->GetAudioConfig(); - - info.timing.fps = _console->GetRegion() == ConsoleRegion::Ntsc ? 60.098811862348404716732985230828 : 50.006977968268290848936010226333; + + info.timing.fps = _console->GetRegion() == ConsoleRegion::Ntsc + ? 60.098811862348404716732985230828 + : 50.006977968268290848936010226333; info.timing.sample_rate = audio.SampleRate; OverscanDimensions overscan = _console->GetSettings()->GetOverscan(); @@ -62,15 +66,22 @@ public: int height = (239 - overscan.Top - overscan.Bottom); double aspectRatio = _console->GetSettings()->GetAspectRatio(_console->GetRegion()); - if(aspectRatio != 0.0) { + if (aspectRatio != 0.0) + { VideoAspectRatio aspect = _console->GetSettings()->GetVideoConfig().AspectRatio; - bool usePar = aspect == VideoAspectRatio::NTSC || aspect == VideoAspectRatio::PAL || aspect == VideoAspectRatio::Auto; - if(usePar) { + bool usePar = aspect == VideoAspectRatio::NTSC || aspect == VideoAspectRatio::PAL || aspect == + VideoAspectRatio::Auto; + if (usePar) + { info.geometry.aspect_ratio = (float)(width * aspectRatio / height); - } else { + } + else + { info.geometry.aspect_ratio = (float)aspectRatio; } - } else { + } + else + { info.geometry.aspect_ratio = (float)width / height; } @@ -80,7 +91,8 @@ public: info.geometry.max_width = maxWidth; info.geometry.max_height = maxHeight; - if(maxHeight > 0 && maxWidth > 0) { + if (maxHeight > 0 && maxWidth > 0) + { _previousWidth = maxWidth; _previousHeight = maxHeight; } @@ -95,7 +107,7 @@ public: { _skipMode = skip; } - + virtual void Render() override { } @@ -104,7 +116,8 @@ public: { } - virtual void SetFullscreenMode(bool fullscreen, void *windowHandle, uint32_t monitorWidth, uint32_t monitorHeight) override + virtual void SetFullscreenMode(bool fullscreen, void* windowHandle, uint32_t monitorWidth, + uint32_t monitorHeight) override { } -}; \ No newline at end of file +}; diff --git a/Libretro/LibretroSoundManager.h b/Libretro/LibretroSoundManager.h index 269c887..1b3498d 100644 --- a/Libretro/LibretroSoundManager.h +++ b/Libretro/LibretroSoundManager.h @@ -23,11 +23,13 @@ public: } // Inherited via IAudioDevice - virtual void PlayBuffer(int16_t *soundBuffer, uint32_t sampleCount, uint32_t sampleRate, bool isStereo) override + virtual void PlayBuffer(int16_t* soundBuffer, uint32_t sampleCount, uint32_t sampleRate, bool isStereo) override { - if(!_skipMode && _sendAudioSample) { - for(uint32_t total = 0; total < sampleCount; ) { - total += (uint32_t)_sendAudioSample(soundBuffer + total*2, (size_t)(sampleCount - total)); + if (!_skipMode && _sendAudioSample) + { + for (uint32_t total = 0; total < sampleCount;) + { + total += (uint32_t)_sendAudioSample(soundBuffer + total * 2, (size_t)(sampleCount - total)); } } } diff --git a/Libretro/libretro.cpp b/Libretro/libretro.cpp index ae78824..7da5399 100644 --- a/Libretro/libretro.cpp +++ b/Libretro/libretro.cpp @@ -30,7 +30,7 @@ static retro_log_printf_t logCallback = nullptr; static retro_environment_t retroEnv = nullptr; -static unsigned _inputDevices[5] = { DEVICE_GAMEPAD, DEVICE_GAMEPAD, DEVICE_NONE, DEVICE_NONE, DEVICE_NONE }; +static unsigned _inputDevices[5] = {DEVICE_GAMEPAD, DEVICE_GAMEPAD, DEVICE_NONE, DEVICE_NONE, DEVICE_NONE}; static string _mesenVersion = ""; static int32_t _saveStateSize = -1; @@ -55,709 +55,841 @@ static constexpr const char* MesenGbModel = "mesen-s_gbmodel"; static constexpr const char* MesenGbSgb2 = "mesen-s_sgb2"; extern "C" { - void logMessage(retro_log_level level, const char* message) +void logMessage(retro_log_level level, const char* message) +{ + if (logCallback) { - if(logCallback) { - logCallback(level, message); + logCallback(level, message); + } +} + +RETRO_API unsigned retro_api_version() +{ + return RETRO_API_VERSION; +} + +RETRO_API void retro_init() +{ + struct retro_log_callback log; + if (retroEnv(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) + { + logCallback = log.log; + } + else + { + logCallback = nullptr; + } + + _console.reset(new Console()); + _console->Initialize(); + KeyManager::SetSettings(_console->GetSettings().get()); + + _renderer.reset(new LibretroRenderer(_console, retroEnv)); + _soundManager.reset(new LibretroSoundManager(_console)); + _keyManager.reset(new LibretroKeyManager(_console)); + _messageManager.reset(new LibretroMessageManager(logCallback, retroEnv)); + + AudioConfig audioConfig = _console->GetSettings()->GetAudioConfig(); + audioConfig.DisableDynamicSampleRate = true; + audioConfig.SampleRate = Spc::SpcSampleRate; + _console->GetSettings()->SetAudioConfig(audioConfig); + + PreferencesConfig preferences = _console->GetSettings()->GetPreferences(); + preferences.DisableOsd = true; + preferences.RewindBufferSize = 0; + _console->GetSettings()->SetPreferences(preferences); +} + +RETRO_API void retro_deinit() +{ + _renderer.reset(); + _soundManager.reset(); + _keyManager.reset(); + _messageManager.reset(); + + //_console->SaveBatteries(); + _console->Release(); + _console.reset(); +} + +RETRO_API void retro_set_environment(retro_environment_t env) +{ + retroEnv = env; + + static constexpr struct retro_variable vars[] = { + {MesenNtscFilter, "NTSC filter; Disabled|Composite (Blargg)|S-Video (Blargg)|RGB (Blargg)|Monochrome (Blargg)"}, + {MesenRegion, "Region; Auto|NTSC|PAL"}, + {MesenGbModel, "Game Boy Model; Auto|Game Boy|Game Boy Color|Super Game Boy"}, + {MesenGbSgb2, "Use SGB2; enabled|disabled"}, + {MesenOverscanVertical, "Vertical Overscan; None|8px|16px"}, + {MesenOverscanHorizontal, "Horizontal Overscan; None|8px|16px"}, + {MesenAspectRatio, "Aspect Ratio; Auto|No Stretching|NTSC|PAL|4:3|16:9"}, + {MesenBlendHighRes, "Blend Hi-Res Modes; disabled|enabled"}, + {MesenCubicInterpolation, "Cubic Interpolation (Audio); disabled|enabled"}, + {MesenOverclock, "Overclock; None|Low|Medium|High|Very High"}, + {MesenOverclockType, "Overclock Type; Before NMI|After NMI"}, + {MesenSuperFxOverclock, "Super FX Clock Speed; 100%|200%|300%|400%|500%|1000%"}, + {MesenRamState, "Default power-on state for RAM; Random Values (Default)|All 0s|All 1s"}, + {NULL, NULL}, + }; + + static constexpr struct retro_controller_description pads1[] = { + {"None", DEVICE_NONE}, + {"SNES Controller", DEVICE_GAMEPAD}, + {"SNES Mouse", DEVICE_SNESMOUSE}, + {NULL, 0}, + }; + + static constexpr struct retro_controller_description pads2[] = { + {"None", DEVICE_NONE}, + {"SNES Controller", DEVICE_GAMEPAD}, + {"SNES Mouse", DEVICE_SNESMOUSE}, + {"Super Scope", DEVICE_SUPERSCOPE}, + {"Multitap", DEVICE_MULTITAP}, + {NULL, 0}, + }; + + static constexpr struct retro_controller_description pads3[] = { + {"SNES Controller", DEVICE_GAMEPAD}, + {NULL, 0}, + }; + + static constexpr struct retro_controller_description pads4[] = { + {"SNES Controller", DEVICE_GAMEPAD}, + {NULL, 0}, + }; + + static constexpr struct retro_controller_description pads5[] = { + {"SNES Controller", DEVICE_GAMEPAD}, + {NULL, 0}, + }; + + static constexpr struct retro_controller_info ports[] = { + {pads1, 3}, + {pads2, 5}, + {pads3, 1}, + {pads4, 1}, + {pads5, 1}, + {0}, + }; + + retroEnv(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars); + retroEnv(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); +} + +RETRO_API void retro_set_video_refresh(retro_video_refresh_t sendFrame) +{ + _renderer->SetVideoCallback(sendFrame); +} + +RETRO_API void retro_set_audio_sample(retro_audio_sample_t sendAudioSample) +{ +} + +RETRO_API void retro_set_audio_sample_batch(retro_audio_sample_batch_t audioSampleBatch) +{ + _soundManager->SetSendAudioSample(audioSampleBatch); +} + +RETRO_API void retro_set_input_poll(retro_input_poll_t pollInput) +{ + _keyManager->SetPollInput(pollInput); +} + +RETRO_API void retro_set_input_state(retro_input_state_t getInputState) +{ + _keyManager->SetGetInputState(getInputState); +} + +RETRO_API void retro_reset() +{ + _console->Reset(); +} + +bool readVariable(const char* key, retro_variable& var) +{ + var.key = key; + var.value = nullptr; + if (retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value != nullptr) + { + return true; + } + return false; +} + +void update_settings() +{ + struct retro_variable var = {}; + shared_ptr settings = _console->GetSettings(); + VideoConfig video = settings->GetVideoConfig(); + AudioConfig audio = settings->GetAudioConfig(); + EmulationConfig emulation = settings->GetEmulationConfig(); + GameboyConfig gbConfig = settings->GetGameboyConfig(); + InputConfig input = settings->GetInputConfig(); + video.Brightness = 0; + video.Contrast = 0; + video.Hue = 0; + video.Saturation = 0; + video.ScanlineIntensity = 0; + + if (readVariable(MesenNtscFilter, var)) + { + string value = string(var.value); + if (value == "Disabled") + { + video.VideoFilter = VideoFilterType::None; + } + else if (value == "Composite (Blargg)") + { + video.VideoFilter = VideoFilterType::NTSC; + video.NtscArtifacts = 0; + video.NtscBleed = 0; + video.NtscFringing = 0; + video.NtscGamma = 0; + video.NtscResolution = 0; + video.NtscSharpness = 0; + video.NtscMergeFields = false; + } + else if (value == "S-Video (Blargg)") + { + video.VideoFilter = VideoFilterType::NTSC; + video.NtscArtifacts = -1.0; + video.NtscBleed = 0; + video.NtscFringing = -1.0; + video.NtscGamma = 0; + video.NtscResolution = 0.2; + video.NtscSharpness = 0.2; + video.NtscMergeFields = false; + } + else if (value == "RGB (Blargg)") + { + video.VideoFilter = VideoFilterType::NTSC; + video.NtscArtifacts = -1.0; + video.NtscBleed = -1.0; + video.NtscFringing = -1.0; + video.NtscGamma = 0; + video.NtscResolution = 0.7; + video.NtscSharpness = 0.2; + video.NtscMergeFields = false; + } + else if (value == "Monochrome (Blargg)") + { + video.VideoFilter = VideoFilterType::NTSC; + video.Saturation = -1.0; + video.NtscArtifacts = -0.2; + video.NtscBleed = -1.0; + video.NtscFringing = -0.2; + video.NtscGamma = 0; + video.NtscResolution = 0.2; + video.NtscSharpness = 0.2; + video.NtscMergeFields = false; } } - RETRO_API unsigned retro_api_version() + bool beforeNmi = true; + if (readVariable(MesenOverclockType, var)) { - return RETRO_API_VERSION; + string value = string(var.value); + if (value == "After NMI") + { + beforeNmi = false; + } } - RETRO_API void retro_init() + if (readVariable(MesenOverclock, var)) { - struct retro_log_callback log; - if(retroEnv(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) { - logCallback = log.log; - } else { - logCallback = nullptr; + string value = string(var.value); + int lineCount = 0; + if (value == "None") + { + lineCount = 0; + } + else if (value == "Low") + { + lineCount = 100; + } + else if (value == "Medium") + { + lineCount = 250; + } + else if (value == "High") + { + lineCount = 500; + } + else if (value == "Very High") + { + lineCount = 1000; } - _console.reset(new Console()); - _console->Initialize(); - KeyManager::SetSettings(_console->GetSettings().get()); - - _renderer.reset(new LibretroRenderer(_console, retroEnv)); - _soundManager.reset(new LibretroSoundManager(_console)); - _keyManager.reset(new LibretroKeyManager(_console)); - _messageManager.reset(new LibretroMessageManager(logCallback, retroEnv)); - - AudioConfig audioConfig = _console->GetSettings()->GetAudioConfig(); - audioConfig.DisableDynamicSampleRate = true; - audioConfig.SampleRate = Spc::SpcSampleRate; - _console->GetSettings()->SetAudioConfig(audioConfig); - - PreferencesConfig preferences = _console->GetSettings()->GetPreferences(); - preferences.DisableOsd = true; - preferences.RewindBufferSize = 0; - _console->GetSettings()->SetPreferences(preferences); + if (beforeNmi) + { + emulation.PpuExtraScanlinesBeforeNmi = lineCount; + emulation.PpuExtraScanlinesAfterNmi = 0; + } + else + { + emulation.PpuExtraScanlinesAfterNmi = lineCount; + emulation.PpuExtraScanlinesBeforeNmi = 0; + } } - RETRO_API void retro_deinit() + emulation.GsuClockSpeed = 100; + if (readVariable(MesenSuperFxOverclock, var)) { - _renderer.reset(); - _soundManager.reset(); - _keyManager.reset(); - _messageManager.reset(); - - //_console->SaveBatteries(); - _console->Release(); - _console.reset(); + string value = string(var.value); + if (value == "100%") + { + emulation.GsuClockSpeed = 100; + } + else if (value == "200%") + { + emulation.GsuClockSpeed = 200; + } + else if (value == "300%") + { + emulation.GsuClockSpeed = 300; + } + else if (value == "400%") + { + emulation.GsuClockSpeed = 400; + } + else if (value == "500%") + { + emulation.GsuClockSpeed = 500; + } + else if (value == "1000%") + { + emulation.GsuClockSpeed = 1000; + } } - RETRO_API void retro_set_environment(retro_environment_t env) + int overscanHorizontal = 0; + int overscanVertical = 0; + if (readVariable(MesenOverscanHorizontal, var)) { - retroEnv = env; - - static constexpr struct retro_variable vars[] = { - { MesenNtscFilter, "NTSC filter; Disabled|Composite (Blargg)|S-Video (Blargg)|RGB (Blargg)|Monochrome (Blargg)" }, - { MesenRegion, "Region; Auto|NTSC|PAL" }, - { MesenGbModel, "Game Boy Model; Auto|Game Boy|Game Boy Color|Super Game Boy" }, - { MesenGbSgb2, "Use SGB2; enabled|disabled" }, - { MesenOverscanVertical, "Vertical Overscan; None|8px|16px" }, - { MesenOverscanHorizontal, "Horizontal Overscan; None|8px|16px" }, - { MesenAspectRatio, "Aspect Ratio; Auto|No Stretching|NTSC|PAL|4:3|16:9" }, - { MesenBlendHighRes, "Blend Hi-Res Modes; disabled|enabled" }, - { MesenCubicInterpolation, "Cubic Interpolation (Audio); disabled|enabled" }, - { MesenOverclock, "Overclock; None|Low|Medium|High|Very High" }, - { MesenOverclockType, "Overclock Type; Before NMI|After NMI" }, - { MesenSuperFxOverclock, "Super FX Clock Speed; 100%|200%|300%|400%|500%|1000%" }, - { MesenRamState, "Default power-on state for RAM; Random Values (Default)|All 0s|All 1s" }, - { NULL, NULL }, - }; - - static constexpr struct retro_controller_description pads1[] = { - { "None", DEVICE_NONE }, - { "SNES Controller", DEVICE_GAMEPAD }, - { "SNES Mouse", DEVICE_SNESMOUSE }, - { NULL, 0 }, - }; - - static constexpr struct retro_controller_description pads2[] = { - { "None", DEVICE_NONE }, - { "SNES Controller", DEVICE_GAMEPAD }, - { "SNES Mouse", DEVICE_SNESMOUSE }, - { "Super Scope", DEVICE_SUPERSCOPE }, - { "Multitap", DEVICE_MULTITAP }, - { NULL, 0 }, - }; - - static constexpr struct retro_controller_description pads3[] = { - { "SNES Controller", DEVICE_GAMEPAD }, - { NULL, 0 }, - }; - - static constexpr struct retro_controller_description pads4[] = { - { "SNES Controller", DEVICE_GAMEPAD }, - { NULL, 0 }, - }; - - static constexpr struct retro_controller_description pads5[] = { - { "SNES Controller", DEVICE_GAMEPAD }, - { NULL, 0 }, - }; - - static constexpr struct retro_controller_info ports[] = { - { pads1, 3 }, - { pads2, 5 }, - { pads3, 1 }, - { pads4, 1 }, - { pads5, 1 }, - { 0 }, - }; - - retroEnv(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars); - retroEnv(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); + string value = string(var.value); + if (value == "8px") + { + overscanHorizontal = 8; + } + else if (value == "16px") + { + overscanHorizontal = 16; + } } - RETRO_API void retro_set_video_refresh(retro_video_refresh_t sendFrame) + if (readVariable(MesenOverscanVertical, var)) { - _renderer->SetVideoCallback(sendFrame); + string value = string(var.value); + if (value == "8px") + { + overscanVertical = 8; + } + else if (value == "16px") + { + overscanVertical = 16; + } } - RETRO_API void retro_set_audio_sample(retro_audio_sample_t sendAudioSample) + video.OverscanLeft = overscanHorizontal; + video.OverscanRight = overscanHorizontal; + video.OverscanTop = std::max(0, overscanVertical - 1); + video.OverscanBottom = overscanVertical; + + if (readVariable(MesenAspectRatio, var)) { + string value = string(var.value); + if (value == "Auto") + { + video.AspectRatio = VideoAspectRatio::Auto; + } + else if (value == "No Stretching") + { + video.AspectRatio = VideoAspectRatio::NoStretching; + } + else if (value == "NTSC") + { + video.AspectRatio = VideoAspectRatio::NTSC; + } + else if (value == "PAL") + { + video.AspectRatio = VideoAspectRatio::PAL; + } + else if (value == "4:3") + { + video.AspectRatio = VideoAspectRatio::Standard; + } + else if (value == "16:9") + { + video.AspectRatio = VideoAspectRatio::Widescreen; + } } - RETRO_API void retro_set_audio_sample_batch(retro_audio_sample_batch_t audioSampleBatch) + if (readVariable(MesenRegion, var)) { - _soundManager->SetSendAudioSample(audioSampleBatch); + string value = string(var.value); + if (value == "Auto") + { + emulation.Region = ConsoleRegion::Auto; + } + else if (value == "NTSC") + { + emulation.Region = ConsoleRegion::Ntsc; + } + else if (value == "PAL") + { + emulation.Region = ConsoleRegion::Pal; + } } - RETRO_API void retro_set_input_poll(retro_input_poll_t pollInput) - { - _keyManager->SetPollInput(pollInput); + if (readVariable(MesenRamState, var)) + { + string value = string(var.value); + if (value == "Random Values (Default)") + { + emulation.RamPowerOnState = RamState::Random; + } + else if (value == "All 0s") + { + emulation.RamPowerOnState = RamState::AllZeros; + } + else if (value == "All 1s") + { + emulation.RamPowerOnState = RamState::AllOnes; + } } - RETRO_API void retro_set_input_state(retro_input_state_t getInputState) + if (readVariable(MesenBlendHighRes, var)) { - _keyManager->SetGetInputState(getInputState); + string value = string(var.value); + video.BlendHighResolutionModes = (value == "enabled"); } - RETRO_API void retro_reset() + if (readVariable(MesenCubicInterpolation, var)) { - _console->Reset(); + string value = string(var.value); + audio.EnableCubicInterpolation = (value == "enabled"); } - bool readVariable(const char* key, retro_variable &var) + if (readVariable(MesenGbModel, var)) { - var.key = key; - var.value = nullptr; - if(retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value != nullptr) { - return true; + string value = string(var.value); + if (value == "Game Boy") + { + gbConfig.Model = GameboyModel::Gameboy; + } + else if (value == "Game Boy Color") + { + gbConfig.Model = GameboyModel::GameboyColor; + } + else if (value == "Super Game Boy") + { + gbConfig.Model = GameboyModel::SuperGameboy; + } + else + { + gbConfig.Model = GameboyModel::Auto; } - return false; } - void update_settings() + if (readVariable(MesenGbSgb2, var)) { - struct retro_variable var = { }; - shared_ptr settings = _console->GetSettings(); - VideoConfig video = settings->GetVideoConfig(); - AudioConfig audio = settings->GetAudioConfig(); - EmulationConfig emulation = settings->GetEmulationConfig(); - GameboyConfig gbConfig = settings->GetGameboyConfig(); - InputConfig input = settings->GetInputConfig(); - video.Brightness = 0; - video.Contrast = 0; - video.Hue = 0; - video.Saturation = 0; - video.ScanlineIntensity = 0; + string value = string(var.value); + gbConfig.UseSgb2 = (value == "enabled"); + } - if(readVariable(MesenNtscFilter, var)) { - string value = string(var.value); - if(value == "Disabled") { - video.VideoFilter = VideoFilterType::None; - } else if(value == "Composite (Blargg)") { - video.VideoFilter = VideoFilterType::NTSC; - video.NtscArtifacts = 0; - video.NtscBleed = 0; - video.NtscFringing = 0; - video.NtscGamma = 0; - video.NtscResolution = 0; - video.NtscSharpness = 0; - video.NtscMergeFields = false; - } else if(value == "S-Video (Blargg)") { - video.VideoFilter = VideoFilterType::NTSC; - video.NtscArtifacts = -1.0; - video.NtscBleed = 0; - video.NtscFringing = -1.0; - video.NtscGamma = 0; - video.NtscResolution = 0.2; - video.NtscSharpness = 0.2; - video.NtscMergeFields = false; - } else if(value == "RGB (Blargg)") { - video.VideoFilter = VideoFilterType::NTSC; - video.NtscArtifacts = -1.0; - video.NtscBleed = -1.0; - video.NtscFringing = -1.0; - video.NtscGamma = 0; - video.NtscResolution = 0.7; - video.NtscSharpness = 0.2; - video.NtscMergeFields = false; - } else if(value == "Monochrome (Blargg)") { - video.VideoFilter = VideoFilterType::NTSC; - video.Saturation = -1.0; - video.NtscArtifacts = -0.2; - video.NtscBleed = -1.0; - video.NtscFringing = -0.2; - video.NtscGamma = 0; - video.NtscResolution = 0.2; - video.NtscSharpness = 0.2; - video.NtscMergeFields = false; - } - } + auto getKeyCode = [=](int port, int retroKey) + { + return (port << 8) | (retroKey + 1); + }; - bool beforeNmi = true; - if(readVariable(MesenOverclockType, var)) { - string value = string(var.value); - if(value == "After NMI") { - beforeNmi = false; - } - } + auto getKeyBindings = [=](int port) + { + KeyMappingSet keyMappings; + keyMappings.TurboSpeed = 0; + keyMappings.Mapping1.L = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_L); + keyMappings.Mapping1.R = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_R); + keyMappings.Mapping1.A = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_A); + keyMappings.Mapping1.B = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_B); + keyMappings.Mapping1.X = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_X); + keyMappings.Mapping1.Y = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_Y); - if(readVariable(MesenOverclock, var)) { - string value = string(var.value); - int lineCount = 0; - if(value == "None") { - lineCount = 0; - } else if(value == "Low") { - lineCount = 100; - } else if(value == "Medium") { - lineCount = 250; - } else if(value == "High") { - lineCount = 500; - } else if(value == "Very High") { - lineCount = 1000; - } + keyMappings.Mapping1.Start = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_START); + keyMappings.Mapping1.Select = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_SELECT); - if(beforeNmi) { - emulation.PpuExtraScanlinesBeforeNmi = lineCount; - emulation.PpuExtraScanlinesAfterNmi = 0; - } else { - emulation.PpuExtraScanlinesAfterNmi = lineCount; - emulation.PpuExtraScanlinesBeforeNmi = 0; - } - } + keyMappings.Mapping1.Up = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_UP); + keyMappings.Mapping1.Down = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_DOWN); + keyMappings.Mapping1.Left = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_LEFT); + keyMappings.Mapping1.Right = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_RIGHT); - emulation.GsuClockSpeed = 100; - if(readVariable(MesenSuperFxOverclock, var)) { - string value = string(var.value); - if(value == "100%") { - emulation.GsuClockSpeed = 100; - } else if(value == "200%") { - emulation.GsuClockSpeed = 200; - } else if(value == "300%") { - emulation.GsuClockSpeed = 300; - } else if(value == "400%") { - emulation.GsuClockSpeed = 400; - } else if(value == "500%") { - emulation.GsuClockSpeed = 500; - } else if(value == "1000%") { - emulation.GsuClockSpeed = 1000; - } - } + return keyMappings; + }; - int overscanHorizontal = 0; - int overscanVertical = 0; - if(readVariable(MesenOverscanHorizontal, var)) { - string value = string(var.value); - if(value == "8px") { - overscanHorizontal = 8; - } else if(value == "16px") { - overscanHorizontal = 16; - } - } + input.Controllers[0].Keys = getKeyBindings(0); + input.Controllers[1].Keys = getKeyBindings(1); + input.Controllers[2].Keys = getKeyBindings(2); + input.Controllers[3].Keys = getKeyBindings(3); - if(readVariable(MesenOverscanVertical, var)) { - string value = string(var.value); - if(value == "8px") { - overscanVertical = 8; - } else if(value == "16px") { - overscanVertical = 16; - } - } - - video.OverscanLeft = overscanHorizontal; - video.OverscanRight = overscanHorizontal; - video.OverscanTop = std::max(0, overscanVertical - 1); - video.OverscanBottom = overscanVertical; + settings->SetVideoConfig(video); + settings->SetEmulationConfig(emulation); + settings->SetInputConfig(input); + settings->SetAudioConfig(audio); + settings->SetGameboyConfig(gbConfig); - if(readVariable(MesenAspectRatio, var)) { - string value = string(var.value); - if(value == "Auto") { - video.AspectRatio = VideoAspectRatio::Auto; - } else if(value == "No Stretching") { - video.AspectRatio = VideoAspectRatio::NoStretching; - } else if(value == "NTSC") { - video.AspectRatio = VideoAspectRatio::NTSC; - } else if(value == "PAL") { - video.AspectRatio = VideoAspectRatio::PAL; - } else if(value == "4:3") { - video.AspectRatio = VideoAspectRatio::Standard; - } else if(value == "16:9") { - video.AspectRatio = VideoAspectRatio::Widescreen; - } - } + retro_system_av_info avInfo = {}; + _renderer->GetSystemAudioVideoInfo(avInfo); + retroEnv(RETRO_ENVIRONMENT_SET_GEOMETRY, &avInfo); +} - if(readVariable(MesenRegion, var)) { - string value = string(var.value); - if(value == "Auto") { - emulation.Region = ConsoleRegion::Auto; - } else if(value == "NTSC") { - emulation.Region = ConsoleRegion::Ntsc; - } else if(value == "PAL") { - emulation.Region = ConsoleRegion::Pal; - } - } +RETRO_API void retro_run() +{ + bool updated = false; + if (retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) + { + update_settings(); + } - if(readVariable(MesenRamState, var)) { - string value = string(var.value); - if(value == "Random Values (Default)") { - emulation.RamPowerOnState = RamState::Random; - } else if(value == "All 0s") { - emulation.RamPowerOnState = RamState::AllZeros; - } else if(value == "All 1s") { - emulation.RamPowerOnState = RamState::AllOnes; - } - } + bool isFastForward = false; + EmulationConfig cfg = _console->GetSettings()->GetEmulationConfig(); + if (retroEnv(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForward) && isFastForward) + { + //Allow core to skip frame rendering during fast forwarding + cfg.EmulationSpeed = 0; + } + else + { + cfg.EmulationSpeed = 100; + } + _console->GetSettings()->SetEmulationConfig(cfg); - if(readVariable(MesenBlendHighRes, var)) { - string value = string(var.value); - video.BlendHighResolutionModes = (value == "enabled"); - } - - if(readVariable(MesenCubicInterpolation, var)) { - string value = string(var.value); - audio.EnableCubicInterpolation = (value == "enabled"); - } - - if(readVariable(MesenGbModel, var)) { - string value = string(var.value); - if(value == "Game Boy") { - gbConfig.Model = GameboyModel::Gameboy; - } else if(value == "Game Boy Color") { - gbConfig.Model = GameboyModel::GameboyColor; - } else if(value == "Super Game Boy") { - gbConfig.Model = GameboyModel::SuperGameboy; - } else { - gbConfig.Model = GameboyModel::Auto; - } - } - - if(readVariable(MesenGbSgb2, var)) { - string value = string(var.value); - gbConfig.UseSgb2 = (value == "enabled"); - } - - auto getKeyCode = [=](int port, int retroKey) { - return (port << 8) | (retroKey + 1); - }; - - auto getKeyBindings = [=](int port) { - KeyMappingSet keyMappings; - keyMappings.TurboSpeed = 0; - keyMappings.Mapping1.L = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_L); - keyMappings.Mapping1.R = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_R); - keyMappings.Mapping1.A = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_A); - keyMappings.Mapping1.B = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_B); - keyMappings.Mapping1.X = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_X); - keyMappings.Mapping1.Y = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_Y); - - keyMappings.Mapping1.Start = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_START); - keyMappings.Mapping1.Select = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_SELECT); - - keyMappings.Mapping1.Up = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_UP); - keyMappings.Mapping1.Down = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_DOWN); - keyMappings.Mapping1.Left = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_LEFT); - keyMappings.Mapping1.Right = getKeyCode(port, RETRO_DEVICE_ID_JOYPAD_RIGHT); - - return keyMappings; - }; - - input.Controllers[0].Keys = getKeyBindings(0); - input.Controllers[1].Keys = getKeyBindings(1); - input.Controllers[2].Keys = getKeyBindings(2); - input.Controllers[3].Keys = getKeyBindings(3); - - settings->SetVideoConfig(video); - settings->SetEmulationConfig(emulation); - settings->SetInputConfig(input); - settings->SetAudioConfig(audio); - settings->SetGameboyConfig(gbConfig); + _console->RunSingleFrame(); + if (updated) + { + //Update geometry after running the frame, in case the console's region changed (affects "auto" aspect ratio) retro_system_av_info avInfo = {}; _renderer->GetSystemAudioVideoInfo(avInfo); retroEnv(RETRO_ENVIRONMENT_SET_GEOMETRY, &avInfo); } +} - RETRO_API void retro_run() +RETRO_API size_t retro_serialize_size() +{ + return _saveStateSize; +} + +RETRO_API bool retro_serialize(void* data, size_t size) +{ + std::stringstream ss; + _console->GetSaveStateManager()->SaveState(ss); + + string saveStateData = ss.str(); + memset(data, 0, size); + memcpy(data, saveStateData.c_str(), std::min(size, saveStateData.size())); + + return true; +} + +RETRO_API bool retro_unserialize(const void* data, size_t size) +{ + std::stringstream ss; + ss.write((const char*)data, size); + return _console->GetSaveStateManager()->LoadState(ss); +} + +RETRO_API void retro_cheat_reset() +{ + _console->GetCheatManager()->ClearCheats(); +} + +RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char* codeStr) +{ + if (codeStr) { - bool updated = false; - if(retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) { - update_settings(); - } - - bool isFastForward = false; - EmulationConfig cfg = _console->GetSettings()->GetEmulationConfig(); - if(retroEnv(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForward) && isFastForward) { - //Allow core to skip frame rendering during fast forwarding - cfg.EmulationSpeed = 0; - } else { - cfg.EmulationSpeed = 100; - } - _console->GetSettings()->SetEmulationConfig(cfg); - - _console->RunSingleFrame(); - - if(updated) { - //Update geometry after running the frame, in case the console's region changed (affects "auto" aspect ratio) - retro_system_av_info avInfo = {}; - _renderer->GetSystemAudioVideoInfo(avInfo); - retroEnv(RETRO_ENVIRONMENT_SET_GEOMETRY, &avInfo); - } + _console->GetCheatManager()->AddStringCheat(codeStr); } +} - RETRO_API size_t retro_serialize_size() +void update_input_descriptors() +{ + vector desc; + + auto addDesc = [&desc](unsigned port, unsigned button, const char* name) { - return _saveStateSize; - } + retro_input_descriptor d = {port, RETRO_DEVICE_JOYPAD, 0, button, name}; + desc.push_back(d); + }; - RETRO_API bool retro_serialize(void *data, size_t size) + auto setupPlayerButtons = [addDesc](int port) { - std::stringstream ss; - _console->GetSaveStateManager()->SaveState(ss); - - string saveStateData = ss.str(); - memset(data, 0, size); - memcpy(data, saveStateData.c_str(), std::min(size, saveStateData.size())); + unsigned device = _inputDevices[port]; + if (device == DEVICE_AUTO) + { + if (port <= 4) + { + switch (_console->GetSettings()->GetInputConfig().Controllers[port].Type) + { + case ControllerType::Multitap: + case ControllerType::SnesController: device = DEVICE_GAMEPAD; + break; - return true; - } - - RETRO_API bool retro_unserialize(const void *data, size_t size) - { - std::stringstream ss; - ss.write((const char*)data, size); - return _console->GetSaveStateManager()->LoadState(ss); - } - - RETRO_API void retro_cheat_reset() - { - _console->GetCheatManager()->ClearCheats(); - } - - RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *codeStr) - { - if(codeStr) { - _console->GetCheatManager()->AddStringCheat(codeStr); - } - } - - void update_input_descriptors() - { - vector desc; - - auto addDesc = [&desc](unsigned port, unsigned button, const char* name) { - retro_input_descriptor d = { port, RETRO_DEVICE_JOYPAD, 0, button, name }; - desc.push_back(d); - }; - - auto setupPlayerButtons = [addDesc](int port) { - unsigned device = _inputDevices[port]; - if(device == DEVICE_AUTO) { - if(port <= 4) { - switch(_console->GetSettings()->GetInputConfig().Controllers[port].Type) { - case ControllerType::Multitap: - case ControllerType::SnesController: device = DEVICE_GAMEPAD; break; - - case ControllerType::SuperScope: device = DEVICE_SUPERSCOPE; break; - case ControllerType::SnesMouse: device = DEVICE_SNESMOUSE; break; - default: return; - } + case ControllerType::SuperScope: device = DEVICE_SUPERSCOPE; + break; + case ControllerType::SnesMouse: device = DEVICE_SNESMOUSE; + break; + default: return; } } + } - if(device == DEVICE_GAMEPAD) { - addDesc(port, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_A, "A"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_B, "B"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_X, "X"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_Y, "Y"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_L, "L"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_R, "R"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_START, "Start"); - addDesc(port, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select"); - } + if (device == DEVICE_GAMEPAD) + { + addDesc(port, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_A, "A"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_B, "B"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_X, "X"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_Y, "Y"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_L, "L"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_R, "R"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_START, "Start"); + addDesc(port, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select"); + } + }; + + setupPlayerButtons(0); + setupPlayerButtons(1); + if (_console->GetSettings()->GetInputConfig().Controllers[1].Type == ControllerType::Multitap) + { + setupPlayerButtons(2); + setupPlayerButtons(3); + setupPlayerButtons(4); + } + + retro_input_descriptor end = {0}; + desc.push_back(end); + + retroEnv(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc.data()); +} + +void update_core_controllers() +{ + InputConfig input = _console->GetSettings()->GetInputConfig(); + for (int port = 0; port < 2; port++) + { + ControllerType type = ControllerType::SnesController; + switch (_inputDevices[port]) + { + case RETRO_DEVICE_NONE: type = ControllerType::None; + break; + case DEVICE_GAMEPAD: type = ControllerType::SnesController; + break; + case DEVICE_MULTITAP: type = ControllerType::Multitap; + break; + case DEVICE_SNESMOUSE: type = ControllerType::SnesMouse; + break; + case DEVICE_SUPERSCOPE: type = ControllerType::SuperScope; + break; + } + input.Controllers[port].Type = type; + } + + _console->GetSettings()->SetInputConfig(input); +} + +void retro_set_memory_maps() +{ + shared_ptr cart = _console->GetCartridge(); + Gameboy* gb = cart->GetGameboy(); + if (gb) + { + retro_memory_descriptor descriptors[20] = {}; + uint32_t count = 0; + + auto addDescriptor = [&count, &descriptors](uint8_t* ptr, uint32_t address, uint32_t length) + { + descriptors[count].ptr = ptr; + descriptors[count].start = (size_t)address; + descriptors[count].len = (size_t)length; + count++; }; - setupPlayerButtons(0); - setupPlayerButtons(1); - if(_console->GetSettings()->GetInputConfig().Controllers[1].Type == ControllerType::Multitap) { - setupPlayerButtons(2); - setupPlayerButtons(3); - setupPlayerButtons(4); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbPrgRom), 0x0000, + std::min(0x8000, (int)gb->DebugGetMemorySize(SnesMemoryType::GbPrgRom))); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbVideoRam), 0x8000, 0x2000); + if (gb->DebugGetMemory(SnesMemoryType::GbCartRam)) + { + uint32_t size = std::min(0x2000u, gb->DebugGetMemorySize(SnesMemoryType::GbCartRam)); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbCartRam), 0xA000, size); } - retro_input_descriptor end = { 0 }; - desc.push_back(end); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbWorkRam), 0xC000, 0x2000); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbWorkRam), 0xE000, 0x1E00); //WRAM Mirror - retroEnv(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc.data()); + addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbHighRam), 0xFF80, 0x80); + + if (gb->DebugGetMemorySize(SnesMemoryType::GbWorkRam) == 0x8000) + { + //GBC - map extra work ram at "fake" 0x10000-0x16000 range + addDescriptor(gb->DebugGetMemory(SnesMemoryType::WorkRam) + 0x2000, 0x10000, 0x6000); + } + + retro_memory_map memoryMap = {}; + memoryMap.descriptors = descriptors; + memoryMap.num_descriptors = count; + retroEnv(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &memoryMap); } +} - void update_core_controllers() +RETRO_API void retro_set_controller_port_device(unsigned port, unsigned device) +{ + if (port < 5 && _inputDevices[port] != device) { - InputConfig input = _console->GetSettings()->GetInputConfig(); - for(int port = 0; port < 2; port++) { - ControllerType type = ControllerType::SnesController; - switch(_inputDevices[port]) { - case RETRO_DEVICE_NONE: type = ControllerType::None; break; - case DEVICE_GAMEPAD: type = ControllerType::SnesController; break; - case DEVICE_MULTITAP: type = ControllerType::Multitap; break; - case DEVICE_SNESMOUSE: type = ControllerType::SnesMouse; break; - case DEVICE_SUPERSCOPE: type = ControllerType::SuperScope; break; - } - input.Controllers[port].Type = type; - } - - _console->GetSettings()->SetInputConfig(input); + _inputDevices[port] = device; + update_core_controllers(); + update_input_descriptors(); } +} - void retro_set_memory_maps() - { - shared_ptr cart = _console->GetCartridge(); - Gameboy* gb = cart->GetGameboy(); - if(gb) { - retro_memory_descriptor descriptors[20] = {}; - uint32_t count = 0; - - auto addDescriptor = [&count, &descriptors](uint8_t* ptr, uint32_t address, uint32_t length) { - descriptors[count].ptr = ptr; - descriptors[count].start = (size_t)address; - descriptors[count].len = (size_t)length; - count++; - }; - - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbPrgRom), 0x0000, std::min(0x8000, (int)gb->DebugGetMemorySize(SnesMemoryType::GbPrgRom))); - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbVideoRam), 0x8000, 0x2000); - if(gb->DebugGetMemory(SnesMemoryType::GbCartRam)) { - uint32_t size = std::min(0x2000u, gb->DebugGetMemorySize(SnesMemoryType::GbCartRam)); - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbCartRam), 0xA000, size); - } - - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbWorkRam), 0xC000, 0x2000); - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbWorkRam), 0xE000, 0x1E00); //WRAM Mirror - - addDescriptor(gb->DebugGetMemory(SnesMemoryType::GbHighRam), 0xFF80, 0x80); - - if(gb->DebugGetMemorySize(SnesMemoryType::GbWorkRam) == 0x8000) { - //GBC - map extra work ram at "fake" 0x10000-0x16000 range - addDescriptor(gb->DebugGetMemory(SnesMemoryType::WorkRam) + 0x2000, 0x10000, 0x6000); - } - - retro_memory_map memoryMap = {}; - memoryMap.descriptors = descriptors; - memoryMap.num_descriptors = count; - retroEnv(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &memoryMap); - } - } - - RETRO_API void retro_set_controller_port_device(unsigned port, unsigned device) - { - if(port < 5 && _inputDevices[port] != device) { - _inputDevices[port] = device; - update_core_controllers(); - update_input_descriptors(); - } - } - - RETRO_API bool retro_load_game(const struct retro_game_info *game) - { - char *systemFolder; - if(!retroEnv(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemFolder) || !systemFolder) { - return false; - } - - char *saveFolder; - if(!retroEnv(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &saveFolder)) { - logMessage(RETRO_LOG_ERROR, "Could not find save directory.\n"); - } - - enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; - if(!retroEnv(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) { - logMessage(RETRO_LOG_ERROR, "XRGB8888 is not supported.\n"); - return false; - } - - //Expect the following structure: - // /saves/*.sav - FolderUtilities::SetHomeFolder(systemFolder); - FolderUtilities::SetFolderOverrides(saveFolder, "", "", systemFolder); - - update_settings(); - - //Plug in 2 standard controllers by default, game database will switch the controller types for recognized games - /* - _console->GetSettings()->SetControllerType(0, ControllerType::SnesController); - _console->GetSettings()->SetControllerType(1, ControllerType::SnesController); - _console->GetSettings()->SetControllerType(2, ControllerType::None); - _console->GetSettings()->SetControllerType(3, ControllerType::None);*/ - - VirtualFile romData(game->data, game->size, game->path); - VirtualFile patch; - bool result = _console->LoadRom(romData, patch); - - if(result) { - update_core_controllers(); - update_input_descriptors(); - - //Savestates in Mesen may change size over time - //Retroarch doesn't like this for netplay or rewinding - it requires the states to always be the exact same size - //So we need to send a large enough size to Retroarch to ensure Mesen's state will always fit within that buffer. - std::stringstream ss; - _console->Serialize(ss); - - //Round up to the next 1kb multiple - _saveStateSize = ((ss.str().size() * 2) + 0x400) & ~0x3FF; - retro_set_memory_maps(); - } - - return result; - } - - RETRO_API bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info) +RETRO_API bool retro_load_game(const struct retro_game_info* game) +{ + char* systemFolder; + if (!retroEnv(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemFolder) || !systemFolder) { return false; } - RETRO_API void retro_unload_game() + char* saveFolder; + if (!retroEnv(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &saveFolder)) { - _console->Stop(false); + logMessage(RETRO_LOG_ERROR, "Could not find save directory.\n"); } - RETRO_API unsigned retro_get_region() + enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; + if (!retroEnv(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) { - ConsoleRegion region = _console->GetRegion(); - return region == ConsoleRegion::Ntsc ? RETRO_REGION_NTSC : RETRO_REGION_PAL; + logMessage(RETRO_LOG_ERROR, "XRGB8888 is not supported.\n"); + return false; } - RETRO_API void retro_get_system_info(struct retro_system_info *info) - { - if(!_console) { - _console.reset(new Console()); - _console->Initialize(); - } - _mesenVersion = _console->GetSettings()->GetVersionString(); + //Expect the following structure: + // /saves/*.sav + FolderUtilities::SetHomeFolder(systemFolder); + FolderUtilities::SetFolderOverrides(saveFolder, "", "", systemFolder); - info->library_name = "Mesen-S"; - info->library_version = _mesenVersion.c_str(); - info->need_fullpath = false; - info->valid_extensions = "sfc|smc|fig|swc|gb|gbc|bs"; - info->block_extract = false; + update_settings(); + + //Plug in 2 standard controllers by default, game database will switch the controller types for recognized games + /* + _console->GetSettings()->SetControllerType(0, ControllerType::SnesController); + _console->GetSettings()->SetControllerType(1, ControllerType::SnesController); + _console->GetSettings()->SetControllerType(2, ControllerType::None); + _console->GetSettings()->SetControllerType(3, ControllerType::None);*/ + + VirtualFile romData(game->data, game->size, game->path); + VirtualFile patch; + bool result = _console->LoadRom(romData, patch); + + if (result) + { + update_core_controllers(); + update_input_descriptors(); + + //Savestates in Mesen may change size over time + //Retroarch doesn't like this for netplay or rewinding - it requires the states to always be the exact same size + //So we need to send a large enough size to Retroarch to ensure Mesen's state will always fit within that buffer. + std::stringstream ss; + _console->Serialize(ss); + + //Round up to the next 1kb multiple + _saveStateSize = ((ss.str().size() * 2) + 0x400) & ~0x3FF; + retro_set_memory_maps(); } - RETRO_API void retro_get_system_av_info(struct retro_system_av_info *info) - { - _renderer->GetSystemAudioVideoInfo(*info, SNES_NTSC_OUT_WIDTH(256), 239 * 2); - } - - RETRO_API void *retro_get_memory_data(unsigned id) - { - shared_ptr cart = _console->GetCartridge(); - if(cart->GetGameboy()) { - switch(id) { - case RETRO_MEMORY_SAVE_RAM: return cart->GetGameboy()->DebugGetMemory(SnesMemoryType::GbCartRam); - case RETRO_MEMORY_SYSTEM_RAM: return cart->GetGameboy()->DebugGetMemory(SnesMemoryType::GbWorkRam); - } - } else { - switch(id) { - case RETRO_MEMORY_SAVE_RAM: return cart->DebugGetSaveRam(); - case RETRO_MEMORY_SYSTEM_RAM: return _console->GetMemoryManager()->DebugGetWorkRam(); - } - } - return nullptr; - } - - RETRO_API size_t retro_get_memory_size(unsigned id) - { - shared_ptr cart = _console->GetCartridge(); - if(cart->GetGameboy()) { - switch(id) { - case RETRO_MEMORY_SAVE_RAM: return cart->GetGameboy()->DebugGetMemorySize(SnesMemoryType::GbCartRam); - case RETRO_MEMORY_SYSTEM_RAM: return cart->GetGameboy()->DebugGetMemorySize(SnesMemoryType::GbWorkRam); - } - } else { - switch(id) { - case RETRO_MEMORY_SAVE_RAM: return cart->DebugGetSaveRamSize(); break; - case RETRO_MEMORY_SYSTEM_RAM: return MemoryManager::WorkRamSize; - } - } - return 0; - } + return result; +} + +RETRO_API bool retro_load_game_special(unsigned game_type, const struct retro_game_info* info, size_t num_info) +{ + return false; +} + +RETRO_API void retro_unload_game() +{ + _console->Stop(false); +} + +RETRO_API unsigned retro_get_region() +{ + ConsoleRegion region = _console->GetRegion(); + return region == ConsoleRegion::Ntsc ? RETRO_REGION_NTSC : RETRO_REGION_PAL; +} + +RETRO_API void retro_get_system_info(struct retro_system_info* info) +{ + if (!_console) + { + _console.reset(new Console()); + _console->Initialize(); + } + _mesenVersion = _console->GetSettings()->GetVersionString(); + + info->library_name = "Mesen-S"; + info->library_version = _mesenVersion.c_str(); + info->need_fullpath = false; + info->valid_extensions = "sfc|smc|fig|swc|gb|gbc|bs"; + info->block_extract = false; +} + +RETRO_API void retro_get_system_av_info(struct retro_system_av_info* info) +{ + _renderer->GetSystemAudioVideoInfo(*info, SNES_NTSC_OUT_WIDTH(256), 239 * 2); +} + +RETRO_API void* retro_get_memory_data(unsigned id) +{ + shared_ptr cart = _console->GetCartridge(); + if (cart->GetGameboy()) + { + switch (id) + { + case RETRO_MEMORY_SAVE_RAM: return cart->GetGameboy()->DebugGetMemory(SnesMemoryType::GbCartRam); + case RETRO_MEMORY_SYSTEM_RAM: return cart->GetGameboy()->DebugGetMemory(SnesMemoryType::GbWorkRam); + } + } + else + { + switch (id) + { + case RETRO_MEMORY_SAVE_RAM: return cart->DebugGetSaveRam(); + case RETRO_MEMORY_SYSTEM_RAM: return _console->GetMemoryManager()->DebugGetWorkRam(); + } + } + return nullptr; +} + +RETRO_API size_t retro_get_memory_size(unsigned id) +{ + shared_ptr cart = _console->GetCartridge(); + if (cart->GetGameboy()) + { + switch (id) + { + case RETRO_MEMORY_SAVE_RAM: return cart->GetGameboy()->DebugGetMemorySize(SnesMemoryType::GbCartRam); + case RETRO_MEMORY_SYSTEM_RAM: return cart->GetGameboy()->DebugGetMemorySize(SnesMemoryType::GbWorkRam); + } + } + else + { + switch (id) + { + case RETRO_MEMORY_SAVE_RAM: return cart->DebugGetSaveRamSize(); + break; + case RETRO_MEMORY_SYSTEM_RAM: return MemoryManager::WorkRamSize; + } + } + return 0; +} } diff --git a/Libretro/libretro.h b/Libretro/libretro.h index bfe42be..9acf5ac 100644 --- a/Libretro/libretro.h +++ b/Libretro/libretro.h @@ -259,29 +259,29 @@ extern "C" { /* Id values for LANGUAGE */ enum retro_language { - RETRO_LANGUAGE_ENGLISH = 0, - RETRO_LANGUAGE_JAPANESE = 1, - RETRO_LANGUAGE_FRENCH = 2, - RETRO_LANGUAGE_SPANISH = 3, - RETRO_LANGUAGE_GERMAN = 4, - RETRO_LANGUAGE_ITALIAN = 5, - RETRO_LANGUAGE_DUTCH = 6, - RETRO_LANGUAGE_PORTUGUESE_BRAZIL = 7, - RETRO_LANGUAGE_PORTUGUESE_PORTUGAL = 8, - RETRO_LANGUAGE_RUSSIAN = 9, - RETRO_LANGUAGE_KOREAN = 10, - RETRO_LANGUAGE_CHINESE_TRADITIONAL = 11, - RETRO_LANGUAGE_CHINESE_SIMPLIFIED = 12, - RETRO_LANGUAGE_ESPERANTO = 13, - RETRO_LANGUAGE_POLISH = 14, - RETRO_LANGUAGE_VIETNAMESE = 15, - RETRO_LANGUAGE_ARABIC = 16, - RETRO_LANGUAGE_GREEK = 17, - RETRO_LANGUAGE_TURKISH = 18, - RETRO_LANGUAGE_LAST, + RETRO_LANGUAGE_ENGLISH = 0, + RETRO_LANGUAGE_JAPANESE = 1, + RETRO_LANGUAGE_FRENCH = 2, + RETRO_LANGUAGE_SPANISH = 3, + RETRO_LANGUAGE_GERMAN = 4, + RETRO_LANGUAGE_ITALIAN = 5, + RETRO_LANGUAGE_DUTCH = 6, + RETRO_LANGUAGE_PORTUGUESE_BRAZIL = 7, + RETRO_LANGUAGE_PORTUGUESE_PORTUGAL = 8, + RETRO_LANGUAGE_RUSSIAN = 9, + RETRO_LANGUAGE_KOREAN = 10, + RETRO_LANGUAGE_CHINESE_TRADITIONAL = 11, + RETRO_LANGUAGE_CHINESE_SIMPLIFIED = 12, + RETRO_LANGUAGE_ESPERANTO = 13, + RETRO_LANGUAGE_POLISH = 14, + RETRO_LANGUAGE_VIETNAMESE = 15, + RETRO_LANGUAGE_ARABIC = 16, + RETRO_LANGUAGE_GREEK = 17, + RETRO_LANGUAGE_TURKISH = 18, + RETRO_LANGUAGE_LAST, - /* Ensure sizeof(enum) == sizeof(int) */ - RETRO_LANGUAGE_DUMMY = INT_MAX + /* Ensure sizeof(enum) == sizeof(int) */ + RETRO_LANGUAGE_DUMMY = INT_MAX }; /* Passed to retro_get_memory_data/size(). @@ -311,173 +311,173 @@ enum retro_language /* Keysyms used for ID in input state callback when polling RETRO_KEYBOARD. */ enum retro_key { - RETROK_UNKNOWN = 0, - RETROK_FIRST = 0, - RETROK_BACKSPACE = 8, - RETROK_TAB = 9, - RETROK_CLEAR = 12, - RETROK_RETURN = 13, - RETROK_PAUSE = 19, - RETROK_ESCAPE = 27, - RETROK_SPACE = 32, - RETROK_EXCLAIM = 33, - RETROK_QUOTEDBL = 34, - RETROK_HASH = 35, - RETROK_DOLLAR = 36, - RETROK_AMPERSAND = 38, - RETROK_QUOTE = 39, - RETROK_LEFTPAREN = 40, - RETROK_RIGHTPAREN = 41, - RETROK_ASTERISK = 42, - RETROK_PLUS = 43, - RETROK_COMMA = 44, - RETROK_MINUS = 45, - RETROK_PERIOD = 46, - RETROK_SLASH = 47, - RETROK_0 = 48, - RETROK_1 = 49, - RETROK_2 = 50, - RETROK_3 = 51, - RETROK_4 = 52, - RETROK_5 = 53, - RETROK_6 = 54, - RETROK_7 = 55, - RETROK_8 = 56, - RETROK_9 = 57, - RETROK_COLON = 58, - RETROK_SEMICOLON = 59, - RETROK_LESS = 60, - RETROK_EQUALS = 61, - RETROK_GREATER = 62, - RETROK_QUESTION = 63, - RETROK_AT = 64, - RETROK_LEFTBRACKET = 91, - RETROK_BACKSLASH = 92, - RETROK_RIGHTBRACKET = 93, - RETROK_CARET = 94, - RETROK_UNDERSCORE = 95, - RETROK_BACKQUOTE = 96, - RETROK_a = 97, - RETROK_b = 98, - RETROK_c = 99, - RETROK_d = 100, - RETROK_e = 101, - RETROK_f = 102, - RETROK_g = 103, - RETROK_h = 104, - RETROK_i = 105, - RETROK_j = 106, - RETROK_k = 107, - RETROK_l = 108, - RETROK_m = 109, - RETROK_n = 110, - RETROK_o = 111, - RETROK_p = 112, - RETROK_q = 113, - RETROK_r = 114, - RETROK_s = 115, - RETROK_t = 116, - RETROK_u = 117, - RETROK_v = 118, - RETROK_w = 119, - RETROK_x = 120, - RETROK_y = 121, - RETROK_z = 122, - RETROK_LEFTBRACE = 123, - RETROK_BAR = 124, - RETROK_RIGHTBRACE = 125, - RETROK_TILDE = 126, - RETROK_DELETE = 127, + RETROK_UNKNOWN = 0, + RETROK_FIRST = 0, + RETROK_BACKSPACE = 8, + RETROK_TAB = 9, + RETROK_CLEAR = 12, + RETROK_RETURN = 13, + RETROK_PAUSE = 19, + RETROK_ESCAPE = 27, + RETROK_SPACE = 32, + RETROK_EXCLAIM = 33, + RETROK_QUOTEDBL = 34, + RETROK_HASH = 35, + RETROK_DOLLAR = 36, + RETROK_AMPERSAND = 38, + RETROK_QUOTE = 39, + RETROK_LEFTPAREN = 40, + RETROK_RIGHTPAREN = 41, + RETROK_ASTERISK = 42, + RETROK_PLUS = 43, + RETROK_COMMA = 44, + RETROK_MINUS = 45, + RETROK_PERIOD = 46, + RETROK_SLASH = 47, + RETROK_0 = 48, + RETROK_1 = 49, + RETROK_2 = 50, + RETROK_3 = 51, + RETROK_4 = 52, + RETROK_5 = 53, + RETROK_6 = 54, + RETROK_7 = 55, + RETROK_8 = 56, + RETROK_9 = 57, + RETROK_COLON = 58, + RETROK_SEMICOLON = 59, + RETROK_LESS = 60, + RETROK_EQUALS = 61, + RETROK_GREATER = 62, + RETROK_QUESTION = 63, + RETROK_AT = 64, + RETROK_LEFTBRACKET = 91, + RETROK_BACKSLASH = 92, + RETROK_RIGHTBRACKET = 93, + RETROK_CARET = 94, + RETROK_UNDERSCORE = 95, + RETROK_BACKQUOTE = 96, + RETROK_a = 97, + RETROK_b = 98, + RETROK_c = 99, + RETROK_d = 100, + RETROK_e = 101, + RETROK_f = 102, + RETROK_g = 103, + RETROK_h = 104, + RETROK_i = 105, + RETROK_j = 106, + RETROK_k = 107, + RETROK_l = 108, + RETROK_m = 109, + RETROK_n = 110, + RETROK_o = 111, + RETROK_p = 112, + RETROK_q = 113, + RETROK_r = 114, + RETROK_s = 115, + RETROK_t = 116, + RETROK_u = 117, + RETROK_v = 118, + RETROK_w = 119, + RETROK_x = 120, + RETROK_y = 121, + RETROK_z = 122, + RETROK_LEFTBRACE = 123, + RETROK_BAR = 124, + RETROK_RIGHTBRACE = 125, + RETROK_TILDE = 126, + RETROK_DELETE = 127, - RETROK_KP0 = 256, - RETROK_KP1 = 257, - RETROK_KP2 = 258, - RETROK_KP3 = 259, - RETROK_KP4 = 260, - RETROK_KP5 = 261, - RETROK_KP6 = 262, - RETROK_KP7 = 263, - RETROK_KP8 = 264, - RETROK_KP9 = 265, - RETROK_KP_PERIOD = 266, - RETROK_KP_DIVIDE = 267, - RETROK_KP_MULTIPLY = 268, - RETROK_KP_MINUS = 269, - RETROK_KP_PLUS = 270, - RETROK_KP_ENTER = 271, - RETROK_KP_EQUALS = 272, + RETROK_KP0 = 256, + RETROK_KP1 = 257, + RETROK_KP2 = 258, + RETROK_KP3 = 259, + RETROK_KP4 = 260, + RETROK_KP5 = 261, + RETROK_KP6 = 262, + RETROK_KP7 = 263, + RETROK_KP8 = 264, + RETROK_KP9 = 265, + RETROK_KP_PERIOD = 266, + RETROK_KP_DIVIDE = 267, + RETROK_KP_MULTIPLY = 268, + RETROK_KP_MINUS = 269, + RETROK_KP_PLUS = 270, + RETROK_KP_ENTER = 271, + RETROK_KP_EQUALS = 272, - RETROK_UP = 273, - RETROK_DOWN = 274, - RETROK_RIGHT = 275, - RETROK_LEFT = 276, - RETROK_INSERT = 277, - RETROK_HOME = 278, - RETROK_END = 279, - RETROK_PAGEUP = 280, - RETROK_PAGEDOWN = 281, + RETROK_UP = 273, + RETROK_DOWN = 274, + RETROK_RIGHT = 275, + RETROK_LEFT = 276, + RETROK_INSERT = 277, + RETROK_HOME = 278, + RETROK_END = 279, + RETROK_PAGEUP = 280, + RETROK_PAGEDOWN = 281, - RETROK_F1 = 282, - RETROK_F2 = 283, - RETROK_F3 = 284, - RETROK_F4 = 285, - RETROK_F5 = 286, - RETROK_F6 = 287, - RETROK_F7 = 288, - RETROK_F8 = 289, - RETROK_F9 = 290, - RETROK_F10 = 291, - RETROK_F11 = 292, - RETROK_F12 = 293, - RETROK_F13 = 294, - RETROK_F14 = 295, - RETROK_F15 = 296, + RETROK_F1 = 282, + RETROK_F2 = 283, + RETROK_F3 = 284, + RETROK_F4 = 285, + RETROK_F5 = 286, + RETROK_F6 = 287, + RETROK_F7 = 288, + RETROK_F8 = 289, + RETROK_F9 = 290, + RETROK_F10 = 291, + RETROK_F11 = 292, + RETROK_F12 = 293, + RETROK_F13 = 294, + RETROK_F14 = 295, + RETROK_F15 = 296, - RETROK_NUMLOCK = 300, - RETROK_CAPSLOCK = 301, - RETROK_SCROLLOCK = 302, - RETROK_RSHIFT = 303, - RETROK_LSHIFT = 304, - RETROK_RCTRL = 305, - RETROK_LCTRL = 306, - RETROK_RALT = 307, - RETROK_LALT = 308, - RETROK_RMETA = 309, - RETROK_LMETA = 310, - RETROK_LSUPER = 311, - RETROK_RSUPER = 312, - RETROK_MODE = 313, - RETROK_COMPOSE = 314, + RETROK_NUMLOCK = 300, + RETROK_CAPSLOCK = 301, + RETROK_SCROLLOCK = 302, + RETROK_RSHIFT = 303, + RETROK_LSHIFT = 304, + RETROK_RCTRL = 305, + RETROK_LCTRL = 306, + RETROK_RALT = 307, + RETROK_LALT = 308, + RETROK_RMETA = 309, + RETROK_LMETA = 310, + RETROK_LSUPER = 311, + RETROK_RSUPER = 312, + RETROK_MODE = 313, + RETROK_COMPOSE = 314, - RETROK_HELP = 315, - RETROK_PRINT = 316, - RETROK_SYSREQ = 317, - RETROK_BREAK = 318, - RETROK_MENU = 319, - RETROK_POWER = 320, - RETROK_EURO = 321, - RETROK_UNDO = 322, - RETROK_OEM_102 = 323, + RETROK_HELP = 315, + RETROK_PRINT = 316, + RETROK_SYSREQ = 317, + RETROK_BREAK = 318, + RETROK_MENU = 319, + RETROK_POWER = 320, + RETROK_EURO = 321, + RETROK_UNDO = 322, + RETROK_OEM_102 = 323, - RETROK_LAST, + RETROK_LAST, - RETROK_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ + RETROK_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ }; enum retro_mod { - RETROKMOD_NONE = 0x0000, + RETROKMOD_NONE = 0x0000, - RETROKMOD_SHIFT = 0x01, - RETROKMOD_CTRL = 0x02, - RETROKMOD_ALT = 0x04, - RETROKMOD_META = 0x08, + RETROKMOD_SHIFT = 0x01, + RETROKMOD_CTRL = 0x02, + RETROKMOD_ALT = 0x04, + RETROKMOD_META = 0x08, - RETROKMOD_NUMLOCK = 0x10, - RETROKMOD_CAPSLOCK = 0x20, - RETROKMOD_SCROLLOCK = 0x40, + RETROKMOD_NUMLOCK = 0x10, + RETROKMOD_CAPSLOCK = 0x20, + RETROKMOD_SCROLLOCK = 0x40, - RETROKMOD_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ + RETROKMOD_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ }; /* If set, this call is not part of the public libretro API yet. It can @@ -504,9 +504,9 @@ enum retro_mod * passing NULL to video frame callback. */ - /* Environ 4, 5 are no longer supported (GET_VARIABLE / SET_VARIABLES), - * and reserved to avoid possible ABI clash. - */ +/* Environ 4, 5 are no longer supported (GET_VARIABLE / SET_VARIABLES), + * and reserved to avoid possible ABI clash. + */ #define RETRO_ENVIRONMENT_SET_MESSAGE 6 /* const struct retro_message * -- * Sets a message to be displayed in implementation-specific manner @@ -521,771 +521,771 @@ enum retro_mod * way to shutdown the game from a menu item or similar. */ #define RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL 8 - /* const unsigned * -- - * Gives a hint to the frontend how demanding this implementation - * is on a system. E.g. reporting a level of 2 means - * this implementation should run decently on all frontends - * of level 2 and up. - * - * It can be used by the frontend to potentially warn - * about too demanding implementations. - * - * The levels are "floating". - * - * This function can be called on a per-game basis, - * as certain games an implementation can play might be - * particularly demanding. - * If called, it should be called in retro_load_game(). - */ +/* const unsigned * -- + * Gives a hint to the frontend how demanding this implementation + * is on a system. E.g. reporting a level of 2 means + * this implementation should run decently on all frontends + * of level 2 and up. + * + * It can be used by the frontend to potentially warn + * about too demanding implementations. + * + * The levels are "floating". + * + * This function can be called on a per-game basis, + * as certain games an implementation can play might be + * particularly demanding. + * If called, it should be called in retro_load_game(). + */ #define RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY 9 - /* const char ** -- - * Returns the "system" directory of the frontend. - * This directory can be used to store system specific - * content such as BIOSes, configuration data, etc. - * The returned value can be NULL. - * If so, no such directory is defined, - * and it's up to the implementation to find a suitable directory. - * - * NOTE: Some cores used this folder also for "save" data such as - * memory cards, etc, for lack of a better place to put it. - * This is now discouraged, and if possible, cores should try to - * use the new GET_SAVE_DIRECTORY. - */ +/* const char ** -- + * Returns the "system" directory of the frontend. + * This directory can be used to store system specific + * content such as BIOSes, configuration data, etc. + * The returned value can be NULL. + * If so, no such directory is defined, + * and it's up to the implementation to find a suitable directory. + * + * NOTE: Some cores used this folder also for "save" data such as + * memory cards, etc, for lack of a better place to put it. + * This is now discouraged, and if possible, cores should try to + * use the new GET_SAVE_DIRECTORY. + */ #define RETRO_ENVIRONMENT_SET_PIXEL_FORMAT 10 - /* const enum retro_pixel_format * -- - * Sets the internal pixel format used by the implementation. - * The default pixel format is RETRO_PIXEL_FORMAT_0RGB1555. - * This pixel format however, is deprecated (see enum retro_pixel_format). - * If the call returns false, the frontend does not support this pixel - * format. - * - * This function should be called inside retro_load_game() or - * retro_get_system_av_info(). - */ +/* const enum retro_pixel_format * -- + * Sets the internal pixel format used by the implementation. + * The default pixel format is RETRO_PIXEL_FORMAT_0RGB1555. + * This pixel format however, is deprecated (see enum retro_pixel_format). + * If the call returns false, the frontend does not support this pixel + * format. + * + * This function should be called inside retro_load_game() or + * retro_get_system_av_info(). + */ #define RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS 11 - /* const struct retro_input_descriptor * -- - * Sets an array of retro_input_descriptors. - * It is up to the frontend to present this in a usable way. - * The array is terminated by retro_input_descriptor::description - * being set to NULL. - * This function can be called at any time, but it is recommended - * to call it as early as possible. - */ +/* const struct retro_input_descriptor * -- + * Sets an array of retro_input_descriptors. + * It is up to the frontend to present this in a usable way. + * The array is terminated by retro_input_descriptor::description + * being set to NULL. + * This function can be called at any time, but it is recommended + * to call it as early as possible. + */ #define RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK 12 - /* const struct retro_keyboard_callback * -- - * Sets a callback function used to notify core about keyboard events. - */ +/* const struct retro_keyboard_callback * -- + * Sets a callback function used to notify core about keyboard events. + */ #define RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE 13 - /* const struct retro_disk_control_callback * -- - * Sets an interface which frontend can use to eject and insert - * disk images. - * This is used for games which consist of multiple images and - * must be manually swapped out by the user (e.g. PSX). - */ +/* const struct retro_disk_control_callback * -- + * Sets an interface which frontend can use to eject and insert + * disk images. + * This is used for games which consist of multiple images and + * must be manually swapped out by the user (e.g. PSX). + */ #define RETRO_ENVIRONMENT_SET_HW_RENDER 14 - /* struct retro_hw_render_callback * -- - * Sets an interface to let a libretro core render with - * hardware acceleration. - * Should be called in retro_load_game(). - * If successful, libretro cores will be able to render to a - * frontend-provided framebuffer. - * The size of this framebuffer will be at least as large as - * max_width/max_height provided in get_av_info(). - * If HW rendering is used, pass only RETRO_HW_FRAME_BUFFER_VALID or - * NULL to retro_video_refresh_t. - */ +/* struct retro_hw_render_callback * -- + * Sets an interface to let a libretro core render with + * hardware acceleration. + * Should be called in retro_load_game(). + * If successful, libretro cores will be able to render to a + * frontend-provided framebuffer. + * The size of this framebuffer will be at least as large as + * max_width/max_height provided in get_av_info(). + * If HW rendering is used, pass only RETRO_HW_FRAME_BUFFER_VALID or + * NULL to retro_video_refresh_t. + */ #define RETRO_ENVIRONMENT_GET_VARIABLE 15 - /* struct retro_variable * -- - * Interface to acquire user-defined information from environment - * that cannot feasibly be supported in a multi-system way. - * 'key' should be set to a key which has already been set by - * SET_VARIABLES. - * 'data' will be set to a value or NULL. - */ +/* struct retro_variable * -- + * Interface to acquire user-defined information from environment + * that cannot feasibly be supported in a multi-system way. + * 'key' should be set to a key which has already been set by + * SET_VARIABLES. + * 'data' will be set to a value or NULL. + */ #define RETRO_ENVIRONMENT_SET_VARIABLES 16 - /* const struct retro_variable * -- - * Allows an implementation to signal the environment - * which variables it might want to check for later using - * GET_VARIABLE. - * This allows the frontend to present these variables to - * a user dynamically. - * This should be called the first time as early as - * possible (ideally in retro_set_environment). - * Afterward it may be called again for the core to communicate - * updated options to the frontend, but the number of core - * options must not change from the number in the initial call. - * - * 'data' points to an array of retro_variable structs - * terminated by a { NULL, NULL } element. - * retro_variable::key should be namespaced to not collide - * with other implementations' keys. E.g. A core called - * 'foo' should use keys named as 'foo_option'. - * retro_variable::value should contain a human readable - * description of the key as well as a '|' delimited list - * of expected values. - * - * The number of possible options should be very limited, - * i.e. it should be feasible to cycle through options - * without a keyboard. - * - * First entry should be treated as a default. - * - * Example entry: - * { "foo_option", "Speed hack coprocessor X; false|true" } - * - * Text before first ';' is description. This ';' must be - * followed by a space, and followed by a list of possible - * values split up with '|'. - * - * Only strings are operated on. The possible values will - * generally be displayed and stored as-is by the frontend. - */ +/* const struct retro_variable * -- + * Allows an implementation to signal the environment + * which variables it might want to check for later using + * GET_VARIABLE. + * This allows the frontend to present these variables to + * a user dynamically. + * This should be called the first time as early as + * possible (ideally in retro_set_environment). + * Afterward it may be called again for the core to communicate + * updated options to the frontend, but the number of core + * options must not change from the number in the initial call. + * + * 'data' points to an array of retro_variable structs + * terminated by a { NULL, NULL } element. + * retro_variable::key should be namespaced to not collide + * with other implementations' keys. E.g. A core called + * 'foo' should use keys named as 'foo_option'. + * retro_variable::value should contain a human readable + * description of the key as well as a '|' delimited list + * of expected values. + * + * The number of possible options should be very limited, + * i.e. it should be feasible to cycle through options + * without a keyboard. + * + * First entry should be treated as a default. + * + * Example entry: + * { "foo_option", "Speed hack coprocessor X; false|true" } + * + * Text before first ';' is description. This ';' must be + * followed by a space, and followed by a list of possible + * values split up with '|'. + * + * Only strings are operated on. The possible values will + * generally be displayed and stored as-is by the frontend. + */ #define RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE 17 - /* bool * -- - * Result is set to true if some variables are updated by - * frontend since last call to RETRO_ENVIRONMENT_GET_VARIABLE. - * Variables should be queried with GET_VARIABLE. - */ +/* bool * -- + * Result is set to true if some variables are updated by + * frontend since last call to RETRO_ENVIRONMENT_GET_VARIABLE. + * Variables should be queried with GET_VARIABLE. + */ #define RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME 18 - /* const bool * -- - * If true, the libretro implementation supports calls to - * retro_load_game() with NULL as argument. - * Used by cores which can run without particular game data. - * This should be called within retro_set_environment() only. - */ +/* const bool * -- + * If true, the libretro implementation supports calls to + * retro_load_game() with NULL as argument. + * Used by cores which can run without particular game data. + * This should be called within retro_set_environment() only. + */ #define RETRO_ENVIRONMENT_GET_LIBRETRO_PATH 19 - /* const char ** -- - * Retrieves the absolute path from where this libretro - * implementation was loaded. - * NULL is returned if the libretro was loaded statically - * (i.e. linked statically to frontend), or if the path cannot be - * determined. - * Mostly useful in cooperation with SET_SUPPORT_NO_GAME as assets can - * be loaded without ugly hacks. - */ +/* const char ** -- + * Retrieves the absolute path from where this libretro + * implementation was loaded. + * NULL is returned if the libretro was loaded statically + * (i.e. linked statically to frontend), or if the path cannot be + * determined. + * Mostly useful in cooperation with SET_SUPPORT_NO_GAME as assets can + * be loaded without ugly hacks. + */ - /* Environment 20 was an obsolete version of SET_AUDIO_CALLBACK. - * It was not used by any known core at the time, - * and was removed from the API. */ +/* Environment 20 was an obsolete version of SET_AUDIO_CALLBACK. + * It was not used by any known core at the time, + * and was removed from the API. */ #define RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK 21 - /* const struct retro_frame_time_callback * -- - * Lets the core know how much time has passed since last - * invocation of retro_run(). - * The frontend can tamper with the timing to fake fast-forward, - * slow-motion, frame stepping, etc. - * In this case the delta time will use the reference value - * in frame_time_callback.. - */ +/* const struct retro_frame_time_callback * -- + * Lets the core know how much time has passed since last + * invocation of retro_run(). + * The frontend can tamper with the timing to fake fast-forward, + * slow-motion, frame stepping, etc. + * In this case the delta time will use the reference value + * in frame_time_callback.. + */ #define RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK 22 - /* const struct retro_audio_callback * -- - * Sets an interface which is used to notify a libretro core about audio - * being available for writing. - * The callback can be called from any thread, so a core using this must - * have a thread safe audio implementation. - * It is intended for games where audio and video are completely - * asynchronous and audio can be generated on the fly. - * This interface is not recommended for use with emulators which have - * highly synchronous audio. - * - * The callback only notifies about writability; the libretro core still - * has to call the normal audio callbacks - * to write audio. The audio callbacks must be called from within the - * notification callback. - * The amount of audio data to write is up to the implementation. - * Generally, the audio callback will be called continously in a loop. - * - * Due to thread safety guarantees and lack of sync between audio and - * video, a frontend can selectively disallow this interface based on - * internal configuration. A core using this interface must also - * implement the "normal" audio interface. - * - * A libretro core using SET_AUDIO_CALLBACK should also make use of - * SET_FRAME_TIME_CALLBACK. - */ +/* const struct retro_audio_callback * -- + * Sets an interface which is used to notify a libretro core about audio + * being available for writing. + * The callback can be called from any thread, so a core using this must + * have a thread safe audio implementation. + * It is intended for games where audio and video are completely + * asynchronous and audio can be generated on the fly. + * This interface is not recommended for use with emulators which have + * highly synchronous audio. + * + * The callback only notifies about writability; the libretro core still + * has to call the normal audio callbacks + * to write audio. The audio callbacks must be called from within the + * notification callback. + * The amount of audio data to write is up to the implementation. + * Generally, the audio callback will be called continously in a loop. + * + * Due to thread safety guarantees and lack of sync between audio and + * video, a frontend can selectively disallow this interface based on + * internal configuration. A core using this interface must also + * implement the "normal" audio interface. + * + * A libretro core using SET_AUDIO_CALLBACK should also make use of + * SET_FRAME_TIME_CALLBACK. + */ #define RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE 23 - /* struct retro_rumble_interface * -- - * Gets an interface which is used by a libretro core to set - * state of rumble motors in controllers. - * A strong and weak motor is supported, and they can be - * controlled indepedently. - */ +/* struct retro_rumble_interface * -- + * Gets an interface which is used by a libretro core to set + * state of rumble motors in controllers. + * A strong and weak motor is supported, and they can be + * controlled indepedently. + */ #define RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES 24 - /* uint64_t * -- - * Gets a bitmask telling which device type are expected to be - * handled properly in a call to retro_input_state_t. - * Devices which are not handled or recognized always return - * 0 in retro_input_state_t. - * Example bitmask: caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG). - * Should only be called in retro_run(). - */ +/* uint64_t * -- + * Gets a bitmask telling which device type are expected to be + * handled properly in a call to retro_input_state_t. + * Devices which are not handled or recognized always return + * 0 in retro_input_state_t. + * Example bitmask: caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG). + * Should only be called in retro_run(). + */ #define RETRO_ENVIRONMENT_GET_SENSOR_INTERFACE (25 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_sensor_interface * -- - * Gets access to the sensor interface. - * The purpose of this interface is to allow - * setting state related to sensors such as polling rate, - * enabling/disable it entirely, etc. - * Reading sensor state is done via the normal - * input_state_callback API. - */ +/* struct retro_sensor_interface * -- + * Gets access to the sensor interface. + * The purpose of this interface is to allow + * setting state related to sensors such as polling rate, + * enabling/disable it entirely, etc. + * Reading sensor state is done via the normal + * input_state_callback API. + */ #define RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE (26 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_camera_callback * -- - * Gets an interface to a video camera driver. - * A libretro core can use this interface to get access to a - * video camera. - * New video frames are delivered in a callback in same - * thread as retro_run(). - * - * GET_CAMERA_INTERFACE should be called in retro_load_game(). - * - * Depending on the camera implementation used, camera frames - * will be delivered as a raw framebuffer, - * or as an OpenGL texture directly. - * - * The core has to tell the frontend here which types of - * buffers can be handled properly. - * An OpenGL texture can only be handled when using a - * libretro GL core (SET_HW_RENDER). - * It is recommended to use a libretro GL core when - * using camera interface. - * - * The camera is not started automatically. The retrieved start/stop - * functions must be used to explicitly - * start and stop the camera driver. - */ +/* struct retro_camera_callback * -- + * Gets an interface to a video camera driver. + * A libretro core can use this interface to get access to a + * video camera. + * New video frames are delivered in a callback in same + * thread as retro_run(). + * + * GET_CAMERA_INTERFACE should be called in retro_load_game(). + * + * Depending on the camera implementation used, camera frames + * will be delivered as a raw framebuffer, + * or as an OpenGL texture directly. + * + * The core has to tell the frontend here which types of + * buffers can be handled properly. + * An OpenGL texture can only be handled when using a + * libretro GL core (SET_HW_RENDER). + * It is recommended to use a libretro GL core when + * using camera interface. + * + * The camera is not started automatically. The retrieved start/stop + * functions must be used to explicitly + * start and stop the camera driver. + */ #define RETRO_ENVIRONMENT_GET_LOG_INTERFACE 27 - /* struct retro_log_callback * -- - * Gets an interface for logging. This is useful for - * logging in a cross-platform way - * as certain platforms cannot use stderr for logging. - * It also allows the frontend to - * show logging information in a more suitable way. - * If this interface is not used, libretro cores should - * log to stderr as desired. - */ +/* struct retro_log_callback * -- + * Gets an interface for logging. This is useful for + * logging in a cross-platform way + * as certain platforms cannot use stderr for logging. + * It also allows the frontend to + * show logging information in a more suitable way. + * If this interface is not used, libretro cores should + * log to stderr as desired. + */ #define RETRO_ENVIRONMENT_GET_PERF_INTERFACE 28 - /* struct retro_perf_callback * -- - * Gets an interface for performance counters. This is useful - * for performance logging in a cross-platform way and for detecting - * architecture-specific features, such as SIMD support. - */ +/* struct retro_perf_callback * -- + * Gets an interface for performance counters. This is useful + * for performance logging in a cross-platform way and for detecting + * architecture-specific features, such as SIMD support. + */ #define RETRO_ENVIRONMENT_GET_LOCATION_INTERFACE 29 - /* struct retro_location_callback * -- - * Gets access to the location interface. - * The purpose of this interface is to be able to retrieve - * location-based information from the host device, - * such as current latitude / longitude. - */ +/* struct retro_location_callback * -- + * Gets access to the location interface. + * The purpose of this interface is to be able to retrieve + * location-based information from the host device, + * such as current latitude / longitude. + */ #define RETRO_ENVIRONMENT_GET_CONTENT_DIRECTORY 30 /* Old name, kept for compatibility. */ #define RETRO_ENVIRONMENT_GET_CORE_ASSETS_DIRECTORY 30 - /* const char ** -- - * Returns the "core assets" directory of the frontend. - * This directory can be used to store specific assets that the - * core relies upon, such as art assets, - * input data, etc etc. - * The returned value can be NULL. - * If so, no such directory is defined, - * and it's up to the implementation to find a suitable directory. - */ +/* const char ** -- + * Returns the "core assets" directory of the frontend. + * This directory can be used to store specific assets that the + * core relies upon, such as art assets, + * input data, etc etc. + * The returned value can be NULL. + * If so, no such directory is defined, + * and it's up to the implementation to find a suitable directory. + */ #define RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY 31 - /* const char ** -- - * Returns the "save" directory of the frontend, unless there is no - * save directory available. The save directory should be used to - * store SRAM, memory cards, high scores, etc, if the libretro core - * cannot use the regular memory interface (retro_get_memory_data()). - * - * If the frontend cannot designate a save directory, it will return - * NULL to indicate that the core should attempt to operate without a - * save directory set. - * - * NOTE: early libretro cores used the system directory for save - * files. Cores that need to be backwards-compatible can still check - * GET_SYSTEM_DIRECTORY. - */ +/* const char ** -- + * Returns the "save" directory of the frontend, unless there is no + * save directory available. The save directory should be used to + * store SRAM, memory cards, high scores, etc, if the libretro core + * cannot use the regular memory interface (retro_get_memory_data()). + * + * If the frontend cannot designate a save directory, it will return + * NULL to indicate that the core should attempt to operate without a + * save directory set. + * + * NOTE: early libretro cores used the system directory for save + * files. Cores that need to be backwards-compatible can still check + * GET_SYSTEM_DIRECTORY. + */ #define RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO 32 - /* const struct retro_system_av_info * -- - * Sets a new av_info structure. This can only be called from - * within retro_run(). - * This should *only* be used if the core is completely altering the - * internal resolutions, aspect ratios, timings, sampling rate, etc. - * Calling this can require a full reinitialization of video/audio - * drivers in the frontend, - * - * so it is important to call it very sparingly, and usually only with - * the users explicit consent. - * An eventual driver reinitialize will happen so that video and - * audio callbacks - * happening after this call within the same retro_run() call will - * target the newly initialized driver. - * - * This callback makes it possible to support configurable resolutions - * in games, which can be useful to - * avoid setting the "worst case" in max_width/max_height. - * - * ***HIGHLY RECOMMENDED*** Do not call this callback every time - * resolution changes in an emulator core if it's - * expected to be a temporary change, for the reasons of possible - * driver reinitialization. - * This call is not a free pass for not trying to provide - * correct values in retro_get_system_av_info(). If you need to change - * things like aspect ratio or nominal width/height, - * use RETRO_ENVIRONMENT_SET_GEOMETRY, which is a softer variant - * of SET_SYSTEM_AV_INFO. - * - * If this returns false, the frontend does not acknowledge a - * changed av_info struct. - */ +/* const struct retro_system_av_info * -- + * Sets a new av_info structure. This can only be called from + * within retro_run(). + * This should *only* be used if the core is completely altering the + * internal resolutions, aspect ratios, timings, sampling rate, etc. + * Calling this can require a full reinitialization of video/audio + * drivers in the frontend, + * + * so it is important to call it very sparingly, and usually only with + * the users explicit consent. + * An eventual driver reinitialize will happen so that video and + * audio callbacks + * happening after this call within the same retro_run() call will + * target the newly initialized driver. + * + * This callback makes it possible to support configurable resolutions + * in games, which can be useful to + * avoid setting the "worst case" in max_width/max_height. + * + * ***HIGHLY RECOMMENDED*** Do not call this callback every time + * resolution changes in an emulator core if it's + * expected to be a temporary change, for the reasons of possible + * driver reinitialization. + * This call is not a free pass for not trying to provide + * correct values in retro_get_system_av_info(). If you need to change + * things like aspect ratio or nominal width/height, + * use RETRO_ENVIRONMENT_SET_GEOMETRY, which is a softer variant + * of SET_SYSTEM_AV_INFO. + * + * If this returns false, the frontend does not acknowledge a + * changed av_info struct. + */ #define RETRO_ENVIRONMENT_SET_PROC_ADDRESS_CALLBACK 33 - /* const struct retro_get_proc_address_interface * -- - * Allows a libretro core to announce support for the - * get_proc_address() interface. - * This interface allows for a standard way to extend libretro where - * use of environment calls are too indirect, - * e.g. for cases where the frontend wants to call directly into the core. - * - * If a core wants to expose this interface, SET_PROC_ADDRESS_CALLBACK - * **MUST** be called from within retro_set_environment(). - */ +/* const struct retro_get_proc_address_interface * -- + * Allows a libretro core to announce support for the + * get_proc_address() interface. + * This interface allows for a standard way to extend libretro where + * use of environment calls are too indirect, + * e.g. for cases where the frontend wants to call directly into the core. + * + * If a core wants to expose this interface, SET_PROC_ADDRESS_CALLBACK + * **MUST** be called from within retro_set_environment(). + */ #define RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO 34 - /* const struct retro_subsystem_info * -- - * This environment call introduces the concept of libretro "subsystems". - * A subsystem is a variant of a libretro core which supports - * different kinds of games. - * The purpose of this is to support e.g. emulators which might - * have special needs, e.g. Super Nintendo's Super GameBoy, Sufami Turbo. - * It can also be used to pick among subsystems in an explicit way - * if the libretro implementation is a multi-system emulator itself. - * - * Loading a game via a subsystem is done with retro_load_game_special(), - * and this environment call allows a libretro core to expose which - * subsystems are supported for use with retro_load_game_special(). - * A core passes an array of retro_game_special_info which is terminated - * with a zeroed out retro_game_special_info struct. - * - * If a core wants to use this functionality, SET_SUBSYSTEM_INFO - * **MUST** be called from within retro_set_environment(). - */ +/* const struct retro_subsystem_info * -- + * This environment call introduces the concept of libretro "subsystems". + * A subsystem is a variant of a libretro core which supports + * different kinds of games. + * The purpose of this is to support e.g. emulators which might + * have special needs, e.g. Super Nintendo's Super GameBoy, Sufami Turbo. + * It can also be used to pick among subsystems in an explicit way + * if the libretro implementation is a multi-system emulator itself. + * + * Loading a game via a subsystem is done with retro_load_game_special(), + * and this environment call allows a libretro core to expose which + * subsystems are supported for use with retro_load_game_special(). + * A core passes an array of retro_game_special_info which is terminated + * with a zeroed out retro_game_special_info struct. + * + * If a core wants to use this functionality, SET_SUBSYSTEM_INFO + * **MUST** be called from within retro_set_environment(). + */ #define RETRO_ENVIRONMENT_SET_CONTROLLER_INFO 35 - /* const struct retro_controller_info * -- - * This environment call lets a libretro core tell the frontend - * which controller subclasses are recognized in calls to - * retro_set_controller_port_device(). - * - * Some emulators such as Super Nintendo support multiple lightgun - * types which must be specifically selected from. It is therefore - * sometimes necessary for a frontend to be able to tell the core - * about a special kind of input device which is not specifcally - * provided by the Libretro API. - * - * In order for a frontend to understand the workings of those devices, - * they must be defined as a specialized subclass of the generic device - * types already defined in the libretro API. - * - * The core must pass an array of const struct retro_controller_info which - * is terminated with a blanked out struct. Each element of the - * retro_controller_info struct corresponds to the ascending port index - * that is passed to retro_set_controller_port_device() when that function - * is called to indicate to the core that the frontend has changed the - * active device subclass. SEE ALSO: retro_set_controller_port_device() - * - * The ascending input port indexes provided by the core in the struct - * are generally presented by frontends as ascending User # or Player #, - * such as Player 1, Player 2, Player 3, etc. Which device subclasses are - * supported can vary per input port. - * - * The first inner element of each entry in the retro_controller_info array - * is a retro_controller_description struct that specifies the names and - * codes of all device subclasses that are available for the corresponding - * User or Player, beginning with the generic Libretro device that the - * subclasses are derived from. The second inner element of each entry is the - * total number of subclasses that are listed in the retro_controller_description. - * - * NOTE: Even if special device types are set in the libretro core, - * libretro should only poll input based on the base input device types. - */ +/* const struct retro_controller_info * -- + * This environment call lets a libretro core tell the frontend + * which controller subclasses are recognized in calls to + * retro_set_controller_port_device(). + * + * Some emulators such as Super Nintendo support multiple lightgun + * types which must be specifically selected from. It is therefore + * sometimes necessary for a frontend to be able to tell the core + * about a special kind of input device which is not specifcally + * provided by the Libretro API. + * + * In order for a frontend to understand the workings of those devices, + * they must be defined as a specialized subclass of the generic device + * types already defined in the libretro API. + * + * The core must pass an array of const struct retro_controller_info which + * is terminated with a blanked out struct. Each element of the + * retro_controller_info struct corresponds to the ascending port index + * that is passed to retro_set_controller_port_device() when that function + * is called to indicate to the core that the frontend has changed the + * active device subclass. SEE ALSO: retro_set_controller_port_device() + * + * The ascending input port indexes provided by the core in the struct + * are generally presented by frontends as ascending User # or Player #, + * such as Player 1, Player 2, Player 3, etc. Which device subclasses are + * supported can vary per input port. + * + * The first inner element of each entry in the retro_controller_info array + * is a retro_controller_description struct that specifies the names and + * codes of all device subclasses that are available for the corresponding + * User or Player, beginning with the generic Libretro device that the + * subclasses are derived from. The second inner element of each entry is the + * total number of subclasses that are listed in the retro_controller_description. + * + * NOTE: Even if special device types are set in the libretro core, + * libretro should only poll input based on the base input device types. + */ #define RETRO_ENVIRONMENT_SET_MEMORY_MAPS (36 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* const struct retro_memory_map * -- - * This environment call lets a libretro core tell the frontend - * about the memory maps this core emulates. - * This can be used to implement, for example, cheats in a core-agnostic way. - * - * Should only be used by emulators; it doesn't make much sense for - * anything else. - * It is recommended to expose all relevant pointers through - * retro_get_memory_* as well. - * - * Can be called from retro_init and retro_load_game. - */ +/* const struct retro_memory_map * -- + * This environment call lets a libretro core tell the frontend + * about the memory maps this core emulates. + * This can be used to implement, for example, cheats in a core-agnostic way. + * + * Should only be used by emulators; it doesn't make much sense for + * anything else. + * It is recommended to expose all relevant pointers through + * retro_get_memory_* as well. + * + * Can be called from retro_init and retro_load_game. + */ #define RETRO_ENVIRONMENT_SET_GEOMETRY 37 - /* const struct retro_game_geometry * -- - * This environment call is similar to SET_SYSTEM_AV_INFO for changing - * video parameters, but provides a guarantee that drivers will not be - * reinitialized. - * This can only be called from within retro_run(). - * - * The purpose of this call is to allow a core to alter nominal - * width/heights as well as aspect ratios on-the-fly, which can be - * useful for some emulators to change in run-time. - * - * max_width/max_height arguments are ignored and cannot be changed - * with this call as this could potentially require a reinitialization or a - * non-constant time operation. - * If max_width/max_height are to be changed, SET_SYSTEM_AV_INFO is required. - * - * A frontend must guarantee that this environment call completes in - * constant time. - */ +/* const struct retro_game_geometry * -- + * This environment call is similar to SET_SYSTEM_AV_INFO for changing + * video parameters, but provides a guarantee that drivers will not be + * reinitialized. + * This can only be called from within retro_run(). + * + * The purpose of this call is to allow a core to alter nominal + * width/heights as well as aspect ratios on-the-fly, which can be + * useful for some emulators to change in run-time. + * + * max_width/max_height arguments are ignored and cannot be changed + * with this call as this could potentially require a reinitialization or a + * non-constant time operation. + * If max_width/max_height are to be changed, SET_SYSTEM_AV_INFO is required. + * + * A frontend must guarantee that this environment call completes in + * constant time. + */ #define RETRO_ENVIRONMENT_GET_USERNAME 38 - /* const char ** - * Returns the specified username of the frontend, if specified by the user. - * This username can be used as a nickname for a core that has online facilities - * or any other mode where personalization of the user is desirable. - * The returned value can be NULL. - * If this environ callback is used by a core that requires a valid username, - * a default username should be specified by the core. - */ +/* const char ** + * Returns the specified username of the frontend, if specified by the user. + * This username can be used as a nickname for a core that has online facilities + * or any other mode where personalization of the user is desirable. + * The returned value can be NULL. + * If this environ callback is used by a core that requires a valid username, + * a default username should be specified by the core. + */ #define RETRO_ENVIRONMENT_GET_LANGUAGE 39 - /* unsigned * -- - * Returns the specified language of the frontend, if specified by the user. - * It can be used by the core for localization purposes. - */ +/* unsigned * -- + * Returns the specified language of the frontend, if specified by the user. + * It can be used by the core for localization purposes. + */ #define RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER (40 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_framebuffer * -- - * Returns a preallocated framebuffer which the core can use for rendering - * the frame into when not using SET_HW_RENDER. - * The framebuffer returned from this call must not be used - * after the current call to retro_run() returns. - * - * The goal of this call is to allow zero-copy behavior where a core - * can render directly into video memory, avoiding extra bandwidth cost by copying - * memory from core to video memory. - * - * If this call succeeds and the core renders into it, - * the framebuffer pointer and pitch can be passed to retro_video_refresh_t. - * If the buffer from GET_CURRENT_SOFTWARE_FRAMEBUFFER is to be used, - * the core must pass the exact - * same pointer as returned by GET_CURRENT_SOFTWARE_FRAMEBUFFER; - * i.e. passing a pointer which is offset from the - * buffer is undefined. The width, height and pitch parameters - * must also match exactly to the values obtained from GET_CURRENT_SOFTWARE_FRAMEBUFFER. - * - * It is possible for a frontend to return a different pixel format - * than the one used in SET_PIXEL_FORMAT. This can happen if the frontend - * needs to perform conversion. - * - * It is still valid for a core to render to a different buffer - * even if GET_CURRENT_SOFTWARE_FRAMEBUFFER succeeds. - * - * A frontend must make sure that the pointer obtained from this function is - * writeable (and readable). - */ +/* struct retro_framebuffer * -- + * Returns a preallocated framebuffer which the core can use for rendering + * the frame into when not using SET_HW_RENDER. + * The framebuffer returned from this call must not be used + * after the current call to retro_run() returns. + * + * The goal of this call is to allow zero-copy behavior where a core + * can render directly into video memory, avoiding extra bandwidth cost by copying + * memory from core to video memory. + * + * If this call succeeds and the core renders into it, + * the framebuffer pointer and pitch can be passed to retro_video_refresh_t. + * If the buffer from GET_CURRENT_SOFTWARE_FRAMEBUFFER is to be used, + * the core must pass the exact + * same pointer as returned by GET_CURRENT_SOFTWARE_FRAMEBUFFER; + * i.e. passing a pointer which is offset from the + * buffer is undefined. The width, height and pitch parameters + * must also match exactly to the values obtained from GET_CURRENT_SOFTWARE_FRAMEBUFFER. + * + * It is possible for a frontend to return a different pixel format + * than the one used in SET_PIXEL_FORMAT. This can happen if the frontend + * needs to perform conversion. + * + * It is still valid for a core to render to a different buffer + * even if GET_CURRENT_SOFTWARE_FRAMEBUFFER succeeds. + * + * A frontend must make sure that the pointer obtained from this function is + * writeable (and readable). + */ #define RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE (41 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* const struct retro_hw_render_interface ** -- - * Returns an API specific rendering interface for accessing API specific data. - * Not all HW rendering APIs support or need this. - * The contents of the returned pointer is specific to the rendering API - * being used. See the various headers like libretro_vulkan.h, etc. - * - * GET_HW_RENDER_INTERFACE cannot be called before context_reset has been called. - * Similarly, after context_destroyed callback returns, - * the contents of the HW_RENDER_INTERFACE are invalidated. - */ +/* const struct retro_hw_render_interface ** -- + * Returns an API specific rendering interface for accessing API specific data. + * Not all HW rendering APIs support or need this. + * The contents of the returned pointer is specific to the rendering API + * being used. See the various headers like libretro_vulkan.h, etc. + * + * GET_HW_RENDER_INTERFACE cannot be called before context_reset has been called. + * Similarly, after context_destroyed callback returns, + * the contents of the HW_RENDER_INTERFACE are invalidated. + */ #define RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS (42 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* const bool * -- - * If true, the libretro implementation supports achievements - * either via memory descriptors set with RETRO_ENVIRONMENT_SET_MEMORY_MAPS - * or via retro_get_memory_data/retro_get_memory_size. - * - * This must be called before the first call to retro_run. - */ +/* const bool * -- + * If true, the libretro implementation supports achievements + * either via memory descriptors set with RETRO_ENVIRONMENT_SET_MEMORY_MAPS + * or via retro_get_memory_data/retro_get_memory_size. + * + * This must be called before the first call to retro_run. + */ #define RETRO_ENVIRONMENT_SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE (43 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* const struct retro_hw_render_context_negotiation_interface * -- - * Sets an interface which lets the libretro core negotiate with frontend how a context is created. - * The semantics of this interface depends on which API is used in SET_HW_RENDER earlier. - * This interface will be used when the frontend is trying to create a HW rendering context, - * so it will be used after SET_HW_RENDER, but before the context_reset callback. - */ +/* const struct retro_hw_render_context_negotiation_interface * -- + * Sets an interface which lets the libretro core negotiate with frontend how a context is created. + * The semantics of this interface depends on which API is used in SET_HW_RENDER earlier. + * This interface will be used when the frontend is trying to create a HW rendering context, + * so it will be used after SET_HW_RENDER, but before the context_reset callback. + */ #define RETRO_ENVIRONMENT_SET_SERIALIZATION_QUIRKS 44 - /* uint64_t * -- - * Sets quirk flags associated with serialization. The frontend will zero any flags it doesn't - * recognize or support. Should be set in either retro_init or retro_load_game, but not both. - */ +/* uint64_t * -- + * Sets quirk flags associated with serialization. The frontend will zero any flags it doesn't + * recognize or support. Should be set in either retro_init or retro_load_game, but not both. + */ #define RETRO_ENVIRONMENT_SET_HW_SHARED_CONTEXT (44 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* N/A (null) * -- - * The frontend will try to use a 'shared' hardware context (mostly applicable - * to OpenGL) when a hardware context is being set up. - * - * Returns true if the frontend supports shared hardware contexts and false - * if the frontend does not support shared hardware contexts. - * - * This will do nothing on its own until SET_HW_RENDER env callbacks are - * being used. - */ +/* N/A (null) * -- + * The frontend will try to use a 'shared' hardware context (mostly applicable + * to OpenGL) when a hardware context is being set up. + * + * Returns true if the frontend supports shared hardware contexts and false + * if the frontend does not support shared hardware contexts. + * + * This will do nothing on its own until SET_HW_RENDER env callbacks are + * being used. + */ #define RETRO_ENVIRONMENT_GET_VFS_INTERFACE (45 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_vfs_interface_info * -- - * Gets access to the VFS interface. - * VFS presence needs to be queried prior to load_game or any - * get_system/save/other_directory being called to let front end know - * core supports VFS before it starts handing out paths. - * It is recomended to do so in retro_set_environment - */ +/* struct retro_vfs_interface_info * -- + * Gets access to the VFS interface. + * VFS presence needs to be queried prior to load_game or any + * get_system/save/other_directory being called to let front end know + * core supports VFS before it starts handing out paths. + * It is recomended to do so in retro_set_environment + */ #define RETRO_ENVIRONMENT_GET_LED_INTERFACE (46 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_led_interface * -- - * Gets an interface which is used by a libretro core to set - * state of LEDs. - */ +/* struct retro_led_interface * -- + * Gets an interface which is used by a libretro core to set + * state of LEDs. + */ #define RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE (47 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* int * -- - * Tells the core if the frontend wants audio or video. - * If disabled, the frontend will discard the audio or video, - * so the core may decide to skip generating a frame or generating audio. - * This is mainly used for increasing performance. - * Bit 0 (value 1): Enable Video - * Bit 1 (value 2): Enable Audio - * Bit 2 (value 4): Use Fast Savestates. - * Bit 3 (value 8): Hard Disable Audio - * Other bits are reserved for future use and will default to zero. - * If video is disabled: - * * The frontend wants the core to not generate any video, - * including presenting frames via hardware acceleration. - * * The frontend's video frame callback will do nothing. - * * After running the frame, the video output of the next frame should be - * no different than if video was enabled, and saving and loading state - * should have no issues. - * If audio is disabled: - * * The frontend wants the core to not generate any audio. - * * The frontend's audio callbacks will do nothing. - * * After running the frame, the audio output of the next frame should be - * no different than if audio was enabled, and saving and loading state - * should have no issues. - * Fast Savestates: - * * Guaranteed to be created by the same binary that will load them. - * * Will not be written to or read from the disk. - * * Suggest that the core assumes loading state will succeed. - * * Suggest that the core updates its memory buffers in-place if possible. - * * Suggest that the core skips clearing memory. - * * Suggest that the core skips resetting the system. - * * Suggest that the core may skip validation steps. - * Hard Disable Audio: - * * Used for a secondary core when running ahead. - * * Indicates that the frontend will never need audio from the core. - * * Suggests that the core may stop synthesizing audio, but this should not - * compromise emulation accuracy. - * * Audio output for the next frame does not matter, and the frontend will - * never need an accurate audio state in the future. - * * State will never be saved when using Hard Disable Audio. - */ +/* int * -- + * Tells the core if the frontend wants audio or video. + * If disabled, the frontend will discard the audio or video, + * so the core may decide to skip generating a frame or generating audio. + * This is mainly used for increasing performance. + * Bit 0 (value 1): Enable Video + * Bit 1 (value 2): Enable Audio + * Bit 2 (value 4): Use Fast Savestates. + * Bit 3 (value 8): Hard Disable Audio + * Other bits are reserved for future use and will default to zero. + * If video is disabled: + * * The frontend wants the core to not generate any video, + * including presenting frames via hardware acceleration. + * * The frontend's video frame callback will do nothing. + * * After running the frame, the video output of the next frame should be + * no different than if video was enabled, and saving and loading state + * should have no issues. + * If audio is disabled: + * * The frontend wants the core to not generate any audio. + * * The frontend's audio callbacks will do nothing. + * * After running the frame, the audio output of the next frame should be + * no different than if audio was enabled, and saving and loading state + * should have no issues. + * Fast Savestates: + * * Guaranteed to be created by the same binary that will load them. + * * Will not be written to or read from the disk. + * * Suggest that the core assumes loading state will succeed. + * * Suggest that the core updates its memory buffers in-place if possible. + * * Suggest that the core skips clearing memory. + * * Suggest that the core skips resetting the system. + * * Suggest that the core may skip validation steps. + * Hard Disable Audio: + * * Used for a secondary core when running ahead. + * * Indicates that the frontend will never need audio from the core. + * * Suggests that the core may stop synthesizing audio, but this should not + * compromise emulation accuracy. + * * Audio output for the next frame does not matter, and the frontend will + * never need an accurate audio state in the future. + * * State will never be saved when using Hard Disable Audio. + */ #define RETRO_ENVIRONMENT_GET_MIDI_INTERFACE (48 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* struct retro_midi_interface ** -- - * Returns a MIDI interface that can be used for raw data I/O. - */ +/* struct retro_midi_interface ** -- + * Returns a MIDI interface that can be used for raw data I/O. + */ #define RETRO_ENVIRONMENT_GET_FASTFORWARDING (49 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* bool * -- - * Boolean value that indicates whether or not the frontend is in - * fastforwarding mode. - */ +/* bool * -- +* Boolean value that indicates whether or not the frontend is in +* fastforwarding mode. +*/ #define RETRO_ENVIRONMENT_GET_TARGET_REFRESH_RATE (50 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* float * -- - * Float value that lets us know what target refresh rate - * is curently in use by the frontend. - * - * The core can use the returned value to set an ideal - * refresh rate/framerate. - */ +/* float * -- +* Float value that lets us know what target refresh rate +* is curently in use by the frontend. +* +* The core can use the returned value to set an ideal +* refresh rate/framerate. +*/ #define RETRO_ENVIRONMENT_GET_INPUT_BITMASKS (51 | RETRO_ENVIRONMENT_EXPERIMENTAL) - /* bool * -- - * Boolean value that indicates whether or not the frontend supports - * input bitmasks being returned by retro_input_state_t. The advantage - * of this is that retro_input_state_t has to be only called once to - * grab all button states instead of multiple times. - * - * If it returns true, you can pass RETRO_DEVICE_ID_JOYPAD_MASK as 'id' - * to retro_input_state_t (make sure 'device' is set to RETRO_DEVICE_JOYPAD). - * It will return a bitmask of all the digital buttons. - */ +/* bool * -- +* Boolean value that indicates whether or not the frontend supports +* input bitmasks being returned by retro_input_state_t. The advantage +* of this is that retro_input_state_t has to be only called once to +* grab all button states instead of multiple times. +* +* If it returns true, you can pass RETRO_DEVICE_ID_JOYPAD_MASK as 'id' +* to retro_input_state_t (make sure 'device' is set to RETRO_DEVICE_JOYPAD). +* It will return a bitmask of all the digital buttons. +*/ #define RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION 52 - /* unsigned * -- - * Unsigned value is the API version number of the core options - * interface supported by the frontend. If callback return false, - * API version is assumed to be 0. - * - * In legacy code, core options are set by passing an array of - * retro_variable structs to RETRO_ENVIRONMENT_SET_VARIABLES. - * This may be still be done regardless of the core options - * interface version. - * - * If version is >= 1 however, core options may instead be set by - * passing an array of retro_core_option_definition structs to - * RETRO_ENVIRONMENT_SET_CORE_OPTIONS, or a 2D array of - * retro_core_option_definition structs to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL. - * This allows the core to additionally set option sublabel information - * and/or provide localisation support. - */ +/* unsigned * -- + * Unsigned value is the API version number of the core options + * interface supported by the frontend. If callback return false, + * API version is assumed to be 0. + * + * In legacy code, core options are set by passing an array of + * retro_variable structs to RETRO_ENVIRONMENT_SET_VARIABLES. + * This may be still be done regardless of the core options + * interface version. + * + * If version is >= 1 however, core options may instead be set by + * passing an array of retro_core_option_definition structs to + * RETRO_ENVIRONMENT_SET_CORE_OPTIONS, or a 2D array of + * retro_core_option_definition structs to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL. + * This allows the core to additionally set option sublabel information + * and/or provide localisation support. + */ #define RETRO_ENVIRONMENT_SET_CORE_OPTIONS 53 - /* const struct retro_core_option_definition ** -- - * Allows an implementation to signal the environment - * which variables it might want to check for later using - * GET_VARIABLE. - * This allows the frontend to present these variables to - * a user dynamically. - * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION - * returns an API version of >= 1. - * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. - * This should be called the first time as early as - * possible (ideally in retro_set_environment). - * Afterwards it may be called again for the core to communicate - * updated options to the frontend, but the number of core - * options must not change from the number in the initial call. - * - * 'data' points to an array of retro_core_option_definition structs - * terminated by a { NULL, NULL, NULL, {{0}}, NULL } element. - * retro_core_option_definition::key should be namespaced to not collide - * with other implementations' keys. e.g. A core called - * 'foo' should use keys named as 'foo_option'. - * retro_core_option_definition::desc should contain a human readable - * description of the key. - * retro_core_option_definition::info should contain any additional human - * readable information text that a typical user may need to - * understand the functionality of the option. - * retro_core_option_definition::values is an array of retro_core_option_value - * structs terminated by a { NULL, NULL } element. - * > retro_core_option_definition::values[index].value is an expected option - * value. - * > retro_core_option_definition::values[index].label is a human readable - * label used when displaying the value on screen. If NULL, - * the value itself is used. - * retro_core_option_definition::default_value is the default core option - * setting. It must match one of the expected option values in the - * retro_core_option_definition::values array. If it does not, or the - * default value is NULL, the first entry in the - * retro_core_option_definition::values array is treated as the default. - * - * The number of possible options should be very limited, - * and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX. - * i.e. it should be feasible to cycle through options - * without a keyboard. - * - * Example entry: - * { - * "foo_option", - * "Speed hack coprocessor X", - * "Provides increased performance at the expense of reduced accuracy", - * { - * { "false", NULL }, - * { "true", NULL }, - * { "unstable", "Turbo (Unstable)" }, - * { NULL, NULL }, - * }, - * "false" - * } - * - * Only strings are operated on. The possible values will - * generally be displayed and stored as-is by the frontend. - */ +/* const struct retro_core_option_definition ** -- + * Allows an implementation to signal the environment + * which variables it might want to check for later using + * GET_VARIABLE. + * This allows the frontend to present these variables to + * a user dynamically. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 1. + * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. + * This should be called the first time as early as + * possible (ideally in retro_set_environment). + * Afterwards it may be called again for the core to communicate + * updated options to the frontend, but the number of core + * options must not change from the number in the initial call. + * + * 'data' points to an array of retro_core_option_definition structs + * terminated by a { NULL, NULL, NULL, {{0}}, NULL } element. + * retro_core_option_definition::key should be namespaced to not collide + * with other implementations' keys. e.g. A core called + * 'foo' should use keys named as 'foo_option'. + * retro_core_option_definition::desc should contain a human readable + * description of the key. + * retro_core_option_definition::info should contain any additional human + * readable information text that a typical user may need to + * understand the functionality of the option. + * retro_core_option_definition::values is an array of retro_core_option_value + * structs terminated by a { NULL, NULL } element. + * > retro_core_option_definition::values[index].value is an expected option + * value. + * > retro_core_option_definition::values[index].label is a human readable + * label used when displaying the value on screen. If NULL, + * the value itself is used. + * retro_core_option_definition::default_value is the default core option + * setting. It must match one of the expected option values in the + * retro_core_option_definition::values array. If it does not, or the + * default value is NULL, the first entry in the + * retro_core_option_definition::values array is treated as the default. + * + * The number of possible options should be very limited, + * and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX. + * i.e. it should be feasible to cycle through options + * without a keyboard. + * + * Example entry: + * { + * "foo_option", + * "Speed hack coprocessor X", + * "Provides increased performance at the expense of reduced accuracy", + * { + * { "false", NULL }, + * { "true", NULL }, + * { "unstable", "Turbo (Unstable)" }, + * { NULL, NULL }, + * }, + * "false" + * } + * + * Only strings are operated on. The possible values will + * generally be displayed and stored as-is by the frontend. + */ #define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL 54 - /* const struct retro_core_options_intl * -- - * Allows an implementation to signal the environment - * which variables it might want to check for later using - * GET_VARIABLE. - * This allows the frontend to present these variables to - * a user dynamically. - * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION - * returns an API version of >= 1. - * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. - * This should be called the first time as early as - * possible (ideally in retro_set_environment). - * Afterwards it may be called again for the core to communicate - * updated options to the frontend, but the number of core - * options must not change from the number in the initial call. - * - * This is fundamentally the same as RETRO_ENVIRONMENT_SET_CORE_OPTIONS, - * with the addition of localisation support. The description of the - * RETRO_ENVIRONMENT_SET_CORE_OPTIONS callback should be consulted - * for further details. - * - * 'data' points to a retro_core_options_intl struct. - * - * retro_core_options_intl::us is a pointer to an array of - * retro_core_option_definition structs defining the US English - * core options implementation. It must point to a valid array. - * - * retro_core_options_intl::local is a pointer to an array of - * retro_core_option_definition structs defining core options for - * the current frontend language. It may be NULL (in which case - * retro_core_options_intl::us is used by the frontend). Any items - * missing from this array will be read from retro_core_options_intl::us - * instead. - * - * NOTE: Default core option values are always taken from the - * retro_core_options_intl::us array. Any default values in - * retro_core_options_intl::local array will be ignored. - */ +/* const struct retro_core_options_intl * -- + * Allows an implementation to signal the environment + * which variables it might want to check for later using + * GET_VARIABLE. + * This allows the frontend to present these variables to + * a user dynamically. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 1. + * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. + * This should be called the first time as early as + * possible (ideally in retro_set_environment). + * Afterwards it may be called again for the core to communicate + * updated options to the frontend, but the number of core + * options must not change from the number in the initial call. + * + * This is fundamentally the same as RETRO_ENVIRONMENT_SET_CORE_OPTIONS, + * with the addition of localisation support. The description of the + * RETRO_ENVIRONMENT_SET_CORE_OPTIONS callback should be consulted + * for further details. + * + * 'data' points to a retro_core_options_intl struct. + * + * retro_core_options_intl::us is a pointer to an array of + * retro_core_option_definition structs defining the US English + * core options implementation. It must point to a valid array. + * + * retro_core_options_intl::local is a pointer to an array of + * retro_core_option_definition structs defining core options for + * the current frontend language. It may be NULL (in which case + * retro_core_options_intl::us is used by the frontend). Any items + * missing from this array will be read from retro_core_options_intl::us + * instead. + * + * NOTE: Default core option values are always taken from the + * retro_core_options_intl::us array. Any default values in + * retro_core_options_intl::local array will be ignored. + */ #define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY 55 - /* struct retro_core_option_display * -- - * - * Allows an implementation to signal the environment to show - * or hide a variable when displaying core options. This is - * considered a *suggestion*. The frontend is free to ignore - * this callback, and its implementation not considered mandatory. - * - * 'data' points to a retro_core_option_display struct - * - * retro_core_option_display::key is a variable identifier - * which has already been set by SET_VARIABLES/SET_CORE_OPTIONS. - * - * retro_core_option_display::visible is a boolean, specifying - * whether variable should be displayed - * - * Note that all core option variables will be set visible by - * default when calling SET_VARIABLES/SET_CORE_OPTIONS. - */ +/* struct retro_core_option_display * -- + * + * Allows an implementation to signal the environment to show + * or hide a variable when displaying core options. This is + * considered a *suggestion*. The frontend is free to ignore + * this callback, and its implementation not considered mandatory. + * + * 'data' points to a retro_core_option_display struct + * + * retro_core_option_display::key is a variable identifier + * which has already been set by SET_VARIABLES/SET_CORE_OPTIONS. + * + * retro_core_option_display::visible is a boolean, specifying + * whether variable should be displayed + * + * Note that all core option variables will be set visible by + * default when calling SET_VARIABLES/SET_CORE_OPTIONS. + */ #define RETRO_ENVIRONMENT_GET_PREFERRED_HW_RENDER 56 - /* unsigned * -- - * - * Allows an implementation to ask frontend preferred hardware - * context to use. Core should use this information to deal - * with what specific context to request with SET_HW_RENDER. - * - * 'data' points to an unsigned variable - */ +/* unsigned * -- + * + * Allows an implementation to ask frontend preferred hardware + * context to use. Core should use this information to deal + * with what specific context to request with SET_HW_RENDER. + * + * 'data' points to an unsigned variable + */ #define RETRO_ENVIRONMENT_GET_DISK_CONTROL_INTERFACE_VERSION 57 - /* unsigned * -- - * Unsigned value is the API version number of the disk control - * interface supported by the frontend. If callback return false, - * API version is assumed to be 0. - * - * In legacy code, the disk control interface is defined by passing - * a struct of type retro_disk_control_callback to - * RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. - * This may be still be done regardless of the disk control - * interface version. - * - * If version is >= 1 however, the disk control interface may - * instead be defined by passing a struct of type - * retro_disk_control_ext_callback to - * RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE. - * This allows the core to provide additional information about - * disk images to the frontend and/or enables extra - * disk control functionality by the frontend. - */ +/* unsigned * -- + * Unsigned value is the API version number of the disk control + * interface supported by the frontend. If callback return false, + * API version is assumed to be 0. + * + * In legacy code, the disk control interface is defined by passing + * a struct of type retro_disk_control_callback to + * RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. + * This may be still be done regardless of the disk control + * interface version. + * + * If version is >= 1 however, the disk control interface may + * instead be defined by passing a struct of type + * retro_disk_control_ext_callback to + * RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE. + * This allows the core to provide additional information about + * disk images to the frontend and/or enables extra + * disk control functionality by the frontend. + */ #define RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE 58 - /* const struct retro_disk_control_ext_callback * -- - * Sets an interface which frontend can use to eject and insert - * disk images, and also obtain information about individual - * disk image files registered by the core. - * This is used for games which consist of multiple images and - * must be manually swapped out by the user (e.g. PSX, floppy disk - * based systems). - */ +/* const struct retro_disk_control_ext_callback * -- + * Sets an interface which frontend can use to eject and insert + * disk images, and also obtain information about individual + * disk image files registered by the core. + * This is used for games which consist of multiple images and + * must be manually swapped out by the user (e.g. PSX, floppy disk + * based systems). + */ /* VFS functionality */ @@ -1339,90 +1339,92 @@ struct retro_vfs_dir_handle; /* Get path from opaque handle. Returns the exact same path passed to file_open when getting the handle * Introduced in VFS API v1 */ -typedef const char *(RETRO_CALLCONV *retro_vfs_get_path_t)(struct retro_vfs_file_handle *stream); +typedef const char*(RETRO_CALLCONV *retro_vfs_get_path_t)(struct retro_vfs_file_handle* stream); /* Open a file for reading or writing. If path points to a directory, this will * fail. Returns the opaque file handle, or NULL for error. * Introduced in VFS API v1 */ -typedef struct retro_vfs_file_handle *(RETRO_CALLCONV *retro_vfs_open_t)(const char *path, unsigned mode, unsigned hints); +typedef struct retro_vfs_file_handle*(RETRO_CALLCONV *retro_vfs_open_t +)(const char* path, unsigned mode, unsigned hints); /* Close the file and release its resources. Must be called if open_file returns non-NULL. Returns 0 on success, -1 on failure. * Whether the call succeeds ot not, the handle passed as parameter becomes invalid and should no longer be used. * Introduced in VFS API v1 */ -typedef int (RETRO_CALLCONV *retro_vfs_close_t)(struct retro_vfs_file_handle *stream); +typedef int (RETRO_CALLCONV *retro_vfs_close_t)(struct retro_vfs_file_handle* stream); /* Return the size of the file in bytes, or -1 for error. * Introduced in VFS API v1 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_size_t)(struct retro_vfs_file_handle *stream); +typedef int64_t (RETRO_CALLCONV *retro_vfs_size_t)(struct retro_vfs_file_handle* stream); /* Truncate file to specified size. Returns 0 on success or -1 on error * Introduced in VFS API v2 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_truncate_t)(struct retro_vfs_file_handle *stream, int64_t length); +typedef int64_t (RETRO_CALLCONV *retro_vfs_truncate_t)(struct retro_vfs_file_handle* stream, int64_t length); /* Get the current read / write position for the file. Returns -1 for error. * Introduced in VFS API v1 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_tell_t)(struct retro_vfs_file_handle *stream); +typedef int64_t (RETRO_CALLCONV *retro_vfs_tell_t)(struct retro_vfs_file_handle* stream); /* Set the current read/write position for the file. Returns the new position, -1 for error. * Introduced in VFS API v1 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_seek_t)(struct retro_vfs_file_handle *stream, int64_t offset, int seek_position); +typedef int64_t (RETRO_CALLCONV *retro_vfs_seek_t)(struct retro_vfs_file_handle* stream, int64_t offset, + int seek_position); /* Read data from a file. Returns the number of bytes read, or -1 for error. * Introduced in VFS API v1 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_read_t)(struct retro_vfs_file_handle *stream, void *s, uint64_t len); +typedef int64_t (RETRO_CALLCONV *retro_vfs_read_t)(struct retro_vfs_file_handle* stream, void* s, uint64_t len); /* Write data to a file. Returns the number of bytes written, or -1 for error. * Introduced in VFS API v1 */ -typedef int64_t (RETRO_CALLCONV *retro_vfs_write_t)(struct retro_vfs_file_handle *stream, const void *s, uint64_t len); +typedef int64_t (RETRO_CALLCONV *retro_vfs_write_t)(struct retro_vfs_file_handle* stream, const void* s, uint64_t len); /* Flush pending writes to file, if using buffered IO. Returns 0 on sucess, or -1 on failure. * Introduced in VFS API v1 */ -typedef int (RETRO_CALLCONV *retro_vfs_flush_t)(struct retro_vfs_file_handle *stream); +typedef int (RETRO_CALLCONV *retro_vfs_flush_t)(struct retro_vfs_file_handle* stream); /* Delete the specified file. Returns 0 on success, -1 on failure * Introduced in VFS API v1 */ -typedef int (RETRO_CALLCONV *retro_vfs_remove_t)(const char *path); +typedef int (RETRO_CALLCONV *retro_vfs_remove_t)(const char* path); /* Rename the specified file. Returns 0 on success, -1 on failure * Introduced in VFS API v1 */ -typedef int (RETRO_CALLCONV *retro_vfs_rename_t)(const char *old_path, const char *new_path); +typedef int (RETRO_CALLCONV *retro_vfs_rename_t)(const char* old_path, const char* new_path); /* Stat the specified file. Retruns a bitmask of RETRO_VFS_STAT_* flags, none are set if path was not valid. * Additionally stores file size in given variable, unless NULL is given. * Introduced in VFS API v3 */ -typedef int (RETRO_CALLCONV *retro_vfs_stat_t)(const char *path, int32_t *size); +typedef int (RETRO_CALLCONV *retro_vfs_stat_t)(const char* path, int32_t* size); /* Create the specified directory. Returns 0 on success, -1 on unknown failure, -2 if already exists. * Introduced in VFS API v3 */ -typedef int (RETRO_CALLCONV *retro_vfs_mkdir_t)(const char *dir); +typedef int (RETRO_CALLCONV *retro_vfs_mkdir_t)(const char* dir); /* Open the specified directory for listing. Returns the opaque dir handle, or NULL for error. * Support for the include_hidden argument may vary depending on the platform. * Introduced in VFS API v3 */ -typedef struct retro_vfs_dir_handle *(RETRO_CALLCONV *retro_vfs_opendir_t)(const char *dir, bool include_hidden); +typedef struct retro_vfs_dir_handle*(RETRO_CALLCONV *retro_vfs_opendir_t)(const char* dir, bool include_hidden); /* Read the directory entry at the current position, and move the read pointer to the next position. * Returns true on success, false if already on the last entry. * Introduced in VFS API v3 */ -typedef bool (RETRO_CALLCONV *retro_vfs_readdir_t)(struct retro_vfs_dir_handle *dirstream); +typedef bool (RETRO_CALLCONV *retro_vfs_readdir_t)(struct retro_vfs_dir_handle* dirstream); /* Get the name of the last entry read. Returns a string on success, or NULL for error. * The returned string pointer is valid until the next call to readdir or closedir. * Introduced in VFS API v3 */ -typedef const char *(RETRO_CALLCONV *retro_vfs_dirent_get_name_t)(struct retro_vfs_dir_handle *dirstream); +typedef const char*(RETRO_CALLCONV *retro_vfs_dirent_get_name_t)(struct retro_vfs_dir_handle* dirstream); /* Check if the last entry read was a directory. Returns true if it was, false otherwise (or on error). * Introduced in VFS API v3 */ -typedef bool (RETRO_CALLCONV *retro_vfs_dirent_is_dir_t)(struct retro_vfs_dir_handle *dirstream); +typedef bool (RETRO_CALLCONV *retro_vfs_dirent_is_dir_t)(struct retro_vfs_dir_handle* dirstream); /* Close the directory and release its resources. Must be called if opendir returns non-NULL. Returns 0 on success, -1 on failure. * Whether the call succeeds ot not, the handle passed as parameter becomes invalid and should no longer be used. * Introduced in VFS API v3 */ -typedef int (RETRO_CALLCONV *retro_vfs_closedir_t)(struct retro_vfs_dir_handle *dirstream); +typedef int (RETRO_CALLCONV *retro_vfs_closedir_t)(struct retro_vfs_dir_handle* dirstream); struct retro_vfs_interface { - /* VFS API v1 */ + /* VFS API v1 */ retro_vfs_get_path_t get_path; retro_vfs_open_t open; retro_vfs_close_t close; @@ -1434,54 +1436,55 @@ struct retro_vfs_interface retro_vfs_flush_t flush; retro_vfs_remove_t remove; retro_vfs_rename_t rename; - /* VFS API v2 */ - retro_vfs_truncate_t truncate; - /* VFS API v3 */ - retro_vfs_stat_t stat; - retro_vfs_mkdir_t mkdir; - retro_vfs_opendir_t opendir; - retro_vfs_readdir_t readdir; - retro_vfs_dirent_get_name_t dirent_get_name; - retro_vfs_dirent_is_dir_t dirent_is_dir; - retro_vfs_closedir_t closedir; + /* VFS API v2 */ + retro_vfs_truncate_t truncate; + /* VFS API v3 */ + retro_vfs_stat_t stat; + retro_vfs_mkdir_t mkdir; + retro_vfs_opendir_t opendir; + retro_vfs_readdir_t readdir; + retro_vfs_dirent_get_name_t dirent_get_name; + retro_vfs_dirent_is_dir_t dirent_is_dir; + retro_vfs_closedir_t closedir; }; struct retro_vfs_interface_info { - /* Set by core: should this be higher than the version the front end supports, - * front end will return false in the RETRO_ENVIRONMENT_GET_VFS_INTERFACE call - * Introduced in VFS API v1 */ - uint32_t required_interface_version; + /* Set by core: should this be higher than the version the front end supports, + * front end will return false in the RETRO_ENVIRONMENT_GET_VFS_INTERFACE call + * Introduced in VFS API v1 */ + uint32_t required_interface_version; - /* Frontend writes interface pointer here. The frontend also sets the actual - * version, must be at least required_interface_version. - * Introduced in VFS API v1 */ - struct retro_vfs_interface *iface; + /* Frontend writes interface pointer here. The frontend also sets the actual + * version, must be at least required_interface_version. + * Introduced in VFS API v1 */ + struct retro_vfs_interface* iface; }; enum retro_hw_render_interface_type { RETRO_HW_RENDER_INTERFACE_VULKAN = 0, - RETRO_HW_RENDER_INTERFACE_D3D9 = 1, - RETRO_HW_RENDER_INTERFACE_D3D10 = 2, - RETRO_HW_RENDER_INTERFACE_D3D11 = 3, - RETRO_HW_RENDER_INTERFACE_D3D12 = 4, - RETRO_HW_RENDER_INTERFACE_GSKIT_PS2 = 5, - RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX + RETRO_HW_RENDER_INTERFACE_D3D9 = 1, + RETRO_HW_RENDER_INTERFACE_D3D10 = 2, + RETRO_HW_RENDER_INTERFACE_D3D11 = 3, + RETRO_HW_RENDER_INTERFACE_D3D12 = 4, + RETRO_HW_RENDER_INTERFACE_GSKIT_PS2 = 5, + RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX }; /* Base struct. All retro_hw_render_interface_* types * contain at least these fields. */ struct retro_hw_render_interface { - enum retro_hw_render_interface_type interface_type; - unsigned interface_version; + enum retro_hw_render_interface_type interface_type; + unsigned interface_version; }; typedef void (RETRO_CALLCONV *retro_set_led_state_t)(int led, int state); + struct retro_led_interface { - retro_set_led_state_t set_led_state; + retro_set_led_state_t set_led_state; }; /* Retrieves the current state of the MIDI input. @@ -1494,7 +1497,7 @@ typedef bool (RETRO_CALLCONV *retro_midi_output_enabled_t)(void); /* Reads next byte from the input stream. * Returns true if byte is read, false otherwise. */ -typedef bool (RETRO_CALLCONV *retro_midi_read_t)(uint8_t *byte); +typedef bool (RETRO_CALLCONV *retro_midi_read_t)(uint8_t* byte); /* Writes byte to the output stream. * 'delta_time' is in microseconds and represent time elapsed since previous write. @@ -1507,25 +1510,25 @@ typedef bool (RETRO_CALLCONV *retro_midi_flush_t)(void); struct retro_midi_interface { - retro_midi_input_enabled_t input_enabled; - retro_midi_output_enabled_t output_enabled; - retro_midi_read_t read; - retro_midi_write_t write; - retro_midi_flush_t flush; + retro_midi_input_enabled_t input_enabled; + retro_midi_output_enabled_t output_enabled; + retro_midi_read_t read; + retro_midi_write_t write; + retro_midi_flush_t flush; }; enum retro_hw_render_context_negotiation_interface_type { - RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN = 0, - RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_DUMMY = INT_MAX + RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN = 0, + RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_DUMMY = INT_MAX }; /* Base struct. All retro_hw_render_context_negotiation_interface_* types * contain at least these fields. */ struct retro_hw_render_context_negotiation_interface { - enum retro_hw_render_context_negotiation_interface_type interface_type; - unsigned interface_version; + enum retro_hw_render_context_negotiation_interface_type interface_type; + unsigned interface_version; }; /* Serialized state is incomplete in some way. Set if serialization is @@ -1563,112 +1566,113 @@ struct retro_hw_render_context_negotiation_interface #define RETRO_MEMDESC_MINSIZE_2 (1 << 24) /* All memory in this region is accessed at least 2 bytes at the time. */ #define RETRO_MEMDESC_MINSIZE_4 (2 << 24) #define RETRO_MEMDESC_MINSIZE_8 (3 << 24) + struct retro_memory_descriptor { - uint64_t flags; + uint64_t flags; - /* Pointer to the start of the relevant ROM or RAM chip. - * It's strongly recommended to use 'offset' if possible, rather than - * doing math on the pointer. - * - * If the same byte is mapped my multiple descriptors, their descriptors - * must have the same pointer. - * If 'start' does not point to the first byte in the pointer, put the - * difference in 'offset' instead. - * - * May be NULL if there's nothing usable here (e.g. hardware registers and - * open bus). No flags should be set if the pointer is NULL. - * It's recommended to minimize the number of descriptors if possible, - * but not mandatory. */ - void *ptr; - size_t offset; + /* Pointer to the start of the relevant ROM or RAM chip. + * It's strongly recommended to use 'offset' if possible, rather than + * doing math on the pointer. + * + * If the same byte is mapped my multiple descriptors, their descriptors + * must have the same pointer. + * If 'start' does not point to the first byte in the pointer, put the + * difference in 'offset' instead. + * + * May be NULL if there's nothing usable here (e.g. hardware registers and + * open bus). No flags should be set if the pointer is NULL. + * It's recommended to minimize the number of descriptors if possible, + * but not mandatory. */ + void* ptr; + size_t offset; - /* This is the location in the emulated address space - * where the mapping starts. */ - size_t start; + /* This is the location in the emulated address space + * where the mapping starts. */ + size_t start; - /* Which bits must be same as in 'start' for this mapping to apply. - * The first memory descriptor to claim a certain byte is the one - * that applies. - * A bit which is set in 'start' must also be set in this. - * Can be zero, in which case each byte is assumed mapped exactly once. - * In this case, 'len' must be a power of two. */ - size_t select; + /* Which bits must be same as in 'start' for this mapping to apply. + * The first memory descriptor to claim a certain byte is the one + * that applies. + * A bit which is set in 'start' must also be set in this. + * Can be zero, in which case each byte is assumed mapped exactly once. + * In this case, 'len' must be a power of two. */ + size_t select; - /* If this is nonzero, the set bits are assumed not connected to the - * memory chip's address pins. */ - size_t disconnect; + /* If this is nonzero, the set bits are assumed not connected to the + * memory chip's address pins. */ + size_t disconnect; - /* This one tells the size of the current memory area. - * If, after start+disconnect are applied, the address is higher than - * this, the highest bit of the address is cleared. - * - * If the address is still too high, the next highest bit is cleared. - * Can be zero, in which case it's assumed to be infinite (as limited - * by 'select' and 'disconnect'). */ - size_t len; + /* This one tells the size of the current memory area. + * If, after start+disconnect are applied, the address is higher than + * this, the highest bit of the address is cleared. + * + * If the address is still too high, the next highest bit is cleared. + * Can be zero, in which case it's assumed to be infinite (as limited + * by 'select' and 'disconnect'). */ + size_t len; - /* To go from emulated address to physical address, the following - * order applies: - * Subtract 'start', pick off 'disconnect', apply 'len', add 'offset'. */ + /* To go from emulated address to physical address, the following + * order applies: + * Subtract 'start', pick off 'disconnect', apply 'len', add 'offset'. */ - /* The address space name must consist of only a-zA-Z0-9_-, - * should be as short as feasible (maximum length is 8 plus the NUL), - * and may not be any other address space plus one or more 0-9A-F - * at the end. - * However, multiple memory descriptors for the same address space is - * allowed, and the address space name can be empty. NULL is treated - * as empty. - * - * Address space names are case sensitive, but avoid lowercase if possible. - * The same pointer may exist in multiple address spaces. - * - * Examples: - * blank+blank - valid (multiple things may be mapped in the same namespace) - * 'Sp'+'Sp' - valid (multiple things may be mapped in the same namespace) - * 'A'+'B' - valid (neither is a prefix of each other) - * 'S'+blank - valid ('S' is not in 0-9A-F) - * 'a'+blank - valid ('a' is not in 0-9A-F) - * 'a'+'A' - valid (neither is a prefix of each other) - * 'AR'+blank - valid ('R' is not in 0-9A-F) - * 'ARB'+blank - valid (the B can't be part of the address either, because - * there is no namespace 'AR') - * blank+'B' - not valid, because it's ambigous which address space B1234 - * would refer to. - * The length can't be used for that purpose; the frontend may want - * to append arbitrary data to an address, without a separator. */ - const char *addrspace; + /* The address space name must consist of only a-zA-Z0-9_-, + * should be as short as feasible (maximum length is 8 plus the NUL), + * and may not be any other address space plus one or more 0-9A-F + * at the end. + * However, multiple memory descriptors for the same address space is + * allowed, and the address space name can be empty. NULL is treated + * as empty. + * + * Address space names are case sensitive, but avoid lowercase if possible. + * The same pointer may exist in multiple address spaces. + * + * Examples: + * blank+blank - valid (multiple things may be mapped in the same namespace) + * 'Sp'+'Sp' - valid (multiple things may be mapped in the same namespace) + * 'A'+'B' - valid (neither is a prefix of each other) + * 'S'+blank - valid ('S' is not in 0-9A-F) + * 'a'+blank - valid ('a' is not in 0-9A-F) + * 'a'+'A' - valid (neither is a prefix of each other) + * 'AR'+blank - valid ('R' is not in 0-9A-F) + * 'ARB'+blank - valid (the B can't be part of the address either, because + * there is no namespace 'AR') + * blank+'B' - not valid, because it's ambigous which address space B1234 + * would refer to. + * The length can't be used for that purpose; the frontend may want + * to append arbitrary data to an address, without a separator. */ + const char* addrspace; - /* TODO: When finalizing this one, add a description field, which should be - * "WRAM" or something roughly equally long. */ + /* TODO: When finalizing this one, add a description field, which should be + * "WRAM" or something roughly equally long. */ - /* TODO: When finalizing this one, replace 'select' with 'limit', which tells - * which bits can vary and still refer to the same address (limit = ~select). - * TODO: limit? range? vary? something else? */ + /* TODO: When finalizing this one, replace 'select' with 'limit', which tells + * which bits can vary and still refer to the same address (limit = ~select). + * TODO: limit? range? vary? something else? */ - /* TODO: When finalizing this one, if 'len' is above what 'select' (or - * 'limit') allows, it's bankswitched. Bankswitched data must have both 'len' - * and 'select' != 0, and the mappings don't tell how the system switches the - * banks. */ + /* TODO: When finalizing this one, if 'len' is above what 'select' (or + * 'limit') allows, it's bankswitched. Bankswitched data must have both 'len' + * and 'select' != 0, and the mappings don't tell how the system switches the + * banks. */ - /* TODO: When finalizing this one, fix the 'len' bit removal order. - * For len=0x1800, pointer 0x1C00 should go to 0x1400, not 0x0C00. - * Algorithm: Take bits highest to lowest, but if it goes above len, clear - * the most recent addition and continue on the next bit. - * TODO: Can the above be optimized? Is "remove the lowest bit set in both - * pointer and 'len'" equivalent? */ + /* TODO: When finalizing this one, fix the 'len' bit removal order. + * For len=0x1800, pointer 0x1C00 should go to 0x1400, not 0x0C00. + * Algorithm: Take bits highest to lowest, but if it goes above len, clear + * the most recent addition and continue on the next bit. + * TODO: Can the above be optimized? Is "remove the lowest bit set in both + * pointer and 'len'" equivalent? */ - /* TODO: Some emulators (MAME?) emulate big endian systems by only accessing - * the emulated memory in 32-bit chunks, native endian. But that's nothing - * compared to Darek Mihocka - * (section Emulation 103 - Nearly Free Byte Reversal) - he flips the ENTIRE - * RAM backwards! I'll want to represent both of those, via some flags. - * - * I suspect MAME either didn't think of that idea, or don't want the #ifdef. - * Not sure which, nor do I really care. */ + /* TODO: Some emulators (MAME?) emulate big endian systems by only accessing + * the emulated memory in 32-bit chunks, native endian. But that's nothing + * compared to Darek Mihocka + * (section Emulation 103 - Nearly Free Byte Reversal) - he flips the ENTIRE + * RAM backwards! I'll want to represent both of those, via some flags. + * + * I suspect MAME either didn't think of that idea, or don't want the #ifdef. + * Not sure which, nor do I really care. */ - /* TODO: Some of those flags are unused and/or don't really make sense. Clean - * them up. */ + /* TODO: Some of those flags are unused and/or don't really make sense. Clean + * them up. */ }; /* The frontend may use the largest value of 'start'+'select' in a @@ -1711,91 +1715,91 @@ struct retro_memory_descriptor struct retro_memory_map { - const struct retro_memory_descriptor *descriptors; - unsigned num_descriptors; + const struct retro_memory_descriptor* descriptors; + unsigned num_descriptors; }; struct retro_controller_description { - /* Human-readable description of the controller. Even if using a generic - * input device type, this can be set to the particular device type the - * core uses. */ - const char *desc; + /* Human-readable description of the controller. Even if using a generic + * input device type, this can be set to the particular device type the + * core uses. */ + const char* desc; - /* Device type passed to retro_set_controller_port_device(). If the device - * type is a sub-class of a generic input device type, use the - * RETRO_DEVICE_SUBCLASS macro to create an ID. - * - * E.g. RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1). */ - unsigned id; + /* Device type passed to retro_set_controller_port_device(). If the device + * type is a sub-class of a generic input device type, use the + * RETRO_DEVICE_SUBCLASS macro to create an ID. + * + * E.g. RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1). */ + unsigned id; }; struct retro_controller_info { - const struct retro_controller_description *types; - unsigned num_types; + const struct retro_controller_description* types; + unsigned num_types; }; struct retro_subsystem_memory_info { - /* The extension associated with a memory type, e.g. "psram". */ - const char *extension; + /* The extension associated with a memory type, e.g. "psram". */ + const char* extension; - /* The memory type for retro_get_memory(). This should be at - * least 0x100 to avoid conflict with standardized - * libretro memory types. */ - unsigned type; + /* The memory type for retro_get_memory(). This should be at + * least 0x100 to avoid conflict with standardized + * libretro memory types. */ + unsigned type; }; struct retro_subsystem_rom_info { - /* Describes what the content is (SGB BIOS, GB ROM, etc). */ - const char *desc; + /* Describes what the content is (SGB BIOS, GB ROM, etc). */ + const char* desc; - /* Same definition as retro_get_system_info(). */ - const char *valid_extensions; + /* Same definition as retro_get_system_info(). */ + const char* valid_extensions; - /* Same definition as retro_get_system_info(). */ - bool need_fullpath; + /* Same definition as retro_get_system_info(). */ + bool need_fullpath; - /* Same definition as retro_get_system_info(). */ - bool block_extract; + /* Same definition as retro_get_system_info(). */ + bool block_extract; - /* This is set if the content is required to load a game. - * If this is set to false, a zeroed-out retro_game_info can be passed. */ - bool required; + /* This is set if the content is required to load a game. + * If this is set to false, a zeroed-out retro_game_info can be passed. */ + bool required; - /* Content can have multiple associated persistent - * memory types (retro_get_memory()). */ - const struct retro_subsystem_memory_info *memory; - unsigned num_memory; + /* Content can have multiple associated persistent + * memory types (retro_get_memory()). */ + const struct retro_subsystem_memory_info* memory; + unsigned num_memory; }; struct retro_subsystem_info { - /* Human-readable string of the subsystem type, e.g. "Super GameBoy" */ - const char *desc; + /* Human-readable string of the subsystem type, e.g. "Super GameBoy" */ + const char* desc; - /* A computer friendly short string identifier for the subsystem type. - * This name must be [a-z]. - * E.g. if desc is "Super GameBoy", this can be "sgb". - * This identifier can be used for command-line interfaces, etc. - */ - const char *ident; + /* A computer friendly short string identifier for the subsystem type. + * This name must be [a-z]. + * E.g. if desc is "Super GameBoy", this can be "sgb". + * This identifier can be used for command-line interfaces, etc. + */ + const char* ident; - /* Infos for each content file. The first entry is assumed to be the - * "most significant" content for frontend purposes. - * E.g. with Super GameBoy, the first content should be the GameBoy ROM, - * as it is the most "significant" content to a user. - * If a frontend creates new file paths based on the content used - * (e.g. savestates), it should use the path for the first ROM to do so. */ - const struct retro_subsystem_rom_info *roms; + /* Infos for each content file. The first entry is assumed to be the + * "most significant" content for frontend purposes. + * E.g. with Super GameBoy, the first content should be the GameBoy ROM, + * as it is the most "significant" content to a user. + * If a frontend creates new file paths based on the content used + * (e.g. savestates), it should use the path for the first ROM to do so. */ + const struct retro_subsystem_rom_info* roms; - /* Number of content files associated with a subsystem. */ - unsigned num_roms; + /* Number of content files associated with a subsystem. */ + unsigned num_roms; - /* The type passed to retro_load_game_special(). */ - unsigned id; + /* The type passed to retro_load_game_special(). */ + unsigned id; }; typedef void (RETRO_CALLCONV *retro_proc_address_t)(void); @@ -1814,30 +1818,30 @@ typedef void (RETRO_CALLCONV *retro_proc_address_t)(void); * e.g. if void retro_foo(void); exists, the symbol must be called "retro_foo". * The returned function pointer must be cast to the corresponding type. */ -typedef retro_proc_address_t (RETRO_CALLCONV *retro_get_proc_address_t)(const char *sym); +typedef retro_proc_address_t (RETRO_CALLCONV *retro_get_proc_address_t)(const char* sym); struct retro_get_proc_address_interface { - retro_get_proc_address_t get_proc_address; + retro_get_proc_address_t get_proc_address; }; enum retro_log_level { - RETRO_LOG_DEBUG = 0, - RETRO_LOG_INFO, - RETRO_LOG_WARN, - RETRO_LOG_ERROR, + RETRO_LOG_DEBUG = 0, + RETRO_LOG_INFO, + RETRO_LOG_WARN, + RETRO_LOG_ERROR, - RETRO_LOG_DUMMY = INT_MAX + RETRO_LOG_DUMMY = INT_MAX }; /* Logging function. Takes log level argument as well. */ typedef void (RETRO_CALLCONV *retro_log_printf_t)(enum retro_log_level level, - const char *fmt, ...); + const char* fmt, ...); struct retro_log_callback { - retro_log_printf_t log; + retro_log_printf_t log; }; /* Performance related functions */ @@ -1871,12 +1875,12 @@ typedef int64_t retro_time_t; struct retro_perf_counter { - const char *ident; - retro_perf_tick_t start; - retro_perf_tick_t total; - retro_perf_tick_t call_cnt; + const char* ident; + retro_perf_tick_t start; + retro_perf_tick_t total; + retro_perf_tick_t call_cnt; - bool registered; + bool registered; }; /* Returns current time in microseconds. @@ -1903,13 +1907,13 @@ typedef void (RETRO_CALLCONV *retro_perf_log_t)(void); * retro_perf_counter must be 0. * Registering can be called multiple times. To avoid calling to * frontend redundantly, you can check registered field first. */ -typedef void (RETRO_CALLCONV *retro_perf_register_t)(struct retro_perf_counter *counter); +typedef void (RETRO_CALLCONV *retro_perf_register_t)(struct retro_perf_counter* counter); /* Starts a registered counter. */ -typedef void (RETRO_CALLCONV *retro_perf_start_t)(struct retro_perf_counter *counter); +typedef void (RETRO_CALLCONV *retro_perf_start_t)(struct retro_perf_counter* counter); /* Stops a registered counter. */ -typedef void (RETRO_CALLCONV *retro_perf_stop_t)(struct retro_perf_counter *counter); +typedef void (RETRO_CALLCONV *retro_perf_stop_t)(struct retro_perf_counter* counter); /* For convenience it can be useful to wrap register, start and stop in macros. * E.g.: @@ -1946,14 +1950,14 @@ typedef void (RETRO_CALLCONV *retro_perf_stop_t)(struct retro_perf_counter *coun struct retro_perf_callback { - retro_perf_get_time_usec_t get_time_usec; - retro_get_cpu_features_t get_cpu_features; + retro_perf_get_time_usec_t get_time_usec; + retro_get_cpu_features_t get_cpu_features; - retro_perf_get_counter_t get_perf_counter; - retro_perf_register_t perf_register; - retro_perf_start_t perf_start; - retro_perf_stop_t perf_stop; - retro_perf_log_t perf_log; + retro_perf_get_counter_t get_perf_counter; + retro_perf_register_t perf_register; + retro_perf_start_t perf_start; + retro_perf_stop_t perf_stop; + retro_perf_log_t perf_log; }; /* FIXME: Document the sensor API and work out behavior. @@ -1961,14 +1965,14 @@ struct retro_perf_callback */ enum retro_sensor_action { - RETRO_SENSOR_ACCELEROMETER_ENABLE = 0, - RETRO_SENSOR_ACCELEROMETER_DISABLE, - RETRO_SENSOR_GYROSCOPE_ENABLE, - RETRO_SENSOR_GYROSCOPE_DISABLE, - RETRO_SENSOR_ILLUMINANCE_ENABLE, - RETRO_SENSOR_ILLUMINANCE_DISABLE, + RETRO_SENSOR_ACCELEROMETER_ENABLE = 0, + RETRO_SENSOR_ACCELEROMETER_DISABLE, + RETRO_SENSOR_GYROSCOPE_ENABLE, + RETRO_SENSOR_GYROSCOPE_DISABLE, + RETRO_SENSOR_ILLUMINANCE_ENABLE, + RETRO_SENSOR_ILLUMINANCE_DISABLE, - RETRO_SENSOR_DUMMY = INT_MAX + RETRO_SENSOR_DUMMY = INT_MAX }; /* Id values for SENSOR types. */ @@ -1981,22 +1985,22 @@ enum retro_sensor_action #define RETRO_SENSOR_ILLUMINANCE 6 typedef bool (RETRO_CALLCONV *retro_set_sensor_state_t)(unsigned port, - enum retro_sensor_action action, unsigned rate); + enum retro_sensor_action action, unsigned rate); typedef float (RETRO_CALLCONV *retro_sensor_get_input_t)(unsigned port, unsigned id); struct retro_sensor_interface { - retro_set_sensor_state_t set_sensor_state; - retro_sensor_get_input_t get_sensor_input; + retro_set_sensor_state_t set_sensor_state; + retro_sensor_get_input_t get_sensor_input; }; enum retro_camera_buffer { - RETRO_CAMERA_BUFFER_OPENGL_TEXTURE = 0, - RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER, + RETRO_CAMERA_BUFFER_OPENGL_TEXTURE = 0, + RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER, - RETRO_CAMERA_BUFFER_DUMMY = INT_MAX + RETRO_CAMERA_BUFFER_DUMMY = INT_MAX }; /* Starts the camera driver. Can only be called in retro_run(). */ @@ -2015,8 +2019,8 @@ typedef void (RETRO_CALLCONV *retro_camera_lifetime_status_t)(void); * Width, height and pitch are similar to retro_video_refresh_t. * First pixel is top-left origin. */ -typedef void (RETRO_CALLCONV *retro_camera_frame_raw_framebuffer_t)(const uint32_t *buffer, - unsigned width, unsigned height, size_t pitch); +typedef void (RETRO_CALLCONV *retro_camera_frame_raw_framebuffer_t)(const uint32_t* buffer, + unsigned width, unsigned height, size_t pitch); /* A callback for when OpenGL textures are used. * @@ -2037,40 +2041,40 @@ typedef void (RETRO_CALLCONV *retro_camera_frame_raw_framebuffer_t)(const uint32 * the API definition. */ typedef void (RETRO_CALLCONV *retro_camera_frame_opengl_texture_t)(unsigned texture_id, - unsigned texture_target, const float *affine); + unsigned texture_target, const float* affine); struct retro_camera_callback { - /* Set by libretro core. - * Example bitmask: caps = (1 << RETRO_CAMERA_BUFFER_OPENGL_TEXTURE) | (1 << RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER). - */ - uint64_t caps; + /* Set by libretro core. + * Example bitmask: caps = (1 << RETRO_CAMERA_BUFFER_OPENGL_TEXTURE) | (1 << RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER). + */ + uint64_t caps; - /* Desired resolution for camera. Is only used as a hint. */ - unsigned width; - unsigned height; + /* Desired resolution for camera. Is only used as a hint. */ + unsigned width; + unsigned height; - /* Set by frontend. */ - retro_camera_start_t start; - retro_camera_stop_t stop; + /* Set by frontend. */ + retro_camera_start_t start; + retro_camera_stop_t stop; - /* Set by libretro core if raw framebuffer callbacks will be used. */ - retro_camera_frame_raw_framebuffer_t frame_raw_framebuffer; + /* Set by libretro core if raw framebuffer callbacks will be used. */ + retro_camera_frame_raw_framebuffer_t frame_raw_framebuffer; - /* Set by libretro core if OpenGL texture callbacks will be used. */ - retro_camera_frame_opengl_texture_t frame_opengl_texture; + /* Set by libretro core if OpenGL texture callbacks will be used. */ + retro_camera_frame_opengl_texture_t frame_opengl_texture; - /* Set by libretro core. Called after camera driver is initialized and - * ready to be started. - * Can be NULL, in which this callback is not called. - */ - retro_camera_lifetime_status_t initialized; + /* Set by libretro core. Called after camera driver is initialized and + * ready to be started. + * Can be NULL, in which this callback is not called. + */ + retro_camera_lifetime_status_t initialized; - /* Set by libretro core. Called right before camera driver is - * deinitialized. - * Can be NULL, in which this callback is not called. - */ - retro_camera_lifetime_status_t deinitialized; + /* Set by libretro core. Called right before camera driver is + * deinitialized. + * Can be NULL, in which this callback is not called. + */ + retro_camera_lifetime_status_t deinitialized; }; /* Sets the interval of time and/or distance at which to update/poll @@ -2083,7 +2087,7 @@ struct retro_camera_callback * interval_distance is the distance interval expressed in meters. */ typedef void (RETRO_CALLCONV *retro_location_set_interval_t)(unsigned interval_ms, - unsigned interval_distance); + unsigned interval_distance); /* Start location services. The device will start listening for changes to the * current location at regular intervals (which are defined with @@ -2096,8 +2100,8 @@ typedef void (RETRO_CALLCONV *retro_location_stop_t)(void); /* Get the position of the current location. Will set parameters to * 0 if no new location update has happened since the last time. */ -typedef bool (RETRO_CALLCONV *retro_location_get_position_t)(double *lat, double *lon, - double *horiz_accuracy, double *vert_accuracy); +typedef bool (RETRO_CALLCONV *retro_location_get_position_t)(double* lat, double* lon, + double* horiz_accuracy, double* vert_accuracy); /* Callback which signals when the location driver is initialized * and/or deinitialized. @@ -2107,21 +2111,21 @@ typedef void (RETRO_CALLCONV *retro_location_lifetime_status_t)(void); struct retro_location_callback { - retro_location_start_t start; - retro_location_stop_t stop; - retro_location_get_position_t get_position; - retro_location_set_interval_t set_interval; + retro_location_start_t start; + retro_location_stop_t stop; + retro_location_get_position_t get_position; + retro_location_set_interval_t set_interval; - retro_location_lifetime_status_t initialized; - retro_location_lifetime_status_t deinitialized; + retro_location_lifetime_status_t initialized; + retro_location_lifetime_status_t deinitialized; }; enum retro_rumble_effect { - RETRO_RUMBLE_STRONG = 0, - RETRO_RUMBLE_WEAK = 1, + RETRO_RUMBLE_STRONG = 0, + RETRO_RUMBLE_WEAK = 1, - RETRO_RUMBLE_DUMMY = INT_MAX + RETRO_RUMBLE_DUMMY = INT_MAX }; /* Sets rumble state for joypad plugged in port 'port'. @@ -2132,11 +2136,11 @@ enum retro_rumble_effect * Returns true if rumble state request was honored. * Calling this before first retro_run() is likely to return false. */ typedef bool (RETRO_CALLCONV *retro_set_rumble_state_t)(unsigned port, - enum retro_rumble_effect effect, uint16_t strength); + enum retro_rumble_effect effect, uint16_t strength); struct retro_rumble_interface { - retro_set_rumble_state_t set_rumble_state; + retro_set_rumble_state_t set_rumble_state; }; /* Notifies libretro that audio data should be written. */ @@ -2153,8 +2157,8 @@ typedef void (RETRO_CALLCONV *retro_audio_set_state_callback_t)(bool enabled); struct retro_audio_callback { - retro_audio_callback_t callback; - retro_audio_set_state_callback_t set_state; + retro_audio_callback_t callback; + retro_audio_set_state_callback_t set_state; }; /* Notifies a libretro core of time spent since last invocation @@ -2167,13 +2171,14 @@ struct retro_audio_callback * In those scenarios the reference frame time value will be used. */ typedef int64_t retro_usec_t; typedef void (RETRO_CALLCONV *retro_frame_time_callback_t)(retro_usec_t usec); + struct retro_frame_time_callback { - retro_frame_time_callback_t callback; - /* Represents the time of one frame. It is computed as - * 1000000 / fps, but the implementation will resolve the - * rounding to ensure that framestepping, etc is exact. */ - retro_usec_t reference; + retro_frame_time_callback_t callback; + /* Represents the time of one frame. It is computed as + * 1000000 / fps, but the implementation will resolve the + * rounding to ensure that framestepping, etc is exact. */ + retro_usec_t reference; }; /* Pass this to retro_video_refresh_t if rendering to hardware. @@ -2198,117 +2203,117 @@ typedef void (RETRO_CALLCONV *retro_hw_context_reset_t)(void); typedef uintptr_t (RETRO_CALLCONV *retro_hw_get_current_framebuffer_t)(void); /* Get a symbol from HW context. */ -typedef retro_proc_address_t (RETRO_CALLCONV *retro_hw_get_proc_address_t)(const char *sym); +typedef retro_proc_address_t (RETRO_CALLCONV *retro_hw_get_proc_address_t)(const char* sym); enum retro_hw_context_type { - RETRO_HW_CONTEXT_NONE = 0, - /* OpenGL 2.x. Driver can choose to use latest compatibility context. */ - RETRO_HW_CONTEXT_OPENGL = 1, - /* OpenGL ES 2.0. */ - RETRO_HW_CONTEXT_OPENGLES2 = 2, - /* Modern desktop core GL context. Use version_major/ - * version_minor fields to set GL version. */ - RETRO_HW_CONTEXT_OPENGL_CORE = 3, - /* OpenGL ES 3.0 */ - RETRO_HW_CONTEXT_OPENGLES3 = 4, - /* OpenGL ES 3.1+. Set version_major/version_minor. For GLES2 and GLES3, - * use the corresponding enums directly. */ - RETRO_HW_CONTEXT_OPENGLES_VERSION = 5, + RETRO_HW_CONTEXT_NONE = 0, + /* OpenGL 2.x. Driver can choose to use latest compatibility context. */ + RETRO_HW_CONTEXT_OPENGL = 1, + /* OpenGL ES 2.0. */ + RETRO_HW_CONTEXT_OPENGLES2 = 2, + /* Modern desktop core GL context. Use version_major/ + * version_minor fields to set GL version. */ + RETRO_HW_CONTEXT_OPENGL_CORE = 3, + /* OpenGL ES 3.0 */ + RETRO_HW_CONTEXT_OPENGLES3 = 4, + /* OpenGL ES 3.1+. Set version_major/version_minor. For GLES2 and GLES3, + * use the corresponding enums directly. */ + RETRO_HW_CONTEXT_OPENGLES_VERSION = 5, - /* Vulkan, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE. */ - RETRO_HW_CONTEXT_VULKAN = 6, + /* Vulkan, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE. */ + RETRO_HW_CONTEXT_VULKAN = 6, - /* Direct3D, set version_major to select the type of interface - * returned by RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ - RETRO_HW_CONTEXT_DIRECT3D = 7, + /* Direct3D, set version_major to select the type of interface + * returned by RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ + RETRO_HW_CONTEXT_DIRECT3D = 7, - RETRO_HW_CONTEXT_DUMMY = INT_MAX + RETRO_HW_CONTEXT_DUMMY = INT_MAX }; struct retro_hw_render_callback { - /* Which API to use. Set by libretro core. */ - enum retro_hw_context_type context_type; + /* Which API to use. Set by libretro core. */ + enum retro_hw_context_type context_type; - /* Called when a context has been created or when it has been reset. - * An OpenGL context is only valid after context_reset() has been called. - * - * When context_reset is called, OpenGL resources in the libretro - * implementation are guaranteed to be invalid. - * - * It is possible that context_reset is called multiple times during an - * application lifecycle. - * If context_reset is called without any notification (context_destroy), - * the OpenGL context was lost and resources should just be recreated - * without any attempt to "free" old resources. - */ - retro_hw_context_reset_t context_reset; + /* Called when a context has been created or when it has been reset. + * An OpenGL context is only valid after context_reset() has been called. + * + * When context_reset is called, OpenGL resources in the libretro + * implementation are guaranteed to be invalid. + * + * It is possible that context_reset is called multiple times during an + * application lifecycle. + * If context_reset is called without any notification (context_destroy), + * the OpenGL context was lost and resources should just be recreated + * without any attempt to "free" old resources. + */ + retro_hw_context_reset_t context_reset; - /* Set by frontend. - * TODO: This is rather obsolete. The frontend should not - * be providing preallocated framebuffers. */ - retro_hw_get_current_framebuffer_t get_current_framebuffer; + /* Set by frontend. + * TODO: This is rather obsolete. The frontend should not + * be providing preallocated framebuffers. */ + retro_hw_get_current_framebuffer_t get_current_framebuffer; - /* Set by frontend. - * Can return all relevant functions, including glClear on Windows. */ - retro_hw_get_proc_address_t get_proc_address; + /* Set by frontend. + * Can return all relevant functions, including glClear on Windows. */ + retro_hw_get_proc_address_t get_proc_address; - /* Set if render buffers should have depth component attached. - * TODO: Obsolete. */ - bool depth; + /* Set if render buffers should have depth component attached. + * TODO: Obsolete. */ + bool depth; - /* Set if stencil buffers should be attached. - * TODO: Obsolete. */ - bool stencil; + /* Set if stencil buffers should be attached. + * TODO: Obsolete. */ + bool stencil; - /* If depth and stencil are true, a packed 24/8 buffer will be added. - * Only attaching stencil is invalid and will be ignored. */ + /* If depth and stencil are true, a packed 24/8 buffer will be added. + * Only attaching stencil is invalid and will be ignored. */ - /* Use conventional bottom-left origin convention. If false, - * standard libretro top-left origin semantics are used. - * TODO: Move to GL specific interface. */ - bool bottom_left_origin; + /* Use conventional bottom-left origin convention. If false, + * standard libretro top-left origin semantics are used. + * TODO: Move to GL specific interface. */ + bool bottom_left_origin; - /* Major version number for core GL context or GLES 3.1+. */ - unsigned version_major; + /* Major version number for core GL context or GLES 3.1+. */ + unsigned version_major; - /* Minor version number for core GL context or GLES 3.1+. */ - unsigned version_minor; + /* Minor version number for core GL context or GLES 3.1+. */ + unsigned version_minor; - /* If this is true, the frontend will go very far to avoid - * resetting context in scenarios like toggling fullscreen, etc. - * TODO: Obsolete? Maybe frontend should just always assume this ... - */ - bool cache_context; + /* If this is true, the frontend will go very far to avoid + * resetting context in scenarios like toggling fullscreen, etc. + * TODO: Obsolete? Maybe frontend should just always assume this ... + */ + bool cache_context; - /* The reset callback might still be called in extreme situations - * such as if the context is lost beyond recovery. - * - * For optimal stability, set this to false, and allow context to be - * reset at any time. - */ + /* The reset callback might still be called in extreme situations + * such as if the context is lost beyond recovery. + * + * For optimal stability, set this to false, and allow context to be + * reset at any time. + */ - /* A callback to be called before the context is destroyed in a - * controlled way by the frontend. */ - retro_hw_context_reset_t context_destroy; + /* A callback to be called before the context is destroyed in a + * controlled way by the frontend. */ + retro_hw_context_reset_t context_destroy; - /* OpenGL resources can be deinitialized cleanly at this step. - * context_destroy can be set to NULL, in which resources will - * just be destroyed without any notification. - * - * Even when context_destroy is non-NULL, it is possible that - * context_reset is called without any destroy notification. - * This happens if context is lost by external factors (such as - * notified by GL_ARB_robustness). - * - * In this case, the context is assumed to be already dead, - * and the libretro implementation must not try to free any OpenGL - * resources in the subsequent context_reset. - */ + /* OpenGL resources can be deinitialized cleanly at this step. + * context_destroy can be set to NULL, in which resources will + * just be destroyed without any notification. + * + * Even when context_destroy is non-NULL, it is possible that + * context_reset is called without any destroy notification. + * This happens if context is lost by external factors (such as + * notified by GL_ARB_robustness). + * + * In this case, the context is assumed to be already dead, + * and the libretro implementation must not try to free any OpenGL + * resources in the subsequent context_reset. + */ - /* Creates a debug context. */ - bool debug_context; + /* Creates a debug context. */ + bool debug_context; }; /* Callback type passed in RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK. @@ -2329,11 +2334,11 @@ struct retro_hw_render_callback * character, character should be 0. */ typedef void (RETRO_CALLCONV *retro_keyboard_event_t)(bool down, unsigned keycode, - uint32_t character, uint16_t key_modifiers); + uint32_t character, uint16_t key_modifiers); struct retro_keyboard_callback { - retro_keyboard_event_t callback; + retro_keyboard_event_t callback; }; /* Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE & @@ -2387,7 +2392,7 @@ struct retro_game_info; * Index 1 will be removed, and the new index is 3. */ typedef bool (RETRO_CALLCONV *retro_replace_image_index_t)(unsigned index, - const struct retro_game_info *info); + const struct retro_game_info* info); /* Adds a new valid index (get_num_images()) to the internal disk list. * This will increment subsequent return values from get_num_images() by 1. @@ -2419,13 +2424,13 @@ typedef bool (RETRO_CALLCONV *retro_add_image_index_t)(void); * Returns 'false' if index or 'path' are invalid, or core * does not support this functionality */ -typedef bool (RETRO_CALLCONV *retro_set_initial_image_t)(unsigned index, const char *path); +typedef bool (RETRO_CALLCONV *retro_set_initial_image_t)(unsigned index, const char* path); /* Fetches the path of the specified disk image file. * Returns 'false' if index is invalid (index >= get_num_images()) * or path is otherwise unavailable. */ -typedef bool (RETRO_CALLCONV *retro_get_image_path_t)(unsigned index, char *path, size_t len); +typedef bool (RETRO_CALLCONV *retro_get_image_path_t)(unsigned index, char* path, size_t len); /* Fetches a core-provided 'label' for the specified disk * image file. In the simplest case this may be a file name @@ -2440,70 +2445,70 @@ typedef bool (RETRO_CALLCONV *retro_get_image_path_t)(unsigned index, char *path * Returns 'false' if index is invalid (index >= get_num_images()) * or label is otherwise unavailable. */ -typedef bool (RETRO_CALLCONV *retro_get_image_label_t)(unsigned index, char *label, size_t len); +typedef bool (RETRO_CALLCONV *retro_get_image_label_t)(unsigned index, char* label, size_t len); struct retro_disk_control_callback { - retro_set_eject_state_t set_eject_state; - retro_get_eject_state_t get_eject_state; + retro_set_eject_state_t set_eject_state; + retro_get_eject_state_t get_eject_state; - retro_get_image_index_t get_image_index; - retro_set_image_index_t set_image_index; - retro_get_num_images_t get_num_images; + retro_get_image_index_t get_image_index; + retro_set_image_index_t set_image_index; + retro_get_num_images_t get_num_images; - retro_replace_image_index_t replace_image_index; - retro_add_image_index_t add_image_index; + retro_replace_image_index_t replace_image_index; + retro_add_image_index_t add_image_index; }; struct retro_disk_control_ext_callback { - retro_set_eject_state_t set_eject_state; - retro_get_eject_state_t get_eject_state; + retro_set_eject_state_t set_eject_state; + retro_get_eject_state_t get_eject_state; - retro_get_image_index_t get_image_index; - retro_set_image_index_t set_image_index; - retro_get_num_images_t get_num_images; + retro_get_image_index_t get_image_index; + retro_set_image_index_t set_image_index; + retro_get_num_images_t get_num_images; - retro_replace_image_index_t replace_image_index; - retro_add_image_index_t add_image_index; + retro_replace_image_index_t replace_image_index; + retro_add_image_index_t add_image_index; - /* NOTE: Frontend will only attempt to record/restore - * last used disk index if both set_initial_image() - * and get_image_path() are implemented */ - retro_set_initial_image_t set_initial_image; /* Optional - may be NULL */ + /* NOTE: Frontend will only attempt to record/restore + * last used disk index if both set_initial_image() + * and get_image_path() are implemented */ + retro_set_initial_image_t set_initial_image; /* Optional - may be NULL */ - retro_get_image_path_t get_image_path; /* Optional - may be NULL */ - retro_get_image_label_t get_image_label; /* Optional - may be NULL */ + retro_get_image_path_t get_image_path; /* Optional - may be NULL */ + retro_get_image_label_t get_image_label; /* Optional - may be NULL */ }; enum retro_pixel_format { - /* 0RGB1555, native endian. - * 0 bit must be set to 0. - * This pixel format is default for compatibility concerns only. - * If a 15/16-bit pixel format is desired, consider using RGB565. */ - RETRO_PIXEL_FORMAT_0RGB1555 = 0, + /* 0RGB1555, native endian. + * 0 bit must be set to 0. + * This pixel format is default for compatibility concerns only. + * If a 15/16-bit pixel format is desired, consider using RGB565. */ + RETRO_PIXEL_FORMAT_0RGB1555 = 0, - /* XRGB8888, native endian. - * X bits are ignored. */ - RETRO_PIXEL_FORMAT_XRGB8888 = 1, + /* XRGB8888, native endian. + * X bits are ignored. */ + RETRO_PIXEL_FORMAT_XRGB8888 = 1, - /* RGB565, native endian. - * This pixel format is the recommended format to use if a 15/16-bit - * format is desired as it is the pixel format that is typically - * available on a wide range of low-power devices. - * - * It is also natively supported in APIs like OpenGL ES. */ - RETRO_PIXEL_FORMAT_RGB565 = 2, + /* RGB565, native endian. + * This pixel format is the recommended format to use if a 15/16-bit + * format is desired as it is the pixel format that is typically + * available on a wide range of low-power devices. + * + * It is also natively supported in APIs like OpenGL ES. */ + RETRO_PIXEL_FORMAT_RGB565 = 2, - /* Ensure sizeof() == sizeof(int). */ - RETRO_PIXEL_FORMAT_UNKNOWN = INT_MAX + /* Ensure sizeof() == sizeof(int). */ + RETRO_PIXEL_FORMAT_UNKNOWN = INT_MAX }; struct retro_message { - const char *msg; /* Message to be displayed. */ - unsigned frames; /* Duration in frames of message. */ + const char* msg; /* Message to be displayed. */ + unsigned frames; /* Duration in frames of message. */ }; /* Describes how the libretro implementation maps a libretro input bind @@ -2511,71 +2516,71 @@ struct retro_message * This string can be used to better let a user configure input. */ struct retro_input_descriptor { - /* Associates given parameters with a description. */ - unsigned port; - unsigned device; - unsigned index; - unsigned id; + /* Associates given parameters with a description. */ + unsigned port; + unsigned device; + unsigned index; + unsigned id; - /* Human readable description for parameters. - * The pointer must remain valid until - * retro_unload_game() is called. */ - const char *description; + /* Human readable description for parameters. + * The pointer must remain valid until + * retro_unload_game() is called. */ + const char* description; }; struct retro_system_info { - /* All pointers are owned by libretro implementation, and pointers must - * remain valid until retro_deinit() is called. */ + /* All pointers are owned by libretro implementation, and pointers must + * remain valid until retro_deinit() is called. */ - const char *library_name; /* Descriptive name of library. Should not + const char* library_name; /* Descriptive name of library. Should not * contain any version numbers, etc. */ - const char *library_version; /* Descriptive version of core. */ + const char* library_version; /* Descriptive version of core. */ - const char *valid_extensions; /* A string listing probably content + const char* valid_extensions; /* A string listing probably content * extensions the core will be able to * load, separated with pipe. * I.e. "bin|rom|iso". * Typically used for a GUI to filter * out extensions. */ - /* Libretro cores that need to have direct access to their content - * files, including cores which use the path of the content files to - * determine the paths of other files, should set need_fullpath to true. - * - * Cores should strive for setting need_fullpath to false, - * as it allows the frontend to perform patching, etc. - * - * If need_fullpath is true and retro_load_game() is called: - * - retro_game_info::path is guaranteed to have a valid path - * - retro_game_info::data and retro_game_info::size are invalid - * - * If need_fullpath is false and retro_load_game() is called: - * - retro_game_info::path may be NULL - * - retro_game_info::data and retro_game_info::size are guaranteed - * to be valid - * - * See also: - * - RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY - * - RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY - */ - bool need_fullpath; + /* Libretro cores that need to have direct access to their content + * files, including cores which use the path of the content files to + * determine the paths of other files, should set need_fullpath to true. + * + * Cores should strive for setting need_fullpath to false, + * as it allows the frontend to perform patching, etc. + * + * If need_fullpath is true and retro_load_game() is called: + * - retro_game_info::path is guaranteed to have a valid path + * - retro_game_info::data and retro_game_info::size are invalid + * + * If need_fullpath is false and retro_load_game() is called: + * - retro_game_info::path may be NULL + * - retro_game_info::data and retro_game_info::size are guaranteed + * to be valid + * + * See also: + * - RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY + * - RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY + */ + bool need_fullpath; - /* If true, the frontend is not allowed to extract any archives before - * loading the real content. - * Necessary for certain libretro implementations that load games - * from zipped archives. */ - bool block_extract; + /* If true, the frontend is not allowed to extract any archives before + * loading the real content. + * Necessary for certain libretro implementations that load games + * from zipped archives. */ + bool block_extract; }; struct retro_game_geometry { - unsigned base_width; /* Nominal video width of game. */ - unsigned base_height; /* Nominal video height of game. */ - unsigned max_width; /* Maximum possible width of game. */ - unsigned max_height; /* Maximum possible height of game. */ + unsigned base_width; /* Nominal video width of game. */ + unsigned base_height; /* Nominal video height of game. */ + unsigned max_width; /* Maximum possible width of game. */ + unsigned max_height; /* Maximum possible height of game. */ - float aspect_ratio; /* Nominal aspect ratio of game. If + float aspect_ratio; /* Nominal aspect ratio of game. If * aspect_ratio is <= 0.0, an aspect ratio * of base_width / base_height is assumed. * A frontend could override this setting, @@ -2584,39 +2589,39 @@ struct retro_game_geometry struct retro_system_timing { - double fps; /* FPS of video content. */ - double sample_rate; /* Sampling rate of audio. */ + double fps; /* FPS of video content. */ + double sample_rate; /* Sampling rate of audio. */ }; struct retro_system_av_info { - struct retro_game_geometry geometry; - struct retro_system_timing timing; + struct retro_game_geometry geometry; + struct retro_system_timing timing; }; struct retro_variable { - /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. - * If NULL, obtains the complete environment string if more - * complex parsing is necessary. - * The environment string is formatted as key-value pairs - * delimited by semicolons as so: - * "key1=value1;key2=value2;..." - */ - const char *key; + /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. + * If NULL, obtains the complete environment string if more + * complex parsing is necessary. + * The environment string is formatted as key-value pairs + * delimited by semicolons as so: + * "key1=value1;key2=value2;..." + */ + const char* key; - /* Value to be obtained. If key does not exist, it is set to NULL. */ - const char *value; + /* Value to be obtained. If key does not exist, it is set to NULL. */ + const char* value; }; struct retro_core_option_display { - /* Variable to configure in RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY */ - const char *key; + /* Variable to configure in RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY */ + const char* key; - /* Specifies whether variable should be displayed - * when presenting core options to the user */ - bool visible; + /* Specifies whether variable should be displayed + * when presenting core options to the user */ + bool visible; }; /* Maximum number of values permitted for a core option @@ -2638,50 +2643,50 @@ struct retro_core_option_display struct retro_core_option_value { - /* Expected option value */ - const char *value; + /* Expected option value */ + const char* value; - /* Human-readable value label. If NULL, value itself - * will be displayed by the frontend */ - const char *label; + /* Human-readable value label. If NULL, value itself + * will be displayed by the frontend */ + const char* label; }; struct retro_core_option_definition { - /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. */ - const char *key; + /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. */ + const char* key; - /* Human-readable core option description (used as menu label) */ - const char *desc; + /* Human-readable core option description (used as menu label) */ + const char* desc; - /* Human-readable core option information (used as menu sublabel) */ - const char *info; + /* Human-readable core option information (used as menu sublabel) */ + const char* info; - /* Array of retro_core_option_value structs, terminated by NULL */ - struct retro_core_option_value values[RETRO_NUM_CORE_OPTION_VALUES_MAX]; + /* Array of retro_core_option_value structs, terminated by NULL */ + struct retro_core_option_value values[RETRO_NUM_CORE_OPTION_VALUES_MAX]; - /* Default core option value. Must match one of the values - * in the retro_core_option_value array, otherwise will be - * ignored */ - const char *default_value; + /* Default core option value. Must match one of the values + * in the retro_core_option_value array, otherwise will be + * ignored */ + const char* default_value; }; struct retro_core_options_intl { - /* Pointer to an array of retro_core_option_definition structs - * - US English implementation - * - Must point to a valid array */ - struct retro_core_option_definition *us; + /* Pointer to an array of retro_core_option_definition structs + * - US English implementation + * - Must point to a valid array */ + struct retro_core_option_definition* us; - /* Pointer to an array of retro_core_option_definition structs - * - Implementation for current frontend language - * - May be NULL */ - struct retro_core_option_definition *local; + /* Pointer to an array of retro_core_option_definition structs + * - Implementation for current frontend language + * - May be NULL */ + struct retro_core_option_definition* local; }; struct retro_game_info { - const char *path; /* Path to game, UTF-8 encoded. + const char* path; /* Path to game, UTF-8 encoded. * Sometimes used as a reference for building other paths. * May be NULL if game was loaded from stdin or similar, * but in this case some cores will be unable to load `data`. @@ -2689,38 +2694,38 @@ struct retro_game_info * of passing NULL, which will help more cores to succeed. * retro_system_info::need_fullpath requires * that this path is valid. */ - const void *data; /* Memory buffer of loaded game. Will be NULL + const void* data; /* Memory buffer of loaded game. Will be NULL * if need_fullpath was set. */ - size_t size; /* Size of memory buffer. */ - const char *meta; /* String of implementation specific meta-data. */ + size_t size; /* Size of memory buffer. */ + const char* meta; /* String of implementation specific meta-data. */ }; #define RETRO_MEMORY_ACCESS_WRITE (1 << 0) - /* The core will write to the buffer provided by retro_framebuffer::data. */ +/* The core will write to the buffer provided by retro_framebuffer::data. */ #define RETRO_MEMORY_ACCESS_READ (1 << 1) - /* The core will read from retro_framebuffer::data. */ +/* The core will read from retro_framebuffer::data. */ #define RETRO_MEMORY_TYPE_CACHED (1 << 0) - /* The memory in data is cached. - * If not cached, random writes and/or reading from the buffer is expected to be very slow. */ +/* The memory in data is cached. + * If not cached, random writes and/or reading from the buffer is expected to be very slow. */ struct retro_framebuffer { - void *data; /* The framebuffer which the core can render into. + void* data; /* The framebuffer which the core can render into. Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. The initial contents of data are unspecified. */ - unsigned width; /* The framebuffer width used by the core. Set by core. */ - unsigned height; /* The framebuffer height used by the core. Set by core. */ - size_t pitch; /* The number of bytes between the beginning of a scanline, + unsigned width; /* The framebuffer width used by the core. Set by core. */ + unsigned height; /* The framebuffer height used by the core. Set by core. */ + size_t pitch; /* The number of bytes between the beginning of a scanline, and beginning of the next scanline. Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */ - enum retro_pixel_format format; /* The pixel format the core must use to render into data. + enum retro_pixel_format format; /* The pixel format the core must use to render into data. This format could differ from the format used in SET_PIXEL_FORMAT. Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */ - unsigned access_flags; /* How the core will access the memory in the framebuffer. + unsigned access_flags; /* How the core will access the memory in the framebuffer. RETRO_MEMORY_ACCESS_* flags. Set by core. */ - unsigned memory_flags; /* Flags telling core how the memory has been mapped. + unsigned memory_flags; /* Flags telling core how the memory has been mapped. RETRO_MEMORY_TYPE_* flags. Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */ }; @@ -2729,7 +2734,7 @@ struct retro_framebuffer /* Environment callback. Gives implementations a way of performing * uncommon tasks. Extensible. */ -typedef bool (RETRO_CALLCONV *retro_environment_t)(unsigned cmd, void *data); +typedef bool (RETRO_CALLCONV *retro_environment_t)(unsigned cmd, void* data); /* Render a frame. Pixel format is 15-bit 0RGB1555 native endian * unless changed (see RETRO_ENVIRONMENT_SET_PIXEL_FORMAT). @@ -2742,8 +2747,8 @@ typedef bool (RETRO_CALLCONV *retro_environment_t)(unsigned cmd, void *data); * Certain graphic APIs, such as OpenGL ES, do not like textures * that are not packed in memory. */ -typedef void (RETRO_CALLCONV *retro_video_refresh_t)(const void *data, unsigned width, - unsigned height, size_t pitch); +typedef void (RETRO_CALLCONV *retro_video_refresh_t)(const void* data, unsigned width, + unsigned height, size_t pitch); /* Renders a single audio frame. Should only be used if implementation * generates a single sample at a time. @@ -2757,8 +2762,8 @@ typedef void (RETRO_CALLCONV *retro_audio_sample_t)(int16_t left, int16_t right) * I.e. int16_t buf[4] = { l, r, l, r }; would be 2 frames. * Only one of the audio callbacks must ever be used. */ -typedef size_t (RETRO_CALLCONV *retro_audio_sample_batch_t)(const int16_t *data, - size_t frames); +typedef size_t (RETRO_CALLCONV *retro_audio_sample_batch_t)(const int16_t* data, + size_t frames); /* Polls input. */ typedef void (RETRO_CALLCONV *retro_input_poll_t)(void); @@ -2771,7 +2776,7 @@ typedef void (RETRO_CALLCONV *retro_input_poll_t)(void); * will still use the higher level RETRO_DEVICE_JOYPAD to request input. */ typedef int16_t (RETRO_CALLCONV *retro_input_state_t)(unsigned port, unsigned device, - unsigned index, unsigned id); + unsigned index, unsigned id); /* Sets callbacks. retro_set_environment() is guaranteed to be called * before retro_init(). @@ -2796,7 +2801,7 @@ RETRO_API unsigned retro_api_version(void); /* Gets statically known system info. Pointers provided in *info * must be statically allocated. * Can be called at any time, even before retro_init(). */ -RETRO_API void retro_get_system_info(struct retro_system_info *info); +RETRO_API void retro_get_system_info(struct retro_system_info* info); /* Gets information about system audio/video timings and geometry. * Can be called only after retro_load_game() has successfully completed. @@ -2804,7 +2809,7 @@ RETRO_API void retro_get_system_info(struct retro_system_info *info); * variable if needed. * E.g. geom.aspect_ratio might not be initialized if core doesn't * desire a particular aspect ratio. */ -RETRO_API void retro_get_system_av_info(struct retro_system_av_info *info); +RETRO_API void retro_get_system_av_info(struct retro_system_av_info* info); /* Sets device to be used for player 'port'. * By default, RETRO_DEVICE_JOYPAD is assumed to be plugged into all @@ -2845,22 +2850,22 @@ RETRO_API size_t retro_serialize_size(void); /* Serializes internal state. If failed, or size is lower than * retro_serialize_size(), it should return false, true otherwise. */ -RETRO_API bool retro_serialize(void *data, size_t size); -RETRO_API bool retro_unserialize(const void *data, size_t size); +RETRO_API bool retro_serialize(void* data, size_t size); +RETRO_API bool retro_unserialize(const void* data, size_t size); RETRO_API void retro_cheat_reset(void); -RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *code); +RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char* code); /* Loads a game. * Return true to indicate successful loading and false to indicate load failure. */ -RETRO_API bool retro_load_game(const struct retro_game_info *game); +RETRO_API bool retro_load_game(const struct retro_game_info* game); /* Loads a "special" kind of game. Should not be used, * except in extreme cases. */ RETRO_API bool retro_load_game_special( - unsigned game_type, - const struct retro_game_info *info, size_t num_info + unsigned game_type, + const struct retro_game_info* info, size_t num_info ); /* Unloads the currently loaded game. Called before retro_deinit(void). */ @@ -2870,7 +2875,7 @@ RETRO_API void retro_unload_game(void); RETRO_API unsigned retro_get_region(void); /* Gets region of memory. */ -RETRO_API void *retro_get_memory_data(unsigned id); +RETRO_API void* retro_get_memory_data(unsigned id); RETRO_API size_t retro_get_memory_size(unsigned id); #ifdef __cplusplus