early-access version 3910
This commit is contained in:
parent
8c5b474690
commit
64e16a1629
21 changed files with 60 additions and 29 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 += "&";
|
escaped += "&";
|
||||||
|
@ -86,7 +95,11 @@ static std::string EscapeXML(std::string_view data) {
|
||||||
escaped += ">";
|
escaped += ">";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
escaped += c;
|
if (c > 0x7f) {
|
||||||
|
escaped += fmt::format("&#{};", static_cast<u32>(c));
|
||||||
|
} else {
|
||||||
|
escaped += static_cast<char>(c);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -40,7 +40,7 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_)
|
||||||
{0, nullptr, "GetAlbumFileCount"},
|
{0, nullptr, "GetAlbumFileCount"},
|
||||||
{1, nullptr, "GetAlbumFileList"},
|
{1, nullptr, "GetAlbumFileList"},
|
||||||
{2, nullptr, "LoadAlbumFile"},
|
{2, nullptr, "LoadAlbumFile"},
|
||||||
{3, &IAlbumAccessorService::DeleteAlbumFile, "DeleteAlbumFile"},
|
{3, &IAlbumAccessorService::DeleteAlbumFile, "DeleteAlbumFile"},
|
||||||
{4, nullptr, "StorageCopyAlbumFile"},
|
{4, nullptr, "StorageCopyAlbumFile"},
|
||||||
{5, &IAlbumAccessorService::IsAlbumMounted, "IsAlbumMounted"},
|
{5, &IAlbumAccessorService::IsAlbumMounted, "IsAlbumMounted"},
|
||||||
{6, nullptr, "GetAlbumUsage"},
|
{6, nullptr, "GetAlbumUsage"},
|
||||||
|
@ -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 = {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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, {}};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue