early-access version 3910

This commit is contained in:
pineappleEA 2023-10-03 01:58:51 +02:00
parent 8c5b474690
commit 64e16a1629
21 changed files with 60 additions and 29 deletions

View file

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: 2019 yuzu Emulator Project # SPDX-FileCopyrightText: 2019 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
# Gets a UTC timstamp and sets the provided variable to it # Gets a UTC timestamp and sets the provided variable to it
function(get_timestamp _var) function(get_timestamp _var)
string(TIMESTAMP timestamp UTC) string(TIMESTAMP timestamp UTC)
set(${_var} "${timestamp}" PARENT_SCOPE) set(${_var} "${timestamp}" PARENT_SCOPE)

View file

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 3909. This is the source code for early-access 3910.
## Legal Notice ## Legal Notice

View file

@ -16,7 +16,7 @@ namespace AudioCore::Renderer {
/** /**
* AudioRenderer command for preparing depop. * AudioRenderer command for preparing depop.
* Adds the previusly output last samples to the depop buffer. * Adds the previously output last samples to the depop buffer.
*/ */
struct DepopPrepareCommand : ICommand { struct DepopPrepareCommand : ICommand {
/** /**

View file

@ -135,6 +135,11 @@ std::u16string UTF8ToUTF16(std::string_view input) {
return convert.from_bytes(input.data(), input.data() + input.size()); return convert.from_bytes(input.data(), input.data() + input.size());
} }
std::u32string UTF8ToUTF32(std::string_view input) {
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;
return convert.from_bytes(input.data(), input.data() + input.size());
}
#ifdef _WIN32 #ifdef _WIN32
static std::wstring CPToUTF16(u32 code_page, std::string_view input) { static std::wstring CPToUTF16(u32 code_page, std::string_view input) {
const auto size = const auto size =

View file

@ -38,6 +38,7 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _
[[nodiscard]] std::string UTF16ToUTF8(std::u16string_view input); [[nodiscard]] std::string UTF16ToUTF8(std::u16string_view input);
[[nodiscard]] std::u16string UTF8ToUTF16(std::string_view input); [[nodiscard]] std::u16string UTF8ToUTF16(std::string_view input);
[[nodiscard]] std::u32string UTF8ToUTF32(std::string_view input);
#ifdef _WIN32 #ifdef _WIN32
[[nodiscard]] std::string UTF16ToUTF8(std::wstring_view input); [[nodiscard]] std::string UTF16ToUTF8(std::wstring_view input);

View file

@ -2,6 +2,8 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <atomic> #include <atomic>
#include <codecvt>
#include <locale>
#include <numeric> #include <numeric>
#include <optional> #include <optional>
#include <thread> #include <thread>
@ -12,6 +14,7 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/scope_exit.h" #include "common/scope_exit.h"
#include "common/settings.h" #include "common/settings.h"
#include "common/string_util.h"
#include "core/arm/arm_interface.h" #include "core/arm/arm_interface.h"
#include "core/core.h" #include "core/core.h"
#include "core/debugger/gdbstub.h" #include "core/debugger/gdbstub.h"
@ -68,10 +71,16 @@ static std::string EscapeGDB(std::string_view data) {
} }
static std::string EscapeXML(std::string_view data) { static std::string EscapeXML(std::string_view data) {
std::u32string converted = U"[Encoding error]";
try {
converted = Common::UTF8ToUTF32(data);
} catch (std::range_error&) {
}
std::string escaped; std::string escaped;
escaped.reserve(data.size()); escaped.reserve(data.size());
for (char c : data) { for (char32_t c : converted) {
switch (c) { switch (c) {
case '&': case '&':
escaped += "&amp;"; escaped += "&amp;";
@ -86,7 +95,11 @@ static std::string EscapeXML(std::string_view data) {
escaped += "&gt;"; escaped += "&gt;";
break; break;
default: default:
escaped += c; if (c > 0x7f) {
escaped += fmt::format("&#{};", static_cast<u32>(c));
} else {
escaped += static_cast<char>(c);
}
break; break;
} }
} }

View file

@ -5,6 +5,7 @@
#include <vector> #include <vector>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/scope_exit.h"
#include "core/file_sys/program_metadata.h" #include "core/file_sys/program_metadata.h"
#include "core/file_sys/vfs.h" #include "core/file_sys/vfs.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
@ -95,6 +96,13 @@ Loader::ResultStatus ProgramMetadata::Load(VirtualFile file) {
return Loader::ResultStatus::Success; return Loader::ResultStatus::Success;
} }
Loader::ResultStatus ProgramMetadata::Reload(VirtualFile file) {
const u64 original_program_id = aci_header.title_id;
SCOPE_EXIT({ aci_header.title_id = original_program_id; });
return this->Load(file);
}
/*static*/ ProgramMetadata ProgramMetadata::GetDefault() { /*static*/ ProgramMetadata ProgramMetadata::GetDefault() {
// Allow use of cores 0~3 and thread priorities 1~63. // Allow use of cores 0~3 and thread priorities 1~63.
constexpr u32 default_thread_info_capability = 0x30007F7; constexpr u32 default_thread_info_capability = 0x30007F7;

View file

@ -56,6 +56,7 @@ public:
static ProgramMetadata GetDefault(); static ProgramMetadata GetDefault();
Loader::ResultStatus Load(VirtualFile file); Loader::ResultStatus Load(VirtualFile file);
Loader::ResultStatus Reload(VirtualFile file);
/// Load from parameters instead of NPDM file, used for KIP /// Load from parameters instead of NPDM file, used for KIP
void LoadManual(bool is_64_bit, ProgramAddressSpaceType address_space, s32 main_thread_prio, void LoadManual(bool is_64_bit, ProgramAddressSpaceType address_space, s32 main_thread_prio,

View file

@ -175,7 +175,7 @@ public:
return Write(reinterpret_cast<const u8*>(&data), sizeof(T), offset); return Write(reinterpret_cast<const u8*>(&data), sizeof(T), offset);
} }
// Renames the file to name. Returns whether or not the operation was successsful. // Renames the file to name. Returns whether or not the operation was successful.
virtual bool Rename(std::string_view name) = 0; virtual bool Rename(std::string_view name) = 0;
// Returns the full path of this file as a string, recursively // Returns the full path of this file as a string, recursively

View file

@ -61,7 +61,7 @@ bool KMemoryRegionTree::Insert(u64 address, size_t size, u32 type_id, u32 new_at
found->Reset(address, inserted_region_last, old_pair, new_attr, type_id); found->Reset(address, inserted_region_last, old_pair, new_attr, type_id);
this->insert(*found); this->insert(*found);
} else { } else {
// If we can't re-use, adjust the old region. // If we can't reuse, adjust the old region.
found->Reset(old_address, address - 1, old_pair, old_attr, old_type); found->Reset(old_address, address - 1, old_pair, old_attr, old_type);
this->insert(*found); this->insert(*found);

View file

@ -786,7 +786,9 @@ void ILockAccessor::TryLock(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx}; IPC::RequestParser rp{ctx};
const auto return_handle = rp.Pop<bool>(); const auto return_handle = rp.Pop<bool>();
LOG_INFO(Service_AM, "called, return_handle={}", return_handle); LOG_WARNING(Service_AM, "(STUBBED) called, return_handle={}", return_handle);
// TODO: When return_handle is true this function should return the lock handle
is_locked = true; is_locked = true;
@ -796,7 +798,7 @@ void ILockAccessor::TryLock(HLERequestContext& ctx) {
} }
void ILockAccessor::Unlock(HLERequestContext& ctx) { void ILockAccessor::Unlock(HLERequestContext& ctx) {
LOG_WARNING(Service_AM, "called"); LOG_INFO(Service_AM, "called");
is_locked = false; is_locked = false;
@ -805,7 +807,7 @@ void ILockAccessor::Unlock(HLERequestContext& ctx) {
} }
void ILockAccessor::GetEvent(HLERequestContext& ctx) { void ILockAccessor::GetEvent(HLERequestContext& ctx) {
LOG_WARNING(Service_AM, "called"); LOG_INFO(Service_AM, "called");
lock_event->Signal(); lock_event->Signal();
@ -815,7 +817,7 @@ void ILockAccessor::GetEvent(HLERequestContext& ctx) {
} }
void ILockAccessor::IsLocked(HLERequestContext& ctx) { void ILockAccessor::IsLocked(HLERequestContext& ctx) {
LOG_WARNING(Service_AM, "called"); LOG_INFO(Service_AM, "called");
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);

View file

@ -282,8 +282,8 @@ Result IAlbumAccessorService::GetAlbumEntry(AlbumEntry& out_entry,
std::getline(line_stream, date, '_'); std::getline(line_stream, date, '_');
std::getline(line_stream, time, '_'); std::getline(line_stream, time, '_');
std::istringstream line_stream2(date); std::istringstream date_stream(date);
std::istringstream line_stream3(time); std::istringstream time_stream(time);
std::string year; std::string year;
std::string month; std::string month;
std::string day; std::string day;
@ -291,13 +291,13 @@ Result IAlbumAccessorService::GetAlbumEntry(AlbumEntry& out_entry,
std::string minute; std::string minute;
std::string second; std::string second;
std::getline(line_stream2, year, '-'); std::getline(date_stream, year, '-');
std::getline(line_stream2, month, '-'); std::getline(date_stream, month, '-');
std::getline(line_stream2, day, '-'); std::getline(date_stream, day, '-');
std::getline(line_stream3, hour, '-'); std::getline(time_stream, hour, '-');
std::getline(line_stream3, minute, '-'); std::getline(time_stream, minute, '-');
std::getline(line_stream3, second, '-'); std::getline(time_stream, second, '-');
try { try {
out_entry = { out_entry = {

View file

@ -39,7 +39,7 @@ private:
enum class ScreenShotOrientation : u32 { enum class ScreenShotOrientation : u32 {
None, None,
Rotate90, Rotate90,
Rotat180, Rotate180,
Rotate270, Rotate270,
}; };
@ -50,6 +50,7 @@ private:
u32 unknown_2; u32 unknown_2;
INSERT_PADDING_BYTES(0x30); INSERT_PADDING_BYTES(0x30);
}; };
static_assert(sizeof(ScreenShotAttribute) == 0x40, "ScreenShotAttribute is an invalid size");
struct ScreenShotDecodeOption { struct ScreenShotDecodeOption {
ScreenShotDecoderFlag flags; ScreenShotDecoderFlag flags;

View file

@ -118,7 +118,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
return {ResultStatus::ErrorMissingNPDM, {}}; return {ResultStatus::ErrorMissingNPDM, {}};
} }
const ResultStatus result2 = metadata.Load(npdm); const ResultStatus result2 = metadata.Reload(npdm);
if (result2 != ResultStatus::Success) { if (result2 != ResultStatus::Success) {
return {result2, {}}; return {result2, {}};
} }

View file

@ -67,7 +67,7 @@ public:
* @param player_index the player number that will take this action * @param player_index the player number that will take this action
* @param delta_timestamp time passed since last reading * @param delta_timestamp time passed since last reading
* @param gyro_x,gyro_y,gyro_z the gyro sensor readings * @param gyro_x,gyro_y,gyro_z the gyro sensor readings
* @param accel_x,accel_y,accel_z the acelerometer reading * @param accel_x,accel_y,accel_z the accelerometer reading
*/ */
void SetMotionState(std::size_t player_index, u64 delta_timestamp, float gyro_x, float gyro_y, void SetMotionState(std::size_t player_index, u64 delta_timestamp, float gyro_x, float gyro_y,
float gyro_z, float accel_x, float accel_y, float accel_z); float gyro_z, float accel_x, float accel_y, float accel_z);

View file

@ -55,7 +55,7 @@ public:
/** /**
* Configures the motion sensor with the specified parameters * Configures the motion sensor with the specified parameters
* @param gsen gyroscope sensor sensitvity in degrees per second * @param gsen gyroscope sensor sensitivity in degrees per second
* @param gfrec gyroscope sensor frequency in hertz * @param gfrec gyroscope sensor frequency in hertz
* @param asen accelerometer sensitivity in G force * @param asen accelerometer sensitivity in G force
* @param afrec accelerometer frequency in hertz * @param afrec accelerometer frequency in hertz

View file

@ -55,7 +55,7 @@ void CompositeInsert(EmitContext& ctx, IR::Inst& inst, Register composite, Objec
"MOV.{} {}.{},{};", "MOV.{} {}.{},{};",
type, ret, composite, type, ret, swizzle, object); type, ret, composite, type, ret, swizzle, object);
} else { } else {
// The return value is alised so we can just insert the object, it doesn't matter if it's // The return value is aliased so we can just insert the object, it doesn't matter if it's
// aliased // aliased
ctx.Add("MOV.{} {}.{},{};", type, ret, swizzle, object); ctx.Add("MOV.{} {}.{},{};", type, ret, swizzle, object);
} }

View file

@ -161,7 +161,7 @@ private:
u32 method_count; ///< Current method count u32 method_count; ///< Current method count
u32 length_pending; ///< Large NI command length pending u32 length_pending; ///< Large NI command length pending
GPUVAddr dma_get; ///< Currently read segment GPUVAddr dma_get; ///< Currently read segment
u64 dma_word_offset; ///< Current word ofset from address u64 dma_word_offset; ///< Current word offset from address
bool non_incrementing; ///< Current command's NI flag bool non_incrementing; ///< Current command's NI flag
bool is_last_call; bool is_last_call;
}; };

View file

@ -41,7 +41,7 @@ enum class ImageFlagBits : u32 {
IsRescalable = 1 << 15, IsRescalable = 1 << 15,
AsynchronousDecode = 1 << 16, AsynchronousDecode = 1 << 16,
IsDecoding = 1 << 17, ///< Is currently being decoded asynchornously. IsDecoding = 1 << 17, ///< Is currently being decoded asynchronously.
}; };
DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits)

View file

@ -1195,7 +1195,7 @@ std::optional<SubresourceBase> FindSubresource(const ImageInfo& candidate, const
return std::nullopt; return std::nullopt;
} }
} else { } else {
// Format comaptibility is not relaxed, ensure we are creating a view on a compatible format // Format compatibility is not relaxed, ensure we are creating a view on a compatible format
if (!IsViewCompatible(existing.format, candidate.format, broken_views, native_bgr)) { if (!IsViewCompatible(existing.format, candidate.format, broken_views, native_bgr)) {
return std::nullopt; return std::nullopt;
} }

View file

@ -314,7 +314,7 @@ public:
return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY; return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY;
} }
/// Returns true if the device suppors float64 natively. /// Returns true if the device supports float64 natively.
bool IsFloat64Supported() const { bool IsFloat64Supported() const {
return features.features.shaderFloat64; return features.features.shaderFloat64;
} }