early-access version 3046
This commit is contained in:
parent
0af3e1b4e0
commit
1fe5109179
@ -541,9 +541,9 @@ add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
|
|||||||
# Adjustments for MSVC + Ninja
|
# Adjustments for MSVC + Ninja
|
||||||
if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
|
if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
/wd4711 # function 'function' selected for automatic inline expansion
|
|
||||||
/wd4464 # relative include path contains '..'
|
/wd4464 # relative include path contains '..'
|
||||||
/wd4820 # 'identifier1': '4' bytes padding added after data member 'identifier2'
|
/wd4711 # function 'function' selected for automatic inline expansion
|
||||||
|
/wd4820 # 'bytes' bytes padding added after construct 'member_name'
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3045.
|
This is the source code for early-access 3046.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
@ -58,13 +58,11 @@ if (MSVC)
|
|||||||
|
|
||||||
# Warnings
|
# Warnings
|
||||||
/W3
|
/W3
|
||||||
/we4018 # 'expression': signed/unsigned mismatch
|
/WX
|
||||||
|
|
||||||
/we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
|
/we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
|
||||||
/we4101 # 'identifier': unreferenced local variable
|
|
||||||
/we4189 # 'identifier': local variable is initialized but not referenced
|
/we4189 # 'identifier': local variable is initialized but not referenced
|
||||||
/we4265 # 'class': class has virtual functions, but destructor is not virtual
|
/we4265 # 'class': class has virtual functions, but destructor is not virtual
|
||||||
/we4267 # 'var': conversion from 'size_t' to 'type', possible loss of data
|
|
||||||
/we4305 # 'context': truncation from 'type1' to 'type2'
|
|
||||||
/we4388 # 'expression': signed/unsigned mismatch
|
/we4388 # 'expression': signed/unsigned mismatch
|
||||||
/we4389 # 'operator': signed/unsigned mismatch
|
/we4389 # 'operator': signed/unsigned mismatch
|
||||||
/we4456 # Declaration of 'identifier' hides previous local declaration
|
/we4456 # Declaration of 'identifier' hides previous local declaration
|
||||||
@ -75,10 +73,13 @@ if (MSVC)
|
|||||||
/we4547 # 'operator': operator before comma has no effect; expected operator with side-effect
|
/we4547 # 'operator': operator before comma has no effect; expected operator with side-effect
|
||||||
/we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'?
|
/we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'?
|
||||||
/we4555 # Expression has no effect; expected expression with side-effect
|
/we4555 # Expression has no effect; expected expression with side-effect
|
||||||
/we4715 # 'function': not all control paths return a value
|
/we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior.
|
||||||
/we4834 # Discarding return value of function with 'nodiscard' attribute
|
|
||||||
/we5038 # data member 'member1' will be initialized after data member 'member2'
|
/we5038 # data member 'member1' will be initialized after data member 'member2'
|
||||||
|
/we5233 # explicit lambda capture 'identifier' is not used
|
||||||
/we5245 # 'function': unreferenced function with internal linkage has been removed
|
/we5245 # 'function': unreferenced function with internal linkage has been removed
|
||||||
|
|
||||||
|
/wd4100 # 'identifier': unreferenced formal parameter
|
||||||
|
/wd4324 # 'struct_name': structure was padded due to __declspec(align())
|
||||||
)
|
)
|
||||||
|
|
||||||
if (USE_CCACHE)
|
if (USE_CCACHE)
|
||||||
@ -99,24 +100,18 @@ if (MSVC)
|
|||||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
||||||
else()
|
else()
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-Wall
|
-Werror=all
|
||||||
-Werror=array-bounds
|
-Werror=extra
|
||||||
-Werror=implicit-fallthrough
|
|
||||||
-Werror=missing-declarations
|
-Werror=missing-declarations
|
||||||
-Werror=missing-field-initializers
|
|
||||||
-Werror=reorder
|
|
||||||
-Werror=shadow
|
-Werror=shadow
|
||||||
-Werror=sign-compare
|
-Werror=unused
|
||||||
-Werror=switch
|
|
||||||
-Werror=uninitialized
|
|
||||||
-Werror=unused-function
|
|
||||||
-Werror=unused-result
|
|
||||||
-Werror=unused-variable
|
|
||||||
-Wextra
|
|
||||||
-Wmissing-declarations
|
|
||||||
-Wno-attributes
|
-Wno-attributes
|
||||||
-Wno-invalid-offsetof
|
-Wno-invalid-offsetof
|
||||||
-Wno-unused-parameter
|
-Wno-unused-parameter
|
||||||
|
|
||||||
|
$<$<CXX_COMPILER_ID:Clang>:-Wno-braced-scalar-init>
|
||||||
|
$<$<CXX_COMPILER_ID:Clang>:-Wno-unused-private-field>
|
||||||
)
|
)
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
|
@ -206,20 +206,11 @@ if (MSVC)
|
|||||||
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
||||||
/we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
|
/we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
|
||||||
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
||||||
/we4456 # Declaration of 'identifier' hides previous local declaration
|
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
||||||
/we4457 # Declaration of 'identifier' hides function parameter
|
|
||||||
/we4458 # Declaration of 'identifier' hides class member
|
|
||||||
/we4459 # Declaration of 'identifier' hides global declaration
|
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_options(audio_core PRIVATE
|
target_compile_options(audio_core PRIVATE
|
||||||
-Werror=conversion
|
-Werror=conversion
|
||||||
-Werror=ignored-qualifiers
|
|
||||||
-Werror=shadow
|
|
||||||
-Werror=unused-variable
|
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
|
|
||||||
|
|
||||||
-Wno-sign-conversion
|
-Wno-sign-conversion
|
||||||
)
|
)
|
||||||
|
@ -91,7 +91,7 @@ Result InfoUpdater::UpdateVoices(VoiceContext& voice_context,
|
|||||||
voice_info.Initialize();
|
voice_info.Initialize();
|
||||||
|
|
||||||
for (u32 channel = 0; channel < in_param.channel_count; channel++) {
|
for (u32 channel = 0; channel < in_param.channel_count; channel++) {
|
||||||
std::memset(voice_states[channel], 0, sizeof(VoiceState));
|
*voice_states[channel] = {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ void BiquadFilterCommand::Dump([[maybe_unused]] const ADSP::CommandListProcessor
|
|||||||
void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) {
|
void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) {
|
||||||
auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)};
|
auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)};
|
||||||
if (needs_init) {
|
if (needs_init) {
|
||||||
std::memset(state_, 0, sizeof(VoiceState::BiquadFilterState));
|
*state_ = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto input_buffer{
|
auto input_buffer{
|
||||||
|
@ -30,7 +30,7 @@ void MultiTapBiquadFilterCommand::Process(const ADSP::CommandListProcessor& proc
|
|||||||
for (u32 i = 0; i < filter_tap_count; i++) {
|
for (u32 i = 0; i < filter_tap_count; i++) {
|
||||||
auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])};
|
auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])};
|
||||||
if (needs_init[i]) {
|
if (needs_init[i]) {
|
||||||
std::memset(state, 0, sizeof(VoiceState::BiquadFilterState));
|
*state = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state,
|
ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state,
|
||||||
|
@ -156,12 +156,13 @@ if (MSVC)
|
|||||||
)
|
)
|
||||||
target_compile_options(common PRIVATE
|
target_compile_options(common PRIVATE
|
||||||
/W4
|
/W4
|
||||||
/WX
|
|
||||||
|
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
||||||
|
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
||||||
|
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_options(common PRIVATE
|
target_compile_options(common PRIVATE
|
||||||
-Werror
|
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
@ -141,10 +141,6 @@ public:
|
|||||||
constexpr BitField(BitField&&) noexcept = default;
|
constexpr BitField(BitField&&) noexcept = default;
|
||||||
constexpr BitField& operator=(BitField&&) noexcept = default;
|
constexpr BitField& operator=(BitField&&) noexcept = default;
|
||||||
|
|
||||||
[[nodiscard]] constexpr operator T() const {
|
|
||||||
return Value();
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr void Assign(const T& value) {
|
constexpr void Assign(const T& value) {
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value));
|
storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value));
|
||||||
@ -162,6 +158,17 @@ public:
|
|||||||
return ExtractValue(storage);
|
return ExtractValue(storage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ConvertedToType>
|
||||||
|
[[nodiscard]] constexpr ConvertedToType As() const {
|
||||||
|
static_assert(!std::is_same_v<T, ConvertedToType>,
|
||||||
|
"Unnecessary cast. Use Value() instead.");
|
||||||
|
return static_cast<ConvertedToType>(Value());
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr operator T() const {
|
||||||
|
return Value();
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] constexpr explicit operator bool() const {
|
[[nodiscard]] constexpr explicit operator bool() const {
|
||||||
return Value() != 0;
|
return Value() != 0;
|
||||||
}
|
}
|
||||||
|
@ -21,11 +21,6 @@ constexpr size_t hardware_interference_size = std::hardware_destructive_interfer
|
|||||||
constexpr size_t hardware_interference_size = 64;
|
constexpr size_t hardware_interference_size = 64;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(push)
|
|
||||||
#pragma warning(disable : 4324)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename T, size_t capacity = 0x400>
|
template <typename T, size_t capacity = 0x400>
|
||||||
class MPSCQueue {
|
class MPSCQueue {
|
||||||
public:
|
public:
|
||||||
@ -160,8 +155,4 @@ private:
|
|||||||
static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible");
|
static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible");
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
@ -774,19 +774,15 @@ if (MSVC)
|
|||||||
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
||||||
/we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
|
/we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
|
||||||
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
||||||
|
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_options(core PRIVATE
|
target_compile_options(core PRIVATE
|
||||||
-Werror=conversion
|
-Werror=conversion
|
||||||
-Werror=ignored-qualifiers
|
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
|
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
|
||||||
|
|
||||||
-Wno-sign-conversion
|
-Wno-sign-conversion
|
||||||
|
|
||||||
|
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -384,6 +384,7 @@ struct System::Impl {
|
|||||||
kernel.ShutdownCores();
|
kernel.ShutdownCores();
|
||||||
cpu_manager.Shutdown();
|
cpu_manager.Shutdown();
|
||||||
debugger.reset();
|
debugger.reset();
|
||||||
|
services->KillNVNFlinger();
|
||||||
kernel.CloseServices();
|
kernel.CloseServices();
|
||||||
services.reset();
|
services.reset();
|
||||||
service_manager.reset();
|
service_manager.reset();
|
||||||
|
@ -232,8 +232,8 @@ const std::vector<std::shared_ptr<NCA>>& XCI::GetNCAs() const {
|
|||||||
|
|
||||||
std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const {
|
std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const {
|
||||||
const auto program_id = secure_partition->GetProgramTitleID();
|
const auto program_id = secure_partition->GetProgramTitleID();
|
||||||
const auto iter = std::find_if(
|
const auto iter =
|
||||||
ncas.begin(), ncas.end(), [this, type, program_id](const std::shared_ptr<NCA>& nca) {
|
std::find_if(ncas.begin(), ncas.end(), [type, program_id](const std::shared_ptr<NCA>& nca) {
|
||||||
return nca->GetType() == type && nca->GetTitleId() == program_id;
|
return nca->GetType() == type && nca->GetTitleId() == program_id;
|
||||||
});
|
});
|
||||||
return iter == ncas.end() ? nullptr : *iter;
|
return iter == ncas.end() ? nullptr : *iter;
|
||||||
|
@ -127,7 +127,7 @@ void ProgramMetadata::LoadManual(bool is_64_bit, ProgramAddressSpaceType address
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ProgramMetadata::Is64BitProgram() const {
|
bool ProgramMetadata::Is64BitProgram() const {
|
||||||
return npdm_header.has_64_bit_instructions;
|
return npdm_header.has_64_bit_instructions.As<bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const {
|
ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const {
|
||||||
|
@ -1025,6 +1025,7 @@ bool EmulatedController::HasNfc() const {
|
|||||||
case NpadStyleIndex::JoyconRight:
|
case NpadStyleIndex::JoyconRight:
|
||||||
case NpadStyleIndex::JoyconDual:
|
case NpadStyleIndex::JoyconDual:
|
||||||
case NpadStyleIndex::ProController:
|
case NpadStyleIndex::ProController:
|
||||||
|
case NpadStyleIndex::Handheld:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -1135,27 +1136,27 @@ bool EmulatedController::IsControllerSupported(bool use_temporary_value) const {
|
|||||||
const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type;
|
const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case NpadStyleIndex::ProController:
|
case NpadStyleIndex::ProController:
|
||||||
return supported_style_tag.fullkey;
|
return supported_style_tag.fullkey.As<bool>();
|
||||||
case NpadStyleIndex::Handheld:
|
case NpadStyleIndex::Handheld:
|
||||||
return supported_style_tag.handheld;
|
return supported_style_tag.handheld.As<bool>();
|
||||||
case NpadStyleIndex::JoyconDual:
|
case NpadStyleIndex::JoyconDual:
|
||||||
return supported_style_tag.joycon_dual;
|
return supported_style_tag.joycon_dual.As<bool>();
|
||||||
case NpadStyleIndex::JoyconLeft:
|
case NpadStyleIndex::JoyconLeft:
|
||||||
return supported_style_tag.joycon_left;
|
return supported_style_tag.joycon_left.As<bool>();
|
||||||
case NpadStyleIndex::JoyconRight:
|
case NpadStyleIndex::JoyconRight:
|
||||||
return supported_style_tag.joycon_right;
|
return supported_style_tag.joycon_right.As<bool>();
|
||||||
case NpadStyleIndex::GameCube:
|
case NpadStyleIndex::GameCube:
|
||||||
return supported_style_tag.gamecube;
|
return supported_style_tag.gamecube.As<bool>();
|
||||||
case NpadStyleIndex::Pokeball:
|
case NpadStyleIndex::Pokeball:
|
||||||
return supported_style_tag.palma;
|
return supported_style_tag.palma.As<bool>();
|
||||||
case NpadStyleIndex::NES:
|
case NpadStyleIndex::NES:
|
||||||
return supported_style_tag.lark;
|
return supported_style_tag.lark.As<bool>();
|
||||||
case NpadStyleIndex::SNES:
|
case NpadStyleIndex::SNES:
|
||||||
return supported_style_tag.lucia;
|
return supported_style_tag.lucia.As<bool>();
|
||||||
case NpadStyleIndex::N64:
|
case NpadStyleIndex::N64:
|
||||||
return supported_style_tag.lagoon;
|
return supported_style_tag.lagoon.As<bool>();
|
||||||
case NpadStyleIndex::SegaGenesis:
|
case NpadStyleIndex::SegaGenesis:
|
||||||
return supported_style_tag.lager;
|
return supported_style_tag.lager.As<bool>();
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -406,7 +406,7 @@ inline s32 RequestParser::Pop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects.
|
// Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects.
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
#pragma GCC diagnostic ignored "-Wclass-memaccess"
|
||||||
#endif
|
#endif
|
||||||
@ -417,7 +417,7 @@ void RequestParser::PopRaw(T& value) {
|
|||||||
std::memcpy(&value, cmdbuf + index, sizeof(T));
|
std::memcpy(&value, cmdbuf + index, sizeof(T));
|
||||||
index += (sizeof(T) + 3) / 4; // round up to word length
|
index += (sizeof(T) + 3) / 4; // round up to word length
|
||||||
}
|
}
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -49,4 +49,19 @@ bool GlobalSchedulerContext::IsLocked() const {
|
|||||||
return scheduler_lock.IsLockedByCurrentThread();
|
return scheduler_lock.IsLockedByCurrentThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GlobalSchedulerContext::RegisterDummyThreadForWakeup(KThread* thread) {
|
||||||
|
ASSERT(IsLocked());
|
||||||
|
woken_dummy_thread_list.push_back(thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlobalSchedulerContext::WakeupWaitingDummyThreads() {
|
||||||
|
ASSERT(IsLocked());
|
||||||
|
|
||||||
|
for (auto* thread : woken_dummy_thread_list) {
|
||||||
|
thread->IfDummyThreadEndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
woken_dummy_thread_list.clear();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
@ -58,6 +58,9 @@ public:
|
|||||||
/// Returns true if the global scheduler lock is acquired
|
/// Returns true if the global scheduler lock is acquired
|
||||||
bool IsLocked() const;
|
bool IsLocked() const;
|
||||||
|
|
||||||
|
void RegisterDummyThreadForWakeup(KThread* thread);
|
||||||
|
void WakeupWaitingDummyThreads();
|
||||||
|
|
||||||
[[nodiscard]] LockType& SchedulerLock() {
|
[[nodiscard]] LockType& SchedulerLock() {
|
||||||
return scheduler_lock;
|
return scheduler_lock;
|
||||||
}
|
}
|
||||||
@ -76,6 +79,9 @@ private:
|
|||||||
KSchedulerPriorityQueue priority_queue;
|
KSchedulerPriorityQueue priority_queue;
|
||||||
LockType scheduler_lock;
|
LockType scheduler_lock;
|
||||||
|
|
||||||
|
/// Lists dummy threads pending wakeup on lock release
|
||||||
|
std::vector<KThread*> woken_dummy_thread_list;
|
||||||
|
|
||||||
/// Lists all thread ids that aren't deleted/etc.
|
/// Lists all thread ids that aren't deleted/etc.
|
||||||
std::vector<KThread*> thread_list;
|
std::vector<KThread*> thread_list;
|
||||||
std::mutex global_list_guard;
|
std::mutex global_list_guard;
|
||||||
|
@ -314,6 +314,9 @@ u64 KScheduler::UpdateHighestPriorityThreadsImpl(KernelCore& kernel) {
|
|||||||
idle_cores &= ~(1ULL << core_id);
|
idle_cores &= ~(1ULL << core_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HACK: any waiting dummy threads can wake up now.
|
||||||
|
kernel.GlobalSchedulerContext().WakeupWaitingDummyThreads();
|
||||||
|
|
||||||
return cores_needing_scheduling;
|
return cores_needing_scheduling;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -536,6 +539,12 @@ void KScheduler::OnThreadStateChanged(KernelCore& kernel, KThread* thread, Threa
|
|||||||
GetPriorityQueue(kernel).PushBack(thread);
|
GetPriorityQueue(kernel).PushBack(thread);
|
||||||
IncrementScheduledCount(thread);
|
IncrementScheduledCount(thread);
|
||||||
SetSchedulerUpdateNeeded(kernel);
|
SetSchedulerUpdateNeeded(kernel);
|
||||||
|
|
||||||
|
if (thread->IsDummyThread()) {
|
||||||
|
// HACK: if this is a dummy thread, it should wake up when the scheduler
|
||||||
|
// lock is released.
|
||||||
|
kernel.GlobalSchedulerContext().RegisterDummyThreadForWakeup(thread);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,9 @@ Result KThread::Initialize(KThreadFunction func, uintptr_t arg, VAddr user_stack
|
|||||||
physical_affinity_mask.SetAffinity(phys_core, true);
|
physical_affinity_mask.SetAffinity(phys_core, true);
|
||||||
|
|
||||||
// Set the thread state.
|
// Set the thread state.
|
||||||
thread_state = (type == ThreadType::Main) ? ThreadState::Runnable : ThreadState::Initialized;
|
thread_state = (type == ThreadType::Main || type == ThreadType::Dummy)
|
||||||
|
? ThreadState::Runnable
|
||||||
|
: ThreadState::Initialized;
|
||||||
|
|
||||||
// Set TLS address.
|
// Set TLS address.
|
||||||
tls_address = 0;
|
tls_address = 0;
|
||||||
@ -1231,9 +1233,6 @@ void KThread::EndWait(Result wait_result_) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wait_queue->EndWait(this, wait_result_);
|
wait_queue->EndWait(this, wait_result_);
|
||||||
|
|
||||||
// Special case for dummy threads to wakeup if necessary.
|
|
||||||
IfDummyThreadEndWait();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ namespace Kernel {
|
|||||||
|
|
||||||
struct KernelCore::Impl {
|
struct KernelCore::Impl {
|
||||||
explicit Impl(Core::System& system_, KernelCore& kernel_)
|
explicit Impl(Core::System& system_, KernelCore& kernel_)
|
||||||
: time_manager{system_},
|
: time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"},
|
||||||
service_threads_manager{1, "ServiceThreadsManager"}, system{system_} {}
|
service_thread_barrier{2}, system{system_} {}
|
||||||
|
|
||||||
void SetMulticore(bool is_multi) {
|
void SetMulticore(bool is_multi) {
|
||||||
is_multicore = is_multi;
|
is_multicore = is_multi;
|
||||||
@ -737,7 +737,12 @@ struct KernelCore::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClearServiceThreads() {
|
void ClearServiceThreads() {
|
||||||
service_threads_manager.QueueWork([this]() { service_threads.clear(); });
|
service_threads_manager.QueueWork([this] {
|
||||||
|
service_threads.clear();
|
||||||
|
default_service_thread.reset();
|
||||||
|
service_thread_barrier.Sync();
|
||||||
|
});
|
||||||
|
service_thread_barrier.Sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::mutex server_objects_lock;
|
std::mutex server_objects_lock;
|
||||||
@ -802,6 +807,7 @@ struct KernelCore::Impl {
|
|||||||
std::unordered_set<std::shared_ptr<ServiceThread>> service_threads;
|
std::unordered_set<std::shared_ptr<ServiceThread>> service_threads;
|
||||||
std::weak_ptr<ServiceThread> default_service_thread;
|
std::weak_ptr<ServiceThread> default_service_thread;
|
||||||
Common::ThreadWorker service_threads_manager;
|
Common::ThreadWorker service_threads_manager;
|
||||||
|
Common::Barrier service_thread_barrier;
|
||||||
|
|
||||||
std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads;
|
std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads;
|
||||||
std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};
|
std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};
|
||||||
|
@ -751,8 +751,8 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
system.GetReporter().SaveSvcBreakReport(
|
system.GetReporter().SaveSvcBreakReport(
|
||||||
static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger, info1,
|
static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger.As<bool>(),
|
||||||
info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
|
info1, info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
|
||||||
|
|
||||||
if (!break_reason.signal_debugger) {
|
if (!break_reason.signal_debugger) {
|
||||||
LOG_CRITICAL(
|
LOG_CRITICAL(
|
||||||
|
@ -164,7 +164,7 @@ protected:
|
|||||||
u32_le size;
|
u32_le size;
|
||||||
u32_le library_version;
|
u32_le library_version;
|
||||||
u32_le theme_color;
|
u32_le theme_color;
|
||||||
u8 play_startup_sound;
|
bool play_startup_sound;
|
||||||
u64_le system_tick;
|
u64_le system_tick;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
|
static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
|
||||||
|
@ -1502,25 +1502,25 @@ bool Controller_NPad::IsControllerSupported(Core::HID::NpadStyleIndex controller
|
|||||||
Core::HID::NpadStyleTag style = GetSupportedStyleSet();
|
Core::HID::NpadStyleTag style = GetSupportedStyleSet();
|
||||||
switch (controller) {
|
switch (controller) {
|
||||||
case Core::HID::NpadStyleIndex::ProController:
|
case Core::HID::NpadStyleIndex::ProController:
|
||||||
return style.fullkey;
|
return style.fullkey.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::JoyconDual:
|
case Core::HID::NpadStyleIndex::JoyconDual:
|
||||||
return style.joycon_dual;
|
return style.joycon_dual.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::JoyconLeft:
|
case Core::HID::NpadStyleIndex::JoyconLeft:
|
||||||
return style.joycon_left;
|
return style.joycon_left.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::JoyconRight:
|
case Core::HID::NpadStyleIndex::JoyconRight:
|
||||||
return style.joycon_right;
|
return style.joycon_right.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::GameCube:
|
case Core::HID::NpadStyleIndex::GameCube:
|
||||||
return style.gamecube;
|
return style.gamecube.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::Pokeball:
|
case Core::HID::NpadStyleIndex::Pokeball:
|
||||||
return style.palma;
|
return style.palma.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::NES:
|
case Core::HID::NpadStyleIndex::NES:
|
||||||
return style.lark;
|
return style.lark.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::SNES:
|
case Core::HID::NpadStyleIndex::SNES:
|
||||||
return style.lucia;
|
return style.lucia.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::N64:
|
case Core::HID::NpadStyleIndex::N64:
|
||||||
return style.lagoon;
|
return style.lagoon.As<bool>();
|
||||||
case Core::HID::NpadStyleIndex::SegaGenesis:
|
case Core::HID::NpadStyleIndex::SegaGenesis:
|
||||||
return style.lager;
|
return style.lager.As<bool>();
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <mbedtls/hmac_drbg.h>
|
#include <mbedtls/hmac_drbg.h>
|
||||||
|
|
||||||
#include "common/fs/file.h"
|
#include "common/fs/file.h"
|
||||||
|
#include "common/fs/fs.h"
|
||||||
#include "common/fs/path_util.h"
|
#include "common/fs/path_util.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/hle/service/mii/mii_manager.h"
|
#include "core/hle/service/mii/mii_manager.h"
|
||||||
@ -279,7 +280,7 @@ bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info) {
|
|||||||
Common::FS::FileType::BinaryFile};
|
Common::FS::FileType::BinaryFile};
|
||||||
|
|
||||||
if (!keys_file.IsOpen()) {
|
if (!keys_file.IsOpen()) {
|
||||||
LOG_ERROR(Service_NFP, "No keys detected");
|
LOG_ERROR(Service_NFP, "Failed to open key file");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +296,11 @@ bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsKeyAvailable() {
|
||||||
|
const auto yuzu_keys_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::KeysDir);
|
||||||
|
return Common::FS::Exists(yuzu_keys_dir / "key_retail.bin");
|
||||||
|
}
|
||||||
|
|
||||||
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data) {
|
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data) {
|
||||||
InternalKey locked_secret{};
|
InternalKey locked_secret{};
|
||||||
InternalKey unfixed_info{};
|
InternalKey unfixed_info{};
|
||||||
|
@ -91,6 +91,9 @@ void Cipher(const DerivedKeys& keys, const NTAG215File& in_data, NTAG215File& ou
|
|||||||
/// Loads both amiibo keys from key_retail.bin
|
/// Loads both amiibo keys from key_retail.bin
|
||||||
bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info);
|
bool LoadKeys(InternalKey& locked_secret, InternalKey& unfixed_info);
|
||||||
|
|
||||||
|
/// Returns true if key_retail.bin exist
|
||||||
|
bool IsKeyAvailable();
|
||||||
|
|
||||||
/// Decodes encripted amiibo data returns true if output is valid
|
/// Decodes encripted amiibo data returns true if output is valid
|
||||||
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data);
|
bool DecodeAmiibo(const EncryptedNTAG215File& encrypted_tag_data, NTAG215File& tag_data);
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
#include "core/hle/service/mii/mii_manager.h"
|
#include "core/hle/service/mii/mii_manager.h"
|
||||||
|
#include "core/hle/service/mii/types.h"
|
||||||
#include "core/hle/service/nfp/amiibo_crypto.h"
|
#include "core/hle/service/nfp/amiibo_crypto.h"
|
||||||
#include "core/hle/service/nfp/nfp.h"
|
#include "core/hle/service/nfp/nfp.h"
|
||||||
#include "core/hle/service/nfp/nfp_device.h"
|
#include "core/hle/service/nfp/nfp_device.h"
|
||||||
@ -233,6 +234,14 @@ Result NfpDevice::Mount(MountTarget mount_target_) {
|
|||||||
return NotAnAmiibo;
|
return NotAnAmiibo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mark amiibos as read only when keys are missing
|
||||||
|
if (!AmiiboCrypto::IsKeyAvailable()) {
|
||||||
|
LOG_ERROR(Service_NFP, "No keys detected");
|
||||||
|
device_state = DeviceState::TagMounted;
|
||||||
|
mount_target = MountTarget::Rom;
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
if (!AmiiboCrypto::DecodeAmiibo(encrypted_tag_data, tag_data)) {
|
if (!AmiiboCrypto::DecodeAmiibo(encrypted_tag_data, tag_data)) {
|
||||||
LOG_ERROR(Service_NFP, "Can't decode amiibo {}", device_state);
|
LOG_ERROR(Service_NFP, "Can't decode amiibo {}", device_state);
|
||||||
return CorruptedData;
|
return CorruptedData;
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
|
||||||
#include "core/hle/service/nfp/nfp_types.h"
|
#include "core/hle/service/nfp/nfp_types.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
@ -17,11 +17,6 @@ enum class ServiceType : u32 {
|
|||||||
System,
|
System,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class State : u32 {
|
|
||||||
NonInitialized,
|
|
||||||
Initialized,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class DeviceState : u32 {
|
enum class DeviceState : u32 {
|
||||||
Initialized,
|
Initialized,
|
||||||
SearchingForTag,
|
SearchingForTag,
|
||||||
|
@ -6,12 +6,9 @@
|
|||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hid/emulated_controller.h"
|
|
||||||
#include "core/hid/hid_core.h"
|
|
||||||
#include "core/hid/hid_types.h"
|
#include "core/hid/hid_types.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
#include "core/hle/service/mii/mii_manager.h"
|
|
||||||
#include "core/hle/service/nfp/nfp_device.h"
|
#include "core/hle/service/nfp/nfp_device.h"
|
||||||
#include "core/hle/service/nfp/nfp_result.h"
|
#include "core/hle/service/nfp/nfp_result.h"
|
||||||
#include "core/hle/service/nfp/nfp_user.h"
|
#include "core/hle/service/nfp/nfp_user.h"
|
||||||
|
@ -4,8 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
#include "core/hle/service/nfp/nfp.h"
|
#include "core/hle/service/service.h"
|
||||||
#include "core/hle/service/nfp/nfp_types.h"
|
|
||||||
|
|
||||||
namespace Service::NFP {
|
namespace Service::NFP {
|
||||||
class NfpDevice;
|
class NfpDevice;
|
||||||
@ -15,6 +14,11 @@ public:
|
|||||||
explicit IUser(Core::System& system_);
|
explicit IUser(Core::System& system_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum class State : u32 {
|
||||||
|
NonInitialized,
|
||||||
|
Initialized,
|
||||||
|
};
|
||||||
|
|
||||||
void Initialize(Kernel::HLERequestContext& ctx);
|
void Initialize(Kernel::HLERequestContext& ctx);
|
||||||
void Finalize(Kernel::HLERequestContext& ctx);
|
void Finalize(Kernel::HLERequestContext& ctx);
|
||||||
void ListDevices(Kernel::HLERequestContext& ctx);
|
void ListDevices(Kernel::HLERequestContext& ctx);
|
||||||
|
@ -53,7 +53,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger
|
|||||||
}
|
}
|
||||||
|
|
||||||
Module::Module(Core::System& system)
|
Module::Module(Core::System& system)
|
||||||
: service_context{system, "nvdrv"}, events_interface{*this}, container{system.Host1x()} {
|
: container{system.Host1x()}, service_context{system, "nvdrv"}, events_interface{*this} {
|
||||||
builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) {
|
builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) {
|
||||||
std::shared_ptr<Devices::nvdevice> device =
|
std::shared_ptr<Devices::nvdevice> device =
|
||||||
std::make_shared<Devices::nvhost_as_gpu>(system, *this, container);
|
std::make_shared<Devices::nvhost_as_gpu>(system, *this, container);
|
||||||
|
@ -97,6 +97,9 @@ private:
|
|||||||
friend class EventInterface;
|
friend class EventInterface;
|
||||||
friend class Service::NVFlinger::NVFlinger;
|
friend class Service::NVFlinger::NVFlinger;
|
||||||
|
|
||||||
|
/// Manages syncpoints on the host
|
||||||
|
NvCore::Container container;
|
||||||
|
|
||||||
/// Id to use for the next open file descriptor.
|
/// Id to use for the next open file descriptor.
|
||||||
DeviceFD next_fd = 1;
|
DeviceFD next_fd = 1;
|
||||||
|
|
||||||
@ -108,9 +111,6 @@ private:
|
|||||||
|
|
||||||
EventInterface events_interface;
|
EventInterface events_interface;
|
||||||
|
|
||||||
/// Manages syncpoints on the host
|
|
||||||
NvCore::Container container;
|
|
||||||
|
|
||||||
std::unordered_map<std::string, std::function<FilesContainerType::iterator(DeviceFD)>> builders;
|
std::unordered_map<std::string, std::function<FilesContainerType::iterator(DeviceFD)>> builders;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -102,15 +102,19 @@ NVFlinger::~NVFlinger() {
|
|||||||
system.CoreTiming().UnscheduleEvent(single_composition_event, {});
|
system.CoreTiming().UnscheduleEvent(single_composition_event, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShutdownLayers();
|
||||||
|
|
||||||
|
if (nvdrv) {
|
||||||
|
nvdrv->Close(disp_fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NVFlinger::ShutdownLayers() {
|
||||||
for (auto& display : displays) {
|
for (auto& display : displays) {
|
||||||
for (size_t layer = 0; layer < display.GetNumLayers(); ++layer) {
|
for (size_t layer = 0; layer < display.GetNumLayers(); ++layer) {
|
||||||
display.GetLayer(layer).Core().NotifyShutdown();
|
display.GetLayer(layer).Core().NotifyShutdown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nvdrv) {
|
|
||||||
nvdrv->Close(disp_fd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {
|
void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {
|
||||||
|
@ -48,6 +48,8 @@ public:
|
|||||||
explicit NVFlinger(Core::System& system_, HosBinderDriverServer& hos_binder_driver_server_);
|
explicit NVFlinger(Core::System& system_, HosBinderDriverServer& hos_binder_driver_server_);
|
||||||
~NVFlinger();
|
~NVFlinger();
|
||||||
|
|
||||||
|
void ShutdownLayers();
|
||||||
|
|
||||||
/// Sets the NVDrv module instance to use to send buffers to the GPU.
|
/// Sets the NVDrv module instance to use to send buffers to the GPU.
|
||||||
void SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance);
|
void SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance);
|
||||||
|
|
||||||
|
@ -303,4 +303,8 @@ Services::Services(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system
|
|||||||
|
|
||||||
Services::~Services() = default;
|
Services::~Services() = default;
|
||||||
|
|
||||||
|
void Services::KillNVNFlinger() {
|
||||||
|
nv_flinger->ShutdownLayers();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
@ -238,6 +238,8 @@ public:
|
|||||||
explicit Services(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system);
|
explicit Services(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system);
|
||||||
~Services();
|
~Services();
|
||||||
|
|
||||||
|
void KillNVNFlinger();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<NVFlinger::HosBinderDriverServer> hos_binder_driver_server;
|
std::unique_ptr<NVFlinger::HosBinderDriverServer> hos_binder_driver_server;
|
||||||
std::unique_ptr<NVFlinger::NVFlinger> nv_flinger;
|
std::unique_ptr<NVFlinger::NVFlinger> nv_flinger;
|
||||||
|
@ -233,18 +233,17 @@ struct Memory::Impl {
|
|||||||
current_vaddr, src_addr, size);
|
current_vaddr, src_addr, size);
|
||||||
std::memset(dest_buffer, 0, copy_amount);
|
std::memset(dest_buffer, 0, copy_amount);
|
||||||
},
|
},
|
||||||
[&dest_buffer](const std::size_t copy_amount, const u8* const src_ptr) {
|
[&](const std::size_t copy_amount, const u8* const src_ptr) {
|
||||||
std::memcpy(dest_buffer, src_ptr, copy_amount);
|
std::memcpy(dest_buffer, src_ptr, copy_amount);
|
||||||
},
|
},
|
||||||
[&system = system, &dest_buffer](const VAddr current_vaddr,
|
[&](const VAddr current_vaddr, const std::size_t copy_amount,
|
||||||
const std::size_t copy_amount,
|
const u8* const host_ptr) {
|
||||||
const u8* const host_ptr) {
|
|
||||||
if constexpr (!UNSAFE) {
|
if constexpr (!UNSAFE) {
|
||||||
system.GPU().FlushRegion(current_vaddr, copy_amount);
|
system.GPU().FlushRegion(current_vaddr, copy_amount);
|
||||||
}
|
}
|
||||||
std::memcpy(dest_buffer, host_ptr, copy_amount);
|
std::memcpy(dest_buffer, host_ptr, copy_amount);
|
||||||
},
|
},
|
||||||
[&dest_buffer](const std::size_t copy_amount) {
|
[&](const std::size_t copy_amount) {
|
||||||
dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount;
|
dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -267,17 +266,16 @@ struct Memory::Impl {
|
|||||||
"Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
|
"Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
|
||||||
current_vaddr, dest_addr, size);
|
current_vaddr, dest_addr, size);
|
||||||
},
|
},
|
||||||
[&src_buffer](const std::size_t copy_amount, u8* const dest_ptr) {
|
[&](const std::size_t copy_amount, u8* const dest_ptr) {
|
||||||
std::memcpy(dest_ptr, src_buffer, copy_amount);
|
std::memcpy(dest_ptr, src_buffer, copy_amount);
|
||||||
},
|
},
|
||||||
[&system = system, &src_buffer](const VAddr current_vaddr,
|
[&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
|
||||||
const std::size_t copy_amount, u8* const host_ptr) {
|
|
||||||
if constexpr (!UNSAFE) {
|
if constexpr (!UNSAFE) {
|
||||||
system.GPU().InvalidateRegion(current_vaddr, copy_amount);
|
system.GPU().InvalidateRegion(current_vaddr, copy_amount);
|
||||||
}
|
}
|
||||||
std::memcpy(host_ptr, src_buffer, copy_amount);
|
std::memcpy(host_ptr, src_buffer, copy_amount);
|
||||||
},
|
},
|
||||||
[&src_buffer](const std::size_t copy_amount) {
|
[&](const std::size_t copy_amount) {
|
||||||
src_buffer = static_cast<const u8*>(src_buffer) + copy_amount;
|
src_buffer = static_cast<const u8*>(src_buffer) + copy_amount;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -301,8 +299,7 @@ struct Memory::Impl {
|
|||||||
[](const std::size_t copy_amount, u8* const dest_ptr) {
|
[](const std::size_t copy_amount, u8* const dest_ptr) {
|
||||||
std::memset(dest_ptr, 0, copy_amount);
|
std::memset(dest_ptr, 0, copy_amount);
|
||||||
},
|
},
|
||||||
[&system = system](const VAddr current_vaddr, const std::size_t copy_amount,
|
[&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
|
||||||
u8* const host_ptr) {
|
|
||||||
system.GPU().InvalidateRegion(current_vaddr, copy_amount);
|
system.GPU().InvalidateRegion(current_vaddr, copy_amount);
|
||||||
std::memset(host_ptr, 0, copy_amount);
|
std::memset(host_ptr, 0, copy_amount);
|
||||||
},
|
},
|
||||||
@ -313,22 +310,20 @@ struct Memory::Impl {
|
|||||||
const std::size_t size) {
|
const std::size_t size) {
|
||||||
WalkBlock(
|
WalkBlock(
|
||||||
process, dest_addr, size,
|
process, dest_addr, size,
|
||||||
[this, &process, &dest_addr, &src_addr, size](const std::size_t copy_amount,
|
[&](const std::size_t copy_amount, const VAddr current_vaddr) {
|
||||||
const VAddr current_vaddr) {
|
|
||||||
LOG_ERROR(HW_Memory,
|
LOG_ERROR(HW_Memory,
|
||||||
"Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
|
"Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
|
||||||
current_vaddr, src_addr, size);
|
current_vaddr, src_addr, size);
|
||||||
ZeroBlock(process, dest_addr, copy_amount);
|
ZeroBlock(process, dest_addr, copy_amount);
|
||||||
},
|
},
|
||||||
[this, &process, &dest_addr](const std::size_t copy_amount, const u8* const src_ptr) {
|
[&](const std::size_t copy_amount, const u8* const src_ptr) {
|
||||||
WriteBlockImpl<false>(process, dest_addr, src_ptr, copy_amount);
|
WriteBlockImpl<false>(process, dest_addr, src_ptr, copy_amount);
|
||||||
},
|
},
|
||||||
[this, &system = system, &process, &dest_addr](
|
[&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
|
||||||
const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
|
|
||||||
system.GPU().FlushRegion(current_vaddr, copy_amount);
|
system.GPU().FlushRegion(current_vaddr, copy_amount);
|
||||||
WriteBlockImpl<false>(process, dest_addr, host_ptr, copy_amount);
|
WriteBlockImpl<false>(process, dest_addr, host_ptr, copy_amount);
|
||||||
},
|
},
|
||||||
[&dest_addr, &src_addr](const std::size_t copy_amount) {
|
[&](const std::size_t copy_amount) {
|
||||||
dest_addr += static_cast<VAddr>(copy_amount);
|
dest_addr += static_cast<VAddr>(copy_amount);
|
||||||
src_addr += static_cast<VAddr>(copy_amount);
|
src_addr += static_cast<VAddr>(copy_amount);
|
||||||
});
|
});
|
||||||
@ -575,7 +570,7 @@ struct Memory::Impl {
|
|||||||
[vaddr]() {
|
[vaddr]() {
|
||||||
LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, vaddr);
|
LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, vaddr);
|
||||||
},
|
},
|
||||||
[&system = system, vaddr]() { system.GPU().FlushRegion(vaddr, sizeof(T)); });
|
[&]() { system.GPU().FlushRegion(vaddr, sizeof(T)); });
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
std::memcpy(&result, ptr, sizeof(T));
|
std::memcpy(&result, ptr, sizeof(T));
|
||||||
}
|
}
|
||||||
@ -599,7 +594,7 @@ struct Memory::Impl {
|
|||||||
LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8,
|
LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8,
|
||||||
vaddr, static_cast<u64>(data));
|
vaddr, static_cast<u64>(data));
|
||||||
},
|
},
|
||||||
[&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
|
[&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
std::memcpy(ptr, &data, sizeof(T));
|
std::memcpy(ptr, &data, sizeof(T));
|
||||||
}
|
}
|
||||||
@ -613,7 +608,7 @@ struct Memory::Impl {
|
|||||||
LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}",
|
LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}",
|
||||||
sizeof(T) * 8, vaddr, static_cast<u64>(data));
|
sizeof(T) * 8, vaddr, static_cast<u64>(data));
|
||||||
},
|
},
|
||||||
[&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
|
[&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr);
|
const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr);
|
||||||
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
|
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
|
||||||
@ -628,7 +623,7 @@ struct Memory::Impl {
|
|||||||
LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}",
|
LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}",
|
||||||
vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0]));
|
vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0]));
|
||||||
},
|
},
|
||||||
[&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); });
|
[&]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); });
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr);
|
const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr);
|
||||||
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
|
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
|
||||||
|
@ -39,21 +39,14 @@ add_library(input_common STATIC
|
|||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(input_common PRIVATE
|
target_compile_options(input_common PRIVATE
|
||||||
/W4
|
/W4
|
||||||
/WX
|
|
||||||
|
|
||||||
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
||||||
/we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
|
|
||||||
/we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
|
|
||||||
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
||||||
|
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_options(input_common PRIVATE
|
target_compile_options(input_common PRIVATE
|
||||||
-Werror
|
|
||||||
-Werror=conversion
|
-Werror=conversion
|
||||||
-Werror=ignored-qualifiers
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
|
|
||||||
-Werror=unused-variable
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -40,8 +40,8 @@ public:
|
|||||||
void EnableMotion() {
|
void EnableMotion() {
|
||||||
if (sdl_controller) {
|
if (sdl_controller) {
|
||||||
SDL_GameController* controller = sdl_controller.get();
|
SDL_GameController* controller = sdl_controller.get();
|
||||||
has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL);
|
has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE;
|
||||||
has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO);
|
has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE;
|
||||||
if (has_accel) {
|
if (has_accel) {
|
||||||
SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE);
|
SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE);
|
||||||
}
|
}
|
||||||
|
@ -801,8 +801,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateButtonDevice(
|
|||||||
|
|
||||||
const auto button_id = params.Get("button", 0);
|
const auto button_id = params.Get("button", 0);
|
||||||
const auto keyboard_key = params.Get("code", 0);
|
const auto keyboard_key = params.Get("code", 0);
|
||||||
const auto toggle = params.Get("toggle", false);
|
const auto toggle = params.Get("toggle", false) != 0;
|
||||||
const auto inverted = params.Get("inverted", false);
|
const auto inverted = params.Get("inverted", false) != 0;
|
||||||
input_engine->PreSetController(identifier);
|
input_engine->PreSetController(identifier);
|
||||||
input_engine->PreSetButton(identifier, button_id);
|
input_engine->PreSetButton(identifier, button_id);
|
||||||
input_engine->PreSetButton(identifier, keyboard_key);
|
input_engine->PreSetButton(identifier, keyboard_key);
|
||||||
@ -824,8 +824,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateHatButtonDevice(
|
|||||||
|
|
||||||
const auto button_id = params.Get("hat", 0);
|
const auto button_id = params.Get("hat", 0);
|
||||||
const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
|
const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
|
||||||
const auto toggle = params.Get("toggle", false);
|
const auto toggle = params.Get("toggle", false) != 0;
|
||||||
const auto inverted = params.Get("inverted", false);
|
const auto inverted = params.Get("inverted", false) != 0;
|
||||||
|
|
||||||
input_engine->PreSetController(identifier);
|
input_engine->PreSetController(identifier);
|
||||||
input_engine->PreSetHatButton(identifier, button_id);
|
input_engine->PreSetHatButton(identifier, button_id);
|
||||||
@ -883,7 +883,7 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice(
|
|||||||
.threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
|
.threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
|
||||||
.offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
|
.offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
|
||||||
.inverted = params.Get("invert", "+") == "-",
|
.inverted = params.Get("invert", "+") == "-",
|
||||||
.toggle = static_cast<bool>(params.Get("toggle", false)),
|
.toggle = params.Get("toggle", false) != 0,
|
||||||
};
|
};
|
||||||
input_engine->PreSetController(identifier);
|
input_engine->PreSetController(identifier);
|
||||||
input_engine->PreSetAxis(identifier, axis);
|
input_engine->PreSetAxis(identifier, axis);
|
||||||
@ -899,8 +899,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTriggerDevice(
|
|||||||
};
|
};
|
||||||
|
|
||||||
const auto button = params.Get("button", 0);
|
const auto button = params.Get("button", 0);
|
||||||
const auto toggle = params.Get("toggle", false);
|
const auto toggle = params.Get("toggle", false) != 0;
|
||||||
const auto inverted = params.Get("inverted", false);
|
const auto inverted = params.Get("inverted", false) != 0;
|
||||||
|
|
||||||
const auto axis = params.Get("axis", 0);
|
const auto axis = params.Get("axis", 0);
|
||||||
const Common::Input::AnalogProperties properties = {
|
const Common::Input::AnalogProperties properties = {
|
||||||
@ -930,8 +930,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTouchDevice(
|
|||||||
};
|
};
|
||||||
|
|
||||||
const auto button = params.Get("button", 0);
|
const auto button = params.Get("button", 0);
|
||||||
const auto toggle = params.Get("toggle", false);
|
const auto toggle = params.Get("toggle", false) != 0;
|
||||||
const auto inverted = params.Get("inverted", false);
|
const auto inverted = params.Get("inverted", false) != 0;
|
||||||
|
|
||||||
const auto axis_x = params.Get("axis_x", 0);
|
const auto axis_x = params.Get("axis_x", 0);
|
||||||
const Common::Input::AnalogProperties properties_x = {
|
const Common::Input::AnalogProperties properties_x = {
|
||||||
|
@ -241,24 +241,14 @@ target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit)
|
|||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(shader_recompiler PRIVATE
|
target_compile_options(shader_recompiler PRIVATE
|
||||||
/W4
|
/W4
|
||||||
/WX
|
|
||||||
/we4018 # 'expression' : signed/unsigned mismatch
|
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
|
||||||
/we4244 # 'argument' : conversion from 'type1' to 'type2', possible loss of data (floating-point)
|
|
||||||
/we4245 # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
|
|
||||||
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
|
||||||
/we4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
|
|
||||||
/we4305 # 'context' : truncation from 'type1' to 'type2'
|
|
||||||
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
/we4800 # Implicit conversion from 'type' to bool. Possible information loss
|
||||||
/we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior.
|
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_options(shader_recompiler PRIVATE
|
target_compile_options(shader_recompiler PRIVATE
|
||||||
-Werror
|
|
||||||
-Werror=conversion
|
-Werror=conversion
|
||||||
-Werror=ignored-qualifiers
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
|
|
||||||
-Werror=unused-variable
|
|
||||||
|
|
||||||
# Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6.
|
# Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6.
|
||||||
# And this in turns limits the size of a std::array.
|
# And this in turns limits the size of a std::array.
|
||||||
|
@ -5,10 +5,6 @@
|
|||||||
#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
|
#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
|
||||||
#include "shader_recompiler/frontend/ir/value.h"
|
#include "shader_recompiler/frontend/ir/value.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable : 4100)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Shader::Backend::GLASM {
|
namespace Shader::Backend::GLASM {
|
||||||
|
|
||||||
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)
|
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)
|
||||||
|
@ -7,10 +7,6 @@
|
|||||||
#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
|
#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
|
||||||
#include "shader_recompiler/frontend/ir/value.h"
|
#include "shader_recompiler/frontend/ir/value.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable : 4100)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Shader::Backend::GLSL {
|
namespace Shader::Backend::GLSL {
|
||||||
|
|
||||||
void EmitGetRegister(EmitContext& ctx) {
|
void EmitGetRegister(EmitContext& ctx) {
|
||||||
|
@ -279,14 +279,8 @@ if (MSVC)
|
|||||||
else()
|
else()
|
||||||
target_compile_options(video_core PRIVATE
|
target_compile_options(video_core PRIVATE
|
||||||
-Werror=conversion
|
-Werror=conversion
|
||||||
-Wno-error=sign-conversion
|
|
||||||
-Werror=pessimizing-move
|
|
||||||
-Werror=redundant-move
|
|
||||||
-Werror=type-limits
|
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess>
|
-Wno-sign-conversion
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
|
|
||||||
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ inline void MemoryManager::SetBigPageContinous(size_t big_page_index, bool value
|
|||||||
template <MemoryManager::EntryType entry_type>
|
template <MemoryManager::EntryType entry_type>
|
||||||
GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size,
|
GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size,
|
||||||
PTEKind kind) {
|
PTEKind kind) {
|
||||||
u64 remaining_size{size};
|
[[maybe_unused]] u64 remaining_size{size};
|
||||||
if constexpr (entry_type == EntryType::Mapped) {
|
if constexpr (entry_type == EntryType::Mapped) {
|
||||||
page_table.ReserveRange(gpu_addr, size);
|
page_table.ReserveRange(gpu_addr, size);
|
||||||
}
|
}
|
||||||
@ -159,7 +159,7 @@ GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cp
|
|||||||
template <MemoryManager::EntryType entry_type>
|
template <MemoryManager::EntryType entry_type>
|
||||||
GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr,
|
GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr,
|
||||||
size_t size, PTEKind kind) {
|
size_t size, PTEKind kind) {
|
||||||
u64 remaining_size{size};
|
[[maybe_unused]] u64 remaining_size{size};
|
||||||
for (u64 offset{}; offset < size; offset += big_page_size) {
|
for (u64 offset{}; offset < size; offset += big_page_size) {
|
||||||
const GPUVAddr current_gpu_addr = gpu_addr + offset;
|
const GPUVAddr current_gpu_addr = gpu_addr + offset;
|
||||||
[[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr);
|
[[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr);
|
||||||
|
@ -442,7 +442,7 @@ void TextureCache<P>::WriteMemory(VAddr cpu_addr, size_t size) {
|
|||||||
template <class P>
|
template <class P>
|
||||||
void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) {
|
void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) {
|
||||||
std::vector<ImageId> images;
|
std::vector<ImageId> images;
|
||||||
ForEachImageInRegion(cpu_addr, size, [this, &images](ImageId image_id, ImageBase& image) {
|
ForEachImageInRegion(cpu_addr, size, [&images](ImageId image_id, ImageBase& image) {
|
||||||
if (!image.IsSafeDownload()) {
|
if (!image.IsSafeDownload()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1502,9 +1502,9 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) {
|
|||||||
image.flags &= ~ImageFlagBits::BadOverlap;
|
image.flags &= ~ImageFlagBits::BadOverlap;
|
||||||
lru_cache.Free(image.lru_index);
|
lru_cache.Free(image.lru_index);
|
||||||
const auto& clear_page_table =
|
const auto& clear_page_table =
|
||||||
[this, image_id](u64 page,
|
[image_id](u64 page,
|
||||||
std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
|
std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
|
||||||
selected_page_table) {
|
selected_page_table) {
|
||||||
const auto page_it = selected_page_table.find(page);
|
const auto page_it = selected_page_table.find(page);
|
||||||
if (page_it == selected_page_table.end()) {
|
if (page_it == selected_page_table.end()) {
|
||||||
ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS);
|
ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS);
|
||||||
|
@ -1661,8 +1661,8 @@ void Decompress(std::span<const uint8_t> data, uint32_t width, uint32_t height,
|
|||||||
for (u32 z = 0; z < depth; ++z) {
|
for (u32 z = 0; z < depth; ++z) {
|
||||||
const u32 depth_offset = z * height * width * 4;
|
const u32 depth_offset = z * height * width * 4;
|
||||||
for (u32 y_index = 0; y_index < rows; ++y_index) {
|
for (u32 y_index = 0; y_index < rows; ++y_index) {
|
||||||
auto decompress_stride = [data, width, height, depth, block_width, block_height, output,
|
auto decompress_stride = [data, width, height, block_width, block_height, output, rows,
|
||||||
rows, cols, z, depth_offset, y_index] {
|
cols, z, depth_offset, y_index] {
|
||||||
const u32 y = y_index * block_height;
|
const u32 y = y_index * block_height;
|
||||||
for (u32 x_index = 0; x_index < cols; ++x_index) {
|
for (u32 x_index = 0; x_index < cols; ++x_index) {
|
||||||
const u32 block_index = (z * rows * cols) + (y_index * cols) + x_index;
|
const u32 block_index = (z * rows * cols) + (y_index * cols) + x_index;
|
||||||
|
@ -21,7 +21,7 @@ constexpr u32 pdep(u32 value) {
|
|||||||
u32 m = mask;
|
u32 m = mask;
|
||||||
for (u32 bit = 1; m; bit += bit) {
|
for (u32 bit = 1; m; bit += bit) {
|
||||||
if (value & bit)
|
if (value & bit)
|
||||||
result |= m & -m;
|
result |= m & (~m + 1);
|
||||||
m &= m - 1;
|
m &= m - 1;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -268,7 +268,7 @@ bool MultiplayerState::OnCloseRoom() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Save ban list
|
// Save ban list
|
||||||
UISettings::values.multiplayer_ban_list = std::move(room->GetBanList());
|
UISettings::values.multiplayer_ban_list = room->GetBanList();
|
||||||
|
|
||||||
room->Destroy();
|
room->Destroy();
|
||||||
announce_multiplayer_session->Stop();
|
announce_multiplayer_session->Stop();
|
||||||
|
@ -49,7 +49,7 @@ bool CheckEnvVars(bool* is_child) {
|
|||||||
*is_child = true;
|
*is_child = true;
|
||||||
return false;
|
return false;
|
||||||
} else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) {
|
} else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) {
|
||||||
std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n",
|
std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n",
|
||||||
IS_CHILD_ENV_VAR, GetLastError());
|
IS_CHILD_ENV_VAR, GetLastError());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka
|
|||||||
// Set the startup variable for child processes
|
// Set the startup variable for child processes
|
||||||
const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT);
|
const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT);
|
||||||
if (!env_var_set) {
|
if (!env_var_set) {
|
||||||
std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n",
|
std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n",
|
||||||
STARTUP_CHECK_ENV_VAR, GetLastError());
|
STARTUP_CHECK_ENV_VAR, GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -81,22 +81,22 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka
|
|||||||
DWORD exit_code = STILL_ACTIVE;
|
DWORD exit_code = STILL_ACTIVE;
|
||||||
const int err = GetExitCodeProcess(process_info.hProcess, &exit_code);
|
const int err = GetExitCodeProcess(process_info.hProcess, &exit_code);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
std::fprintf(stderr, "GetExitCodeProcess failed with error %d\n", GetLastError());
|
std::fprintf(stderr, "GetExitCodeProcess failed with error %lu\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vulkan is broken if the child crashed (return value is not zero)
|
// Vulkan is broken if the child crashed (return value is not zero)
|
||||||
*has_broken_vulkan = (exit_code != 0);
|
*has_broken_vulkan = (exit_code != 0);
|
||||||
|
|
||||||
if (CloseHandle(process_info.hProcess) == 0) {
|
if (CloseHandle(process_info.hProcess) == 0) {
|
||||||
std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError());
|
std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError());
|
||||||
}
|
}
|
||||||
if (CloseHandle(process_info.hThread) == 0) {
|
if (CloseHandle(process_info.hThread) == 0) {
|
||||||
std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError());
|
std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, nullptr)) {
|
if (!SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, nullptr)) {
|
||||||
std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %d\n",
|
std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %lu\n",
|
||||||
STARTUP_CHECK_ENV_VAR, GetLastError());
|
STARTUP_CHECK_ENV_VAR, GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,8 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) {
|
|||||||
startup_info.cb = sizeof(startup_info);
|
startup_info.cb = sizeof(startup_info);
|
||||||
|
|
||||||
char p_name[255];
|
char p_name[255];
|
||||||
std::strncpy(p_name, arg0, 255);
|
std::strncpy(p_name, arg0, 254);
|
||||||
|
p_name[254] = '\0';
|
||||||
|
|
||||||
const bool process_created = CreateProcessA(nullptr, // lpApplicationName
|
const bool process_created = CreateProcessA(nullptr, // lpApplicationName
|
||||||
p_name, // lpCommandLine
|
p_name, // lpCommandLine
|
||||||
@ -149,7 +150,7 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) {
|
|||||||
pi // lpProcessInformation
|
pi // lpProcessInformation
|
||||||
);
|
);
|
||||||
if (!process_created) {
|
if (!process_created) {
|
||||||
std::fprintf(stderr, "CreateProcessA failed with error %d\n", GetLastError());
|
std::fprintf(stderr, "CreateProcessA failed with error %lu\n", GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user