mirror of
https://github.com/AxioDL/boo.git
synced 2025-05-16 20:31:29 +00:00
Now that we have the fencing and atomic operations in place to ensure access to data on other threads will always occur before the use of delete, we can remove the destructor lock. This will be useful for making ObjToken's move assignment operator noexcept.
106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
#include "nxstl/thread"
|
|
#include "nxstl/condition_variable"
|
|
#include "nxstl/mutex"
|
|
|
|
#include "boo/IApplication.hpp"
|
|
#include "boo/graphicsdev/NX.hpp"
|
|
|
|
#include <climits>
|
|
|
|
#include <logvisor/logvisor.hpp>
|
|
|
|
#include <switch.h>
|
|
|
|
namespace boo {
|
|
static logvisor::Module Log("boo::NXApplication");
|
|
|
|
std::shared_ptr<IWindow> _WindowNXNew(std::string_view title, NXContext* nxCtx);
|
|
|
|
class ApplicationNX : public IApplication {
|
|
IApplicationCallback& m_callback;
|
|
const std::string m_uniqueName;
|
|
const std::string m_friendlyName;
|
|
const std::string m_pname;
|
|
const std::vector<std::string> m_args;
|
|
|
|
NXContext m_nxCtx;
|
|
|
|
void _deletedWindow(IWindow* window) override {}
|
|
|
|
public:
|
|
ApplicationNX(IApplicationCallback& callback, std::string_view uniqueName, std::string_view friendlyName,
|
|
std::string_view pname, const std::vector<std::string>& args, std::string_view gfxApi, uint32_t samples,
|
|
uint32_t anisotropy, bool deepColor, bool singleInstance)
|
|
: m_callback(callback), m_uniqueName(uniqueName), m_friendlyName(friendlyName), m_pname(pname), m_args(args) {}
|
|
|
|
EPlatformType getPlatformType() const override { return EPlatformType::NX; }
|
|
|
|
int run() override {
|
|
/* Spawn client thread */
|
|
int clientReturn = INT_MIN;
|
|
std::mutex initmt;
|
|
std::condition_variable initcv;
|
|
std::unique_lock<std::mutex> outerLk(initmt);
|
|
std::thread clientThread([&]() {
|
|
std::unique_lock<std::mutex> innerLk(initmt);
|
|
innerLk.unlock();
|
|
initcv.notify_one();
|
|
std::string thrName = std::string(getFriendlyName()) + " Client";
|
|
logvisor::RegisterThreadName(thrName.c_str());
|
|
clientReturn = m_callback.appMain(this);
|
|
});
|
|
initcv.wait(outerLk);
|
|
|
|
// Main graphics loop
|
|
while (clientReturn == INT_MIN && appletMainLoop()) {
|
|
// Get and process input
|
|
hidScanInput();
|
|
u32 kDown = hidKeysDown(CONTROLLER_P1_AUTO);
|
|
if (kDown & KEY_PLUS)
|
|
break;
|
|
}
|
|
|
|
m_callback.appQuitting(this);
|
|
if (clientThread.joinable())
|
|
clientThread.join();
|
|
|
|
return 0;
|
|
}
|
|
|
|
std::string_view getUniqueName() const override { return m_uniqueName; }
|
|
|
|
std::string_view getFriendlyName() const override { return m_friendlyName; }
|
|
|
|
std::string_view getProcessName() const override { return m_pname; }
|
|
|
|
const std::vector<std::string>& getArgs() const override { return m_args; }
|
|
|
|
std::shared_ptr<IWindow> m_window;
|
|
std::shared_ptr<IWindow> newWindow(std::string_view title) override {
|
|
if (m_window)
|
|
Log.report(logvisor::Fatal, fmt("Only 1 window allowed on NX"));
|
|
m_window = _WindowNXNew(title, &m_nxCtx);
|
|
return m_window;
|
|
}
|
|
};
|
|
|
|
IApplication* APP = nullptr;
|
|
int ApplicationRun(IApplication::EPlatformType platform, IApplicationCallback& cb, SystemStringView uniqueName,
|
|
SystemStringView friendlyName, SystemStringView pname, const std::vector<SystemString>& args,
|
|
std::string_view gfxApi, uint32_t samples, uint32_t anisotropy, bool deepColor,
|
|
bool singleInstance) {
|
|
std::string thrName = std::string(friendlyName) + " Main Thread";
|
|
logvisor::RegisterThreadName(thrName.c_str());
|
|
|
|
if (APP)
|
|
return 1;
|
|
APP = new ApplicationNX(cb, uniqueName, friendlyName, pname, args, gfxApi, samples, anisotropy, deepColor,
|
|
singleInstance);
|
|
int ret = APP->run();
|
|
delete APP;
|
|
APP = nullptr;
|
|
return ret;
|
|
}
|
|
|
|
} // namespace boo
|