mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 05:10:03 +00:00 
			
		
		
		
	Made some changes from review comments:
- Made LoadKernelSystemMode return a pair consisting of a system mode and a result code (Could use review). - Deleted ErrorOpenGL error code in favor of just having ErrorVideoCore. - Made dialog messages more clear. - Compared archive ID in fs_user.cpp to ArchiveIdCode::NCCH as opposed to hex magic. - Cleaned up some other stuff.
This commit is contained in:
		
							parent
							
								
									1ecb322daa
								
							
						
					
					
						commit
						37bec598ea
					
				
					 10 changed files with 55 additions and 53 deletions
				
			
		|  | @ -40,7 +40,6 @@ void EmuThread::run() { | |||
|             Core::System::ResultStatus result = Core::System::GetInstance().RunLoop(); | ||||
|             if (result != Core::System::ResultStatus::Success) { | ||||
|                 emit ErrorThrown(result); | ||||
|                 break; | ||||
|             } | ||||
| 
 | ||||
|             was_active = running || exec_step; | ||||
|  |  | |||
|  | @ -300,7 +300,7 @@ bool GMainWindow::LoadROM(const QString& filename) { | |||
|     render_window->MakeCurrent(); | ||||
| 
 | ||||
|     if (!gladLoadGL()) { | ||||
|         QMessageBox::critical(this, tr("Error while starting Citra!"), | ||||
|         QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"), | ||||
|                               tr("Your GPU may not support OpenGL 3.3, or you do not" | ||||
|                                  "have the latest graphics driver.")); | ||||
|         return false; | ||||
|  | @ -329,7 +329,7 @@ bool GMainWindow::LoadROM(const QString& filename) { | |||
|             QMessageBox::critical( | ||||
|                 this, tr("Error while loading ROM!"), | ||||
|                 tr("The game that you are trying to load must be decrypted before being used with " | ||||
|                    "Citra.<br/><br/>" | ||||
|                    "Citra. A real 3DS is required.<br/><br/>" | ||||
|                    "For more information on dumping and decrypting games, please see the following " | ||||
|                    "wiki pages: <ul>" | ||||
|                    "<li><a href='https://citra-emu.org/wiki/Dumping-Game-Cartridges/'>Dumping Game " | ||||
|  | @ -344,10 +344,17 @@ bool GMainWindow::LoadROM(const QString& filename) { | |||
|                                   tr("The ROM format is not supported.")); | ||||
|             break; | ||||
| 
 | ||||
|         case Core::System::ResultStatus::ErrorOpenGL: | ||||
|             QMessageBox::critical(this, tr("Error while loading OpenGL!"), | ||||
|                                   tr("Your GPU may not support OpenGL 3.3, or you do not " | ||||
|                                      "have the latest graphics driver.")); | ||||
|         case Core::System::ResultStatus::ErrorVideoCore: | ||||
|             QMessageBox::critical( | ||||
|                 this, tr("An error occured in the video core."), | ||||
|                 tr("Citra has encountered an error while running the video core,  please see the " | ||||
|                    "log for more details." | ||||
|                    "For more information on accessing the log, please see the following page: " | ||||
|                    "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How " | ||||
|                    "to " | ||||
|                    "Upload the Log File</a>." | ||||
|                    "Ensure that you have the latest graphics drivers for your GPU.")); | ||||
| 
 | ||||
|             break; | ||||
| 
 | ||||
|         default: | ||||
|  | @ -632,9 +639,6 @@ void GMainWindow::UpdateStatusBar() { | |||
| } | ||||
| 
 | ||||
| void GMainWindow::OnCoreError(Core::System::ResultStatus result) { | ||||
|     // Waiting for the dialog to be closed before shutting down causes a segfault, maybe because of
 | ||||
|     // the profiler
 | ||||
|     ShutdownGame(); | ||||
|     switch (result) { | ||||
|     case Core::System::ResultStatus::ErrorSystemFiles: | ||||
|         QMessageBox::critical( | ||||
|  | @ -664,13 +668,13 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result) { | |||
|             "."); | ||||
|         break; | ||||
| 
 | ||||
|     case Core::System::ResultStatus::ErrorUnknown: | ||||
|     default: | ||||
|         QMessageBox::critical( | ||||
|             this, "Fatal Error", | ||||
|             "Citra has encountered a fatal error, please see the log for more details."); | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|             "Citra has encountered a fatal error, please see the log for more details. " | ||||
|             "For more information on accessing the log, please see the following page: " | ||||
|             "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How to " | ||||
|             "Upload the Log File</a>."); | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | @ -679,9 +683,10 @@ bool GMainWindow::ConfirmClose() { | |||
|     if (emu_thread == nullptr || !UISettings::values.confirm_before_closing) | ||||
|         return true; | ||||
| 
 | ||||
|     return QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"), | ||||
|                                  QMessageBox::Yes | QMessageBox::No, | ||||
|                                  QMessageBox::No) != QMessageBox::No; | ||||
|     auto answer = | ||||
|         QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"), | ||||
|                               QMessageBox::Yes | QMessageBox::No, QMessageBox::No); | ||||
|     return answer != QMessageBox::No; | ||||
| } | ||||
| 
 | ||||
| void GMainWindow::closeEvent(QCloseEvent* event) { | ||||
|  |  | |||
|  | @ -3,6 +3,9 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <utility> | ||||
| 
 | ||||
| #include <boost/optional.hpp> | ||||
| 
 | ||||
| #include "audio_core/audio_core.h" | ||||
| #include "common/logging/log.h" | ||||
|  | @ -26,6 +29,7 @@ namespace Core { | |||
| /*static*/ System System::s_instance; | ||||
| 
 | ||||
| System::ResultStatus System::RunLoop(int tight_loop) { | ||||
|     this->status = ResultStatus::Success; | ||||
|     if (!cpu_core) { | ||||
|         return ResultStatus::ErrorNotInitialized; | ||||
|     } | ||||
|  | @ -73,14 +77,14 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file | |||
|         LOG_CRITICAL(Core, "Failed to obtain loader for %s!", filepath.c_str()); | ||||
|         return ResultStatus::ErrorGetLoader; | ||||
|     } | ||||
|     boost::optional<u32> system_mode = boost::none; | ||||
|     std::pair<boost::optional<u32>, Loader::ResultStatus> system_mode = | ||||
|         app_loader->LoadKernelSystemMode(); | ||||
| 
 | ||||
|     Loader::ResultStatus load_result{app_loader->LoadKernelSystemMode(system_mode)}; | ||||
|     if (!system_mode) { | ||||
|         LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", load_result); | ||||
|     if (system_mode.second != Loader::ResultStatus::Success) { | ||||
|         LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", system_mode.second); | ||||
|         System::Shutdown(); | ||||
| 
 | ||||
|         switch (load_result) { | ||||
|         switch (system_mode.second) { | ||||
|         case Loader::ResultStatus::ErrorEncrypted: | ||||
|             return ResultStatus::ErrorLoader_ErrorEncrypted; | ||||
|         case Loader::ResultStatus::ErrorInvalidFormat: | ||||
|  | @ -90,15 +94,15 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ResultStatus init_result{Init(emu_window, system_mode.get())}; | ||||
|     ResultStatus init_result{Init(emu_window, system_mode.first.get())}; | ||||
|     if (init_result != ResultStatus::Success) { | ||||
|         LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result); | ||||
|         System::Shutdown(); | ||||
|         return init_result; | ||||
|     } | ||||
| 
 | ||||
|     load_result = app_loader->Load(); | ||||
|     if (Loader::ResultStatus::Success != load_result) { | ||||
|     Loader::ResultStatus load_result = app_loader->Load(); | ||||
|     if (load_result != Loader::ResultStatus::Success) { | ||||
|         LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); | ||||
|         System::Shutdown(); | ||||
| 
 | ||||
|  | @ -154,7 +158,7 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { | |||
|     GDBStub::Init(); | ||||
| 
 | ||||
|     if (!VideoCore::Init(emu_window)) { | ||||
|         return ResultStatus::ErrorOpenGL; | ||||
|         return ResultStatus::ErrorVideoCore; | ||||
|     } | ||||
| 
 | ||||
|     LOG_DEBUG(Core, "Initialized OK"); | ||||
|  |  | |||
|  | @ -43,7 +43,6 @@ public: | |||
|         ErrorSystemFiles,               ///< Error in finding system files
 | ||||
|         ErrorSharedFont,                ///< Error in finding shared font
 | ||||
|         ErrorVideoCore,                 ///< Error in the video core
 | ||||
|         ErrorOpenGL,                    ///< Error when initializing OpenGL
 | ||||
|         ErrorUnknown                    ///< Any other error
 | ||||
|     }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,7 +37,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path& | |||
|     auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb"); | ||||
| 
 | ||||
|     if (!file->IsOpen()) { | ||||
|         return ResultCode(-1); // TODO(Subv): Find the right error code
 | ||||
|         return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound, | ||||
|                           ErrorLevel::Status); | ||||
|     } | ||||
|     auto size = file->GetSize(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -257,11 +257,9 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi | |||
|     LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code); | ||||
| 
 | ||||
|     auto itr = id_code_map.find(id_code); | ||||
|     if (itr == id_code_map.end()) { | ||||
|         // TODO: Verify error against hardware
 | ||||
|         return ResultCode(ErrorDescription::NotFound, ErrorModule::FS, ErrorSummary::NotFound, | ||||
|                           ErrorLevel::Permanent); | ||||
|     } | ||||
|     if (itr == id_code_map.end()) | ||||
|         return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound, | ||||
|                           ErrorLevel::Status); | ||||
| 
 | ||||
|     CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -133,12 +133,11 @@ static void OpenFileDirectly(Service::Interface* self) { | |||
|         LOG_ERROR(Service_FS, | ||||
|                   "failed to get a handle for archive archive_id=0x%08X archive_path=%s", | ||||
|                   static_cast<u32>(archive_id), archive_path.DebugStr().c_str()); | ||||
|         if (static_cast<u32>(archive_id) == 0x2345678A) { | ||||
|             Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles); | ||||
|             return; | ||||
|         } | ||||
|         cmd_buff[1] = archive_handle.Code().raw; | ||||
|         cmd_buff[3] = 0; | ||||
|         if (static_cast<FS::ArchiveIdCode>(archive_id) == ArchiveIdCode::NCCH) { | ||||
|             Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles); | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|     SCOPE_EXIT({ CloseArchive(*archive_handle); }); | ||||
|  |  | |||
|  | @ -8,8 +8,11 @@ | |||
| #include <initializer_list> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include <boost/optional.hpp> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| 
 | ||||
|  | @ -100,13 +103,11 @@ public: | |||
|      * Loads the system mode that this application needs. | ||||
|      * This function defaults to 2 (96MB allocated to the application) if it can't read the | ||||
|      * information. | ||||
|      * @param boost::optional<u32> Reference to Boost optional to store system mode. | ||||
|      * @ return Result of operation. | ||||
|      * @return A pair with the system mode (If found) and the result. | ||||
|      */ | ||||
|     virtual ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) { | ||||
|     virtual std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() { | ||||
|         // 96MB allocated to the application.
 | ||||
|         system_mode = 2; | ||||
|         return ResultStatus::Success; | ||||
|         return std::make_pair(2, ResultStatus::Success); | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|  |  | |||
|  | @ -121,19 +121,16 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) { | |||
|     return FileType::Error; | ||||
| } | ||||
| 
 | ||||
| ResultStatus AppLoader_NCCH::LoadKernelSystemMode(boost::optional<u32>& system_mode) { | ||||
| std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() { | ||||
|     if (!is_loaded) { | ||||
|         ResultStatus res = LoadExeFS(); | ||||
|         if (res != ResultStatus::Success) { | ||||
|             // Set the system mode as invalid.
 | ||||
|             system_mode = boost::none; | ||||
|             // Return the error code.
 | ||||
|             return res; | ||||
|             return std::make_pair(boost::none, res); | ||||
|         } | ||||
|     } | ||||
|     // Set the system mode as the one from the exheader.
 | ||||
|     system_mode = exheader_header.arm11_system_local_caps.system_mode.Value(); | ||||
|     return ResultStatus::Success; | ||||
|     return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(), | ||||
|                           ResultStatus::Success); | ||||
| } | ||||
| 
 | ||||
| ResultStatus AppLoader_NCCH::LoadExec() { | ||||
|  |  | |||
|  | @ -179,10 +179,9 @@ public: | |||
| 
 | ||||
|     /**
 | ||||
|      * Loads the Exheader and returns the system mode for this application. | ||||
|      * @param boost::optional<u32> Reference to Boost optional to store system mode. | ||||
|      * @return Result of operation. | ||||
|      * @return A pair with the system mode (If found) and the result. | ||||
|      */ | ||||
|     ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) override; | ||||
|     std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() override; | ||||
| 
 | ||||
|     ResultStatus ReadCode(std::vector<u8>& buffer) override; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue