diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/core.cpp | 11 | ||||
-rw-r--r-- | src/core/core.h | 1 | ||||
-rw-r--r-- | src/core/hle/service/filesystem/filesystem.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid.cpp | 1 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid.h | 4 | ||||
-rw-r--r-- | src/core/hle/service/ns/pl_u.cpp | 56 | ||||
-rw-r--r-- | src/core/hle/service/set/set.cpp | 51 | ||||
-rw-r--r-- | src/core/hle/service/set/set.h | 2 | ||||
-rw-r--r-- | src/video_core/debug_utils/debug_utils.cpp | 15 | ||||
-rw-r--r-- | src/video_core/debug_utils/debug_utils.h | 14 | ||||
-rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 8 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 3 | ||||
-rw-r--r-- | src/yuzu/debugger/graphics/graphics_breakpoints.cpp | 1 | ||||
-rw-r--r-- | src/yuzu/debugger/graphics/graphics_surface.cpp | 3 |
14 files changed, 118 insertions, 54 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 28038ff6f..07da4c493 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -135,8 +135,7 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st LOG_CRITICAL(Core, "Failed to determine system mode (Error {})!", static_cast<int>(system_mode.second)); - if (system_mode.second != Loader::ResultStatus::Success) - return ResultStatus::ErrorSystemMode; + return ResultStatus::ErrorSystemMode; } ResultStatus init_result{Init(emu_window)}; @@ -148,14 +147,12 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st } const Loader::ResultStatus load_result{app_loader->Load(current_process)}; - if (Loader::ResultStatus::Success != load_result) { + if (load_result != Loader::ResultStatus::Success) { LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); System::Shutdown(); - if (load_result != Loader::ResultStatus::Success) { - return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + - static_cast<u32>(load_result)); - } + return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + + static_cast<u32>(load_result)); } status = ResultStatus::Success; return status; diff --git a/src/core/core.h b/src/core/core.h index 7188dabdc..0fab76b7f 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -5,6 +5,7 @@ #pragma once #include <array> +#include <map> #include <memory> #include <string> #include <thread> diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 914315d20..881c39e31 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -254,7 +254,7 @@ ResultCode RegisterSDMC(std::unique_ptr<FileSys::SDMCFactory>&& factory) { ResultCode RegisterBIS(std::unique_ptr<FileSys::BISFactory>&& factory) { ASSERT_MSG(bis_factory == nullptr, "Tried to register a second BIS"); bis_factory = std::move(factory); - LOG_DEBUG(Service_FS, "Registred BIS"); + LOG_DEBUG(Service_FS, "Registered BIS"); return RESULT_SUCCESS; } diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 970942d3f..c0ba330dc 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -17,6 +17,7 @@ #include "core/hle/service/hid/irs.h" #include "core/hle/service/hid/xcd.h" #include "core/hle/service/service.h" +#include "core/settings.h" namespace Service::HID { diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index e298f23a6..88d926808 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -4,8 +4,10 @@ #pragma once +#include <array> +#include "common/bit_field.h" +#include "common/common_types.h" #include "core/hle/service/service.h" -#include "core/settings.h" namespace Service::HID { diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp index 53cbf1a6e..923a52cc5 100644 --- a/src/core/hle/service/ns/pl_u.cpp +++ b/src/core/hle/service/ns/pl_u.cpp @@ -35,6 +35,14 @@ static constexpr std::array<std::pair<FontArchives, const char*>, 7> SHARED_FONT std::make_pair(FontArchives::Extension, "nintendo_ext_003.bfttf"), std::make_pair(FontArchives::Extension, "nintendo_ext2_003.bfttf")}; +static constexpr std::array<const char*, 7> SHARED_FONTS_TTF{"FontStandard.ttf", + "FontChineseSimplified.ttf", + "FontExtendedChineseSimplified.ttf", + "FontChineseTraditional.ttf", + "FontKorean.ttf", + "FontNintendoExtended.ttf", + "FontNintendoExtended2.ttf"}; + // The below data is specific to shared font data dumped from Switch on f/w 2.2 // Virtual address and offsets/sizes likely will vary by dump static constexpr VAddr SHARED_FONT_MEM_VADDR{0x00000009d3016000ULL}; @@ -76,6 +84,17 @@ void DecryptSharedFont(const std::vector<u32>& input, std::vector<u8>& output, s offset += transformed_font.size() * sizeof(u32); } +static void EncryptSharedFont(const std::vector<u8>& input, std::vector<u8>& output, + size_t& offset) { + ASSERT_MSG(offset + input.size() + 8 < SHARED_FONT_MEM_SIZE, "Shared fonts exceeds 17mb!"); + const u32 KEY = EXPECTED_MAGIC ^ EXPECTED_RESULT; + std::memcpy(output.data() + offset, &EXPECTED_RESULT, sizeof(u32)); // Magic header + const u32 ENC_SIZE = static_cast<u32>(input.size()) ^ KEY; + std::memcpy(output.data() + offset + sizeof(u32), &ENC_SIZE, sizeof(u32)); + std::memcpy(output.data() + offset + (sizeof(u32) * 2), input.data(), input.size()); + offset += input.size() + (sizeof(u32) * 2); +} + static u32 GetU32Swapped(const u8* data) { u32 value; std::memcpy(&value, data, sizeof(value)); @@ -109,10 +128,10 @@ PL_U::PL_U() : ServiceFramework("pl:u") { RegisterHandlers(functions); // Attempt to load shared font data from disk const auto nand = FileSystem::GetSystemNANDContents(); + size_t offset = 0; // Rebuild shared fonts from data ncas if (nand->HasEntry(static_cast<u64>(FontArchives::Standard), FileSys::ContentRecordType::Data)) { - size_t offset = 0; shared_font = std::make_shared<std::vector<u8>>(SHARED_FONT_MEM_SIZE); for (auto font : SHARED_FONTS) { const auto nca = @@ -152,18 +171,45 @@ PL_U::PL_U() : ServiceFramework("pl:u") { DecryptSharedFont(font_data_u32, *shared_font, offset); SHARED_FONT_REGIONS.push_back(region); } + } else { - const std::string filepath{FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir) + - SHARED_FONT}; + shared_font = std::make_shared<std::vector<u8>>( + SHARED_FONT_MEM_SIZE); // Shared memory needs to always be allocated and a fixed size + + const std::string user_path = FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir); + const std::string filepath{user_path + SHARED_FONT}; + // Create path if not already created if (!FileUtil::CreateFullPath(filepath)) { LOG_ERROR(Service_NS, "Failed to create sharedfonts path \"{}\"!", filepath); return; } + + bool using_ttf = false; + for (const char* font_ttf : SHARED_FONTS_TTF) { + if (FileUtil::Exists(user_path + font_ttf)) { + using_ttf = true; + FileUtil::IOFile file(user_path + font_ttf, "rb"); + if (file.IsOpen()) { + std::vector<u8> ttf_bytes(file.GetSize()); + file.ReadBytes<u8>(ttf_bytes.data(), ttf_bytes.size()); + FontRegion region{ + static_cast<u32>(offset + 8), + static_cast<u32>(ttf_bytes.size())}; // Font offset and size do not account + // for the header + EncryptSharedFont(ttf_bytes, *shared_font, offset); + SHARED_FONT_REGIONS.push_back(region); + } else { + LOG_WARNING(Service_NS, "Unable to load font: {}", font_ttf); + } + } else if (using_ttf) { + LOG_WARNING(Service_NS, "Unable to find font: {}", font_ttf); + } + } + if (using_ttf) + return; FileUtil::IOFile file(filepath, "rb"); - shared_font = std::make_shared<std::vector<u8>>( - SHARED_FONT_MEM_SIZE); // Shared memory needs to always be allocated and a fixed size if (file.IsOpen()) { // Read shared font data ASSERT(file.GetSize() == SHARED_FONT_MEM_SIZE); diff --git a/src/core/hle/service/set/set.cpp b/src/core/hle/service/set/set.cpp index a461e72ec..92b0640e8 100644 --- a/src/core/hle/service/set/set.cpp +++ b/src/core/hle/service/set/set.cpp @@ -32,24 +32,59 @@ constexpr std::array<LanguageCode, 17> available_language_codes = {{ LanguageCode::ZH_HANT, }}; +constexpr size_t pre4_0_0_max_entries = 0xF; +constexpr size_t post4_0_0_max_entries = 0x40; + LanguageCode GetLanguageCodeFromIndex(size_t index) { return available_language_codes.at(index); } -void SET::GetAvailableLanguageCodes(Kernel::HLERequestContext& ctx) { - ctx.WriteBuffer(available_language_codes); +template <size_t size> +static std::array<LanguageCode, size> MakeLanguageCodeSubset() { + std::array<LanguageCode, size> arr; + std::copy_n(available_language_codes.begin(), size, arr.begin()); + return arr; +} +static void PushResponseLanguageCode(Kernel::HLERequestContext& ctx, size_t max_size) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS); - rb.Push(static_cast<u32>(available_language_codes.size())); + if (available_language_codes.size() > max_size) + rb.Push(static_cast<u32>(max_size)); + else + rb.Push(static_cast<u32>(available_language_codes.size())); +} + +void SET::GetAvailableLanguageCodes(Kernel::HLERequestContext& ctx) { + if (available_language_codes.size() > pre4_0_0_max_entries) + ctx.WriteBuffer(MakeLanguageCodeSubset<pre4_0_0_max_entries>()); + else + ctx.WriteBuffer(available_language_codes); + + PushResponseLanguageCode(ctx, pre4_0_0_max_entries); + + LOG_DEBUG(Service_SET, "called"); +} + +void SET::GetAvailableLanguageCodes2(Kernel::HLERequestContext& ctx) { + if (available_language_codes.size() > post4_0_0_max_entries) + ctx.WriteBuffer(MakeLanguageCodeSubset<post4_0_0_max_entries>()); + else + ctx.WriteBuffer(available_language_codes); + + PushResponseLanguageCode(ctx, post4_0_0_max_entries); LOG_DEBUG(Service_SET, "called"); } void SET::GetAvailableLanguageCodeCount(Kernel::HLERequestContext& ctx) { - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(RESULT_SUCCESS); - rb.Push(static_cast<u32>(available_language_codes.size())); + PushResponseLanguageCode(ctx, pre4_0_0_max_entries); + + LOG_DEBUG(Service_SET, "called"); +} + +void SET::GetAvailableLanguageCodeCount2(Kernel::HLERequestContext& ctx) { + PushResponseLanguageCode(ctx, post4_0_0_max_entries); LOG_DEBUG(Service_SET, "called"); } @@ -69,8 +104,8 @@ SET::SET() : ServiceFramework("set") { {2, nullptr, "MakeLanguageCode"}, {3, &SET::GetAvailableLanguageCodeCount, "GetAvailableLanguageCodeCount"}, {4, nullptr, "GetRegionCode"}, - {5, &SET::GetAvailableLanguageCodes, "GetAvailableLanguageCodes2"}, - {6, &SET::GetAvailableLanguageCodeCount, "GetAvailableLanguageCodeCount2"}, + {5, &SET::GetAvailableLanguageCodes2, "GetAvailableLanguageCodes2"}, + {6, &SET::GetAvailableLanguageCodeCount2, "GetAvailableLanguageCodeCount2"}, {7, nullptr, "GetKeyCodeMap"}, {8, nullptr, "GetQuestFlag"}, }; diff --git a/src/core/hle/service/set/set.h b/src/core/hle/service/set/set.h index 4232b6162..669e740b7 100644 --- a/src/core/hle/service/set/set.h +++ b/src/core/hle/service/set/set.h @@ -38,7 +38,9 @@ public: private: void GetLanguageCode(Kernel::HLERequestContext& ctx); void GetAvailableLanguageCodes(Kernel::HLERequestContext& ctx); + void GetAvailableLanguageCodes2(Kernel::HLERequestContext& ctx); void GetAvailableLanguageCodeCount(Kernel::HLERequestContext& ctx); + void GetAvailableLanguageCodeCount2(Kernel::HLERequestContext& ctx); }; } // namespace Service::Set diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp index 22d44aab2..5ffb492ea 100644 --- a/src/video_core/debug_utils/debug_utils.cpp +++ b/src/video_core/debug_utils/debug_utils.cpp @@ -2,23 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include <algorithm> -#include <condition_variable> -#include <cstdint> -#include <cstring> -#include <fstream> -#include <map> #include <mutex> -#include <string> -#include "common/assert.h" -#include "common/bit_field.h" -#include "common/color.h" -#include "common/common_types.h" -#include "common/file_util.h" -#include "common/logging/log.h" -#include "common/math_util.h" -#include "common/vector_math.h" #include "video_core/debug_utils/debug_utils.h" namespace Tegra { diff --git a/src/video_core/debug_utils/debug_utils.h b/src/video_core/debug_utils/debug_utils.h index 9382a75e5..c235faf46 100644 --- a/src/video_core/debug_utils/debug_utils.h +++ b/src/video_core/debug_utils/debug_utils.h @@ -4,19 +4,11 @@ #pragma once -#include <algorithm> #include <array> #include <condition_variable> -#include <iterator> #include <list> -#include <map> #include <memory> #include <mutex> -#include <string> -#include <utility> -#include <vector> -#include "common/common_types.h" -#include "common/vector_math.h" namespace Tegra { @@ -46,7 +38,7 @@ public: class BreakPointObserver { public: /// Constructs the object such that it observes events of the given DebugContext. - BreakPointObserver(std::shared_ptr<DebugContext> debug_context) + explicit BreakPointObserver(std::shared_ptr<DebugContext> debug_context) : context_weak(debug_context) { std::unique_lock<std::mutex> lock(debug_context->breakpoint_mutex); debug_context->breakpoint_observers.push_back(this); @@ -141,8 +133,8 @@ public: } // TODO: Evaluate if access to these members should be hidden behind a public interface. - std::array<BreakPoint, (int)Event::NumEvents> breakpoints; - Event active_breakpoint; + std::array<BreakPoint, static_cast<int>(Event::NumEvents)> breakpoints; + Event active_breakpoint{}; bool at_breakpoint = false; private: diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 68f91cc75..f32a79d7b 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -218,10 +218,6 @@ void Maxwell3D::DrawArrays() { debug_context->OnEvent(Tegra::DebugContext::Event::IncomingPrimitiveBatch, nullptr); } - if (debug_context) { - debug_context->OnEvent(Tegra::DebugContext::Event::FinishedPrimitiveBatch, nullptr); - } - // Both instance configuration registers can not be set at the same time. ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, "Illegal combination of instancing parameters"); @@ -237,6 +233,10 @@ void Maxwell3D::DrawArrays() { const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count}; rasterizer.AccelerateDrawBatch(is_indexed); + if (debug_context) { + debug_context->OnEvent(Tegra::DebugContext::Event::FinishedPrimitiveBatch, nullptr); + } + // TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if // the game is trying to draw indexed or direct mode. This needs to be verified on HW still - // it's possible that it is incorrect and that there is some other register used to specify the diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 8bfa75b84..96851ccb5 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -929,7 +929,8 @@ void RasterizerOpenGL::SyncLogicOpState() { if (!state.logic_op.enabled) return; - ASSERT_MSG(regs.blend.enable == 0, "Blending and logic op can't be enabled at the same time."); + ASSERT_MSG(regs.blend.enable[0] == 0, + "Blending and logic op can't be enabled at the same time."); state.logic_op.operation = MaxwellToGL::LogicOp(regs.logic_op.operation); } diff --git a/src/yuzu/debugger/graphics/graphics_breakpoints.cpp b/src/yuzu/debugger/graphics/graphics_breakpoints.cpp index eb16a38a0..fe682b3b8 100644 --- a/src/yuzu/debugger/graphics/graphics_breakpoints.cpp +++ b/src/yuzu/debugger/graphics/graphics_breakpoints.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <map> #include <QLabel> #include <QMetaType> #include <QPushButton> diff --git a/src/yuzu/debugger/graphics/graphics_surface.cpp b/src/yuzu/debugger/graphics/graphics_surface.cpp index e037223c2..2b20cf5b9 100644 --- a/src/yuzu/debugger/graphics/graphics_surface.cpp +++ b/src/yuzu/debugger/graphics/graphics_surface.cpp @@ -11,12 +11,13 @@ #include <QPushButton> #include <QScrollArea> #include <QSpinBox> +#include "common/vector_math.h" #include "core/core.h" +#include "core/memory.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/gpu.h" #include "video_core/textures/decoders.h" #include "video_core/textures/texture.h" -#include "video_core/utils.h" #include "yuzu/debugger/graphics/graphics_surface.h" #include "yuzu/util/spinbox.h" |