game_database.h (3955B)
1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #pragma once 5 #include "core/types.h" 6 #include "util/cd_image_hasher.h" 7 #include <bitset> 8 #include <map> 9 #include <string> 10 #include <string_view> 11 #include <vector> 12 13 class CDImage; 14 15 struct Settings; 16 17 namespace GameDatabase { 18 enum class CompatibilityRating : u8 19 { 20 Unknown = 0, 21 DoesntBoot = 1, 22 CrashesInIntro = 2, 23 CrashesInGame = 3, 24 GraphicalAudioIssues = 4, 25 NoIssues = 5, 26 Count, 27 }; 28 29 enum class Trait : u32 30 { 31 ForceInterpreter, 32 ForceSoftwareRenderer, 33 ForceSoftwareRendererForReadbacks, 34 ForceRoundUpscaledTextureCoordinates, 35 ForceAccurateBlending, 36 ForceInterlacing, 37 DisableAutoAnalogMode, 38 DisableTrueColor, 39 DisableUpscaling, 40 DisableTextureFiltering, 41 DisableSpriteTextureFiltering, 42 DisableScaledDithering, 43 DisableForceNTSCTimings, 44 DisableWidescreen, 45 DisablePGXP, 46 DisablePGXPCulling, 47 DisablePGXPTextureCorrection, 48 DisablePGXPColorCorrection, 49 DisablePGXPDepthBuffer, 50 DisablePGXPPreserveProjFP, 51 DisablePGXPOn2DPolygons, 52 ForcePGXPVertexCache, 53 ForcePGXPCPUMode, 54 ForceRecompilerMemoryExceptions, 55 ForceRecompilerICache, 56 ForceRecompilerLUTFastmem, 57 IsLibCryptProtected, 58 59 Count 60 }; 61 62 struct Entry 63 { 64 // TODO: Make string_view. 65 std::string serial; 66 std::string title; 67 std::string genre; 68 std::string developer; 69 std::string publisher; 70 std::string compatibility_version_tested; 71 std::string compatibility_comments; 72 u64 release_date; 73 u8 min_players; 74 u8 max_players; 75 u8 min_blocks; 76 u8 max_blocks; 77 u16 supported_controllers; 78 CompatibilityRating compatibility; 79 80 std::bitset<static_cast<int>(Trait::Count)> traits{}; 81 std::optional<s16> display_active_start_offset; 82 std::optional<s16> display_active_end_offset; 83 std::optional<s8> display_line_start_offset; 84 std::optional<s8> display_line_end_offset; 85 std::optional<DisplayCropMode> display_crop_mode; 86 std::optional<DisplayDeinterlacingMode> display_deinterlacing_mode; 87 std::optional<GPULineDetectMode> gpu_line_detect_mode; 88 std::optional<u32> dma_max_slice_ticks; 89 std::optional<u32> dma_halt_ticks; 90 std::optional<u32> gpu_fifo_size; 91 std::optional<u32> gpu_max_run_ahead; 92 std::optional<float> gpu_pgxp_tolerance; 93 std::optional<float> gpu_pgxp_depth_threshold; 94 95 std::string disc_set_name; 96 std::vector<std::string> disc_set_serials; 97 98 ALWAYS_INLINE bool HasTrait(Trait trait) const { return traits[static_cast<int>(trait)]; } 99 100 void ApplySettings(Settings& settings, bool display_osd_messages) const; 101 102 std::string GenerateCompatibilityReport() const; 103 }; 104 105 void EnsureLoaded(); 106 void Unload(); 107 108 const Entry* GetEntryForDisc(CDImage* image); 109 const Entry* GetEntryForGameDetails(const std::string& id, u64 hash); 110 const Entry* GetEntryForSerial(std::string_view serial); 111 std::string GetSerialForDisc(CDImage* image); 112 std::string GetSerialForPath(const char* path); 113 114 const char* GetTraitName(Trait trait); 115 const char* GetTraitDisplayName(Trait trait); 116 117 const char* GetCompatibilityRatingName(CompatibilityRating rating); 118 const char* GetCompatibilityRatingDisplayName(CompatibilityRating rating); 119 120 /// Map of track hashes for image verification 121 struct TrackData 122 { 123 TrackData(std::string serial_, std::string revision_str_, uint32_t revision_) 124 : serial(std::move(serial_)), revision_str(std::move(revision_str_)), revision(revision_) 125 { 126 } 127 128 friend bool operator==(const TrackData& left, const TrackData& right) 129 { 130 // 'revisionString' is deliberately ignored in comparisons as it's redundant with comparing 'revision'! Do not 131 // change! 132 return left.serial == right.serial && left.revision == right.revision; 133 } 134 135 std::string serial; 136 std::string revision_str; 137 u32 revision; 138 }; 139 140 using TrackHashesMap = std::multimap<CDImageHasher::Hash, TrackData>; 141 const TrackHashesMap& GetTrackHashesMap(); 142 void EnsureTrackHashesMapLoaded(); 143 144 } // namespace GameDatabase