Files
Xenia-Canary/src/xenia/kernel/xam/xam_nui.cc
The-Little-Wolf fbacd3c12d [Xam/Xam_NUI] - Implement XamShowNuiHardwareRequiredUI
- Implement XamShowNuiHardwareRequiredUI
- Add notes to XamShowNuiTroubleshooterUI
2025-02-07 09:02:45 +01:00

96 lines
3.0 KiB
C++

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/base/logging.h"
#include "xenia/emulator.h"
#include "xenia/kernel/kernel_flags.h"
#include "xenia/kernel/kernel_state.h"
#include "xenia/kernel/util/shim_utils.h"
#include "xenia/kernel/xam/xam_private.h"
#include "xenia/ui/imgui_dialog.h"
#include "xenia/ui/imgui_drawer.h"
#include "xenia/ui/window.h"
#include "xenia/ui/windowed_app_context.h"
#include "xenia/xbox.h"
namespace xe {
namespace kernel {
namespace xam {
extern std::atomic<int> xam_dialogs_shown_;
struct X_NUI_DEVICE_STATUS {
xe::be<uint32_t> unk0;
xe::be<uint32_t> unk1;
xe::be<uint32_t> unk2;
xe::be<uint32_t> status;
xe::be<uint32_t> unk4;
xe::be<uint32_t> unk5;
};
static_assert(sizeof(X_NUI_DEVICE_STATUS) == 24, "Size matters");
void XamNuiGetDeviceStatus_entry(pointer_t<X_NUI_DEVICE_STATUS> status_ptr) {
status_ptr.Zero();
status_ptr->status = 0; // Not connected.
}
DECLARE_XAM_EXPORT1(XamNuiGetDeviceStatus, kNone, kStub);
// UI
dword_result_t XamShowNuiTroubleshooterUI_entry(unknown_t unk1, unknown_t unk2,
dword_t flag) {
/* Notes:
- unk1 is 0xFF - possibly user index?
- unk2 appear to always be zero.
- First calls XamPackageManagerGetExperienceMode and checks if the return
is less than zero
- If less than zero then returns error message below
- else it checks if flag = 0x800000 if it does then call
XamNuiGetDeviceStatus. if not return error
*/
if (cvars::headless) {
return 0;
}
const Emulator* emulator = kernel_state()->emulator();
ui::Window* display_window = emulator->display_window();
ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer();
if (display_window && imgui_drawer) {
xe::threading::Fence fence;
if (display_window->app_context().CallInUIThreadSynchronous([&]() {
xe::ui::ImGuiDialog::ShowMessageBox(
imgui_drawer, "NUI Troubleshooter",
"The game has indicated there is a problem with NUI (Kinect).")
->Then(&fence);
})) {
++xam_dialogs_shown_;
fence.Wait();
--xam_dialogs_shown_;
}
}
return 0;
}
DECLARE_XAM_EXPORT1(XamShowNuiTroubleshooterUI, kNone, kStub);
dword_result_t XamShowNuiHardwareRequiredUI_entry(unknown_t unk1) {
if (unk1 != 0) {
return X_ERROR_INVALID_PARAMETER;
}
return XamShowNuiTroubleshooterUI_entry(0xff, 0, 0x400000);
}
DECLARE_XAM_EXPORT1(XamShowNuiHardwareRequiredUI, kNone, kImplemented);
} // namespace xam
} // namespace kernel
} // namespace xe
DECLARE_XAM_EMPTY_REGISTER_EXPORTS(NUI);