early-access version 4148
This commit is contained in:
parent
d2d37b01f7
commit
70404689ef
18 changed files with 81 additions and 25 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 4146.
|
This is the source code for early-access 4148.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,14 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
InputHandler.updateControllerData()
|
InputHandler.updateControllerData()
|
||||||
val playerOne = NativeConfig.getInputSettings(true)[0]
|
val players = NativeConfig.getInputSettings(true)
|
||||||
if (!playerOne.hasMapping() && InputHandler.androidControllers.isNotEmpty()) {
|
var hasConfiguredControllers = false
|
||||||
|
players.forEach {
|
||||||
|
if (it.hasMapping()) {
|
||||||
|
hasConfiguredControllers = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!hasConfiguredControllers && InputHandler.androidControllers.isNotEmpty()) {
|
||||||
var params: ParamPackage? = null
|
var params: ParamPackage? = null
|
||||||
for (controller in InputHandler.registeredControllers) {
|
for (controller in InputHandler.registeredControllers) {
|
||||||
if (controller.get("port", -1) == 0) {
|
if (controller.get("port", -1) == 0) {
|
||||||
|
|
|
@ -498,7 +498,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
this@MainActivity,
|
this@MainActivity,
|
||||||
titleId = R.string.content_install_notice,
|
titleId = R.string.content_install_notice,
|
||||||
descriptionId = R.string.content_install_notice_description,
|
descriptionId = R.string.content_install_notice_description,
|
||||||
positiveAction = { homeViewModel.setContentToInstall(documents) }
|
positiveAction = { homeViewModel.setContentToInstall(documents) },
|
||||||
|
negativeAction = {}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}.show(supportFragmentManager, ProgressDialogFragment.TAG)
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG)
|
||||||
|
|
|
@ -23,6 +23,22 @@ void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
|
||||||
window_info.render_surface = reinterpret_cast<void*>(surface);
|
window_info.render_surface = reinterpret_cast<void*>(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmuWindow_Android::OnTouchPressed(int id, float x, float y) {
|
||||||
|
const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
|
||||||
|
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchPressed(touch_x,
|
||||||
|
touch_y, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmuWindow_Android::OnTouchMoved(int id, float x, float y) {
|
||||||
|
const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
|
||||||
|
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchMoved(touch_x,
|
||||||
|
touch_y, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmuWindow_Android::OnTouchReleased(int id) {
|
||||||
|
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchReleased(id);
|
||||||
|
}
|
||||||
|
|
||||||
void EmuWindow_Android::OnFrameDisplayed() {
|
void EmuWindow_Android::OnFrameDisplayed() {
|
||||||
if (!m_first_frame) {
|
if (!m_first_frame) {
|
||||||
Common::Android::RunJNIOnFiber<void>(
|
Common::Android::RunJNIOnFiber<void>(
|
||||||
|
|
|
@ -38,6 +38,10 @@ public:
|
||||||
void OnSurfaceChanged(ANativeWindow* surface);
|
void OnSurfaceChanged(ANativeWindow* surface);
|
||||||
void OnFrameDisplayed() override;
|
void OnFrameDisplayed() override;
|
||||||
|
|
||||||
|
void OnTouchPressed(int id, float x, float y);
|
||||||
|
void OnTouchMoved(int id, float x, float y);
|
||||||
|
void OnTouchReleased(int id);
|
||||||
|
|
||||||
std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override {
|
std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override {
|
||||||
return {std::make_unique<GraphicsContext_Android>(m_driver_library)};
|
return {std::make_unique<GraphicsContext_Android>(m_driver_library)};
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,8 +190,7 @@ void Java_org_yuzu_yuzu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* e
|
||||||
jint j_id, jfloat j_x_axis,
|
jint j_id, jfloat j_x_axis,
|
||||||
jfloat j_y_axis) {
|
jfloat j_y_axis) {
|
||||||
if (EmulationSession::GetInstance().IsRunning()) {
|
if (EmulationSession::GetInstance().IsRunning()) {
|
||||||
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchPressed(
|
EmulationSession::GetInstance().Window().OnTouchPressed(j_id, j_x_axis, j_y_axis);
|
||||||
j_id, j_x_axis, j_y_axis);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,15 +198,14 @@ void Java_org_yuzu_yuzu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env
|
||||||
jint j_id, jfloat j_x_axis,
|
jint j_id, jfloat j_x_axis,
|
||||||
jfloat j_y_axis) {
|
jfloat j_y_axis) {
|
||||||
if (EmulationSession::GetInstance().IsRunning()) {
|
if (EmulationSession::GetInstance().IsRunning()) {
|
||||||
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchMoved(
|
EmulationSession::GetInstance().Window().OnTouchMoved(j_id, j_x_axis, j_y_axis);
|
||||||
j_id, j_x_axis, j_y_axis);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj,
|
void Java_org_yuzu_yuzu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj,
|
||||||
jint j_id) {
|
jint j_id) {
|
||||||
if (EmulationSession::GetInstance().IsRunning()) {
|
if (EmulationSession::GetInstance().IsRunning()) {
|
||||||
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchReleased(j_id);
|
EmulationSession::GetInstance().Window().OnTouchReleased(j_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,8 +64,8 @@ struct RawNACP {
|
||||||
u64_le cache_storage_size;
|
u64_le cache_storage_size;
|
||||||
u64_le cache_storage_journal_size;
|
u64_le cache_storage_journal_size;
|
||||||
u64_le cache_storage_data_and_journal_max_size;
|
u64_le cache_storage_data_and_journal_max_size;
|
||||||
u64_le cache_storage_max_index;
|
u16_le cache_storage_max_index;
|
||||||
INSERT_PADDING_BYTES(0xE70);
|
INSERT_PADDING_BYTES(0xE76);
|
||||||
};
|
};
|
||||||
static_assert(sizeof(RawNACP) == 0x4000, "RawNACP has incorrect size.");
|
static_assert(sizeof(RawNACP) == 0x4000, "RawNACP has incorrect size.");
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "core/hle/service/cmif_serialization.h"
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/hle/service/filesystem/save_data_controller.h"
|
#include "core/hle/service/filesystem/save_data_controller.h"
|
||||||
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
#include "core/hle/service/ns/application_manager_interface.h"
|
#include "core/hle/service/ns/application_manager_interface.h"
|
||||||
#include "core/hle/service/ns/service_getter_interface.h"
|
#include "core/hle/service/ns/service_getter_interface.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
@ -41,7 +42,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_
|
||||||
{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
|
{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
|
||||||
{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
|
{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
|
||||||
{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
|
{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
|
||||||
{29, nullptr, "GetCacheStorageMax"},
|
{29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"},
|
||||||
{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
|
{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
|
||||||
{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
|
{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
|
||||||
{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
|
{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
|
||||||
|
@ -270,6 +271,22 @@ Result IApplicationFunctions::GetSaveDataSizeMax(Out<u64> out_max_normal_size,
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result IApplicationFunctions::GetCacheStorageMax(Out<u32> out_cache_storage_index_max,
|
||||||
|
Out<u64> out_max_journal_size) {
|
||||||
|
LOG_DEBUG(Service_AM, "called");
|
||||||
|
|
||||||
|
std::vector<u8> nacp;
|
||||||
|
R_TRY(system.GetARPManager().GetControlProperty(&nacp, m_applet->program_id));
|
||||||
|
|
||||||
|
auto raw_nacp = std::make_unique<FileSys::RawNACP>();
|
||||||
|
std::memcpy(raw_nacp.get(), nacp.data(), std::min(sizeof(*raw_nacp), nacp.size()));
|
||||||
|
|
||||||
|
*out_cache_storage_index_max = static_cast<u32>(raw_nacp->cache_storage_max_index);
|
||||||
|
*out_max_journal_size = static_cast<u64>(raw_nacp->cache_storage_data_and_journal_max_size);
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
Result IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed(s64 unused) {
|
Result IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed(s64 unused) {
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ private:
|
||||||
Result CreateCacheStorage(Out<u32> out_target_media, Out<u64> out_required_size, u16 index,
|
Result CreateCacheStorage(Out<u32> out_target_media, Out<u64> out_required_size, u16 index,
|
||||||
u64 normal_size, u64 journal_size);
|
u64 normal_size, u64 journal_size);
|
||||||
Result GetSaveDataSizeMax(Out<u64> out_max_normal_size, Out<u64> out_max_journal_size);
|
Result GetSaveDataSizeMax(Out<u64> out_max_normal_size, Out<u64> out_max_journal_size);
|
||||||
|
Result GetCacheStorageMax(Out<u32> out_cache_storage_index_max, Out<u64> out_max_journal_size);
|
||||||
Result BeginBlockingHomeButtonShortAndLongPressed(s64 unused);
|
Result BeginBlockingHomeButtonShortAndLongPressed(s64 unused);
|
||||||
Result EndBlockingHomeButtonShortAndLongPressed();
|
Result EndBlockingHomeButtonShortAndLongPressed();
|
||||||
Result BeginBlockingHomeButton(s64 timeout_ns);
|
Result BeginBlockingHomeButton(s64 timeout_ns);
|
||||||
|
|
|
@ -336,7 +336,7 @@ FSP_SRV::FSP_SRV(Core::System& system_)
|
||||||
{1012, nullptr, "GetFsStackUsage"},
|
{1012, nullptr, "GetFsStackUsage"},
|
||||||
{1013, nullptr, "UnsetSaveDataRootPath"},
|
{1013, nullptr, "UnsetSaveDataRootPath"},
|
||||||
{1014, nullptr, "OutputMultiProgramTagAccessLog"},
|
{1014, nullptr, "OutputMultiProgramTagAccessLog"},
|
||||||
{1016, nullptr, "FlushAccessLogOnSdCard"},
|
{1016, &FSP_SRV::FlushAccessLogOnSdCard, "FlushAccessLogOnSdCard"},
|
||||||
{1017, nullptr, "OutputApplicationInfoAccessLog"},
|
{1017, nullptr, "OutputApplicationInfoAccessLog"},
|
||||||
{1018, nullptr, "SetDebugOption"},
|
{1018, nullptr, "SetDebugOption"},
|
||||||
{1019, nullptr, "UnsetDebugOption"},
|
{1019, nullptr, "UnsetDebugOption"},
|
||||||
|
@ -706,6 +706,13 @@ void FSP_SRV::GetProgramIndexForAccessLog(HLERequestContext& ctx) {
|
||||||
rb.Push(access_log_program_index);
|
rb.Push(access_log_program_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FSP_SRV::FlushAccessLogOnSdCard(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_FS, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
void FSP_SRV::GetCacheStorageSize(HLERequestContext& ctx) {
|
void FSP_SRV::GetCacheStorageSize(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto index{rp.Pop<s32>()};
|
const auto index{rp.Pop<s32>()};
|
||||||
|
|
|
@ -58,6 +58,7 @@ private:
|
||||||
void SetGlobalAccessLogMode(HLERequestContext& ctx);
|
void SetGlobalAccessLogMode(HLERequestContext& ctx);
|
||||||
void GetGlobalAccessLogMode(HLERequestContext& ctx);
|
void GetGlobalAccessLogMode(HLERequestContext& ctx);
|
||||||
void OutputAccessLogToSdCard(HLERequestContext& ctx);
|
void OutputAccessLogToSdCard(HLERequestContext& ctx);
|
||||||
|
void FlushAccessLogOnSdCard(HLERequestContext& ctx);
|
||||||
void GetProgramIndexForAccessLog(HLERequestContext& ctx);
|
void GetProgramIndexForAccessLog(HLERequestContext& ctx);
|
||||||
void OpenMultiCommitManager(HLERequestContext& ctx);
|
void OpenMultiCommitManager(HLERequestContext& ctx);
|
||||||
void GetCacheStorageSize(HLERequestContext& ctx);
|
void GetCacheStorageSize(HLERequestContext& ctx);
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "core/hle/service/ns/develop_interface.h"
|
#include "core/hle/service/ns/develop_interface.h"
|
||||||
|
|
||||||
namespace Service::NS {
|
namespace Service::NS {
|
||||||
|
|
|
@ -44,6 +44,10 @@ struct Display {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasLayers() {
|
||||||
|
return !stack.layers.empty();
|
||||||
|
}
|
||||||
|
|
||||||
u64 id;
|
u64 id;
|
||||||
LayerStack stack;
|
LayerStack stack;
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,16 +33,17 @@ void SurfaceFlinger::RemoveDisplay(u64 display_id) {
|
||||||
std::erase_if(m_displays, [&](auto& display) { return display.id == display_id; });
|
std::erase_if(m_displays, [&](auto& display) { return display.id == display_id; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
|
bool SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
|
||||||
u64 display_id) {
|
u64 display_id) {
|
||||||
auto* const display = this->FindDisplay(display_id);
|
auto* const display = this->FindDisplay(display_id);
|
||||||
if (!display) {
|
if (!display || !display->HasLayers()) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*out_swap_interval =
|
*out_swap_interval =
|
||||||
m_composer.ComposeLocked(out_compose_speed_scale, *display,
|
m_composer.ComposeLocked(out_compose_speed_scale, *display,
|
||||||
*nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd));
|
*nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceFlinger::AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id) {
|
void SurfaceFlinger::AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ public:
|
||||||
|
|
||||||
void AddDisplay(u64 display_id);
|
void AddDisplay(u64 display_id);
|
||||||
void RemoveDisplay(u64 display_id);
|
void RemoveDisplay(u64 display_id);
|
||||||
void ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
|
bool ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
|
||||||
|
|
||||||
void AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id);
|
void AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id);
|
||||||
void RemoveLayerFromDisplayStack(u64 display_id, s32 consumer_binder_id);
|
void RemoveLayerFromDisplayStack(u64 display_id, s32 consumer_binder_id);
|
||||||
|
|
|
@ -218,10 +218,11 @@ void Container::DestroyBufferQueueLocked(Layer* layer) {
|
||||||
layer->GetProducerBinderId());
|
layer->GetProducerBinderId());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
|
bool Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
|
||||||
u64 display_id) {
|
u64 display_id) {
|
||||||
std::scoped_lock lk{m_lock};
|
std::scoped_lock lk{m_lock};
|
||||||
m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale, display_id);
|
return m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale,
|
||||||
|
display_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::VI
|
} // namespace Service::VI
|
||||||
|
|
|
@ -76,7 +76,7 @@ private:
|
||||||
void DestroyBufferQueueLocked(Layer* layer);
|
void DestroyBufferQueueLocked(Layer* layer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
|
bool ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::mutex m_lock{};
|
std::mutex m_lock{};
|
||||||
|
|
|
@ -128,10 +128,11 @@ private:
|
||||||
const std::string razer_vid{"1532"};
|
const std::string razer_vid{"1532"};
|
||||||
const std::string redmagic_vid{"3537"};
|
const std::string redmagic_vid{"3537"};
|
||||||
const std::string backbone_labs_vid{"358a"};
|
const std::string backbone_labs_vid{"358a"};
|
||||||
const std::vector<std::string> flipped_ab_vids{sony_vid, nintendo_vid, razer_vid, redmagic_vid,
|
const std::string xbox_vid{"045e"};
|
||||||
backbone_labs_vid};
|
const std::vector<std::string> flipped_ab_vids{sony_vid, nintendo_vid, razer_vid,
|
||||||
|
redmagic_vid, backbone_labs_vid, xbox_vid};
|
||||||
const std::vector<std::string> flipped_xy_vids{sony_vid, razer_vid, redmagic_vid,
|
const std::vector<std::string> flipped_xy_vids{sony_vid, razer_vid, redmagic_vid,
|
||||||
backbone_labs_vid};
|
backbone_labs_vid, xbox_vid};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace InputCommon
|
} // namespace InputCommon
|
||||||
|
|
Loading…
Reference in a new issue