Files
WickedEngine/WickedEngine/wiInitializer.cpp
T

172 lines
5.9 KiB
C++

#include "wiInitializer.h"
#include "WickedEngine.h"
#include <thread>
#include <atomic>
#if defined(PLATFORM_WINDOWS_DESKTOP) || defined(PLATFORM_LINUX)
#include "Utility/cpuinfo.hpp"
#endif // defined(PLATFORM_WINDOWS_DESKTOP) || defined(PLATFORM_LINUX)
namespace wi::initializer
{
static std::atomic_bool initializationStarted{ false };
static wi::jobsystem::context ctx;
static wi::Timer timer;
static std::atomic_bool systems[INITIALIZED_SYSTEM_COUNT]{};
void InitializeComponentsImmediate()
{
if (IsInitializeFinished())
return;
if (!initializationStarted.load())
{
InitializeComponentsAsync();
}
WaitForInitializationsToFinish();
}
void InitializeComponentsAsync()
{
if (IsInitializeFinished())
return;
timer.record();
initializationStarted.store(true);
#if defined(PLATFORM_WINDOWS_DESKTOP)
static constexpr const char* platform_string = "Windows";
#elif defined(PLATFORM_LINUX)
static constexpr const char* platform_string = "Linux";
#elif defined(PLATFORM_PS5)
static constexpr const char* platform_string = "PS5";
#elif defined(PLATFORM_XBOX)
static constexpr const char* platform_string = "Xbox";
#endif // PLATFORM
wilog("\n[wi::initializer] Initializing Wicked Engine, please wait...\nVersion: %s\nPlatform: %s", wi::version::GetVersionString(), platform_string);
StackString<1024> cpustring;
#if defined(PLATFORM_WINDOWS_DESKTOP) || defined(PLATFORM_LINUX)
CPUInfo cpuinfo;
cpustring.push_back("\nCPU: ");
cpustring.push_back(cpuinfo.model().c_str());
cpustring.push_back("\n\tFeatures available: ");
if (cpuinfo.haveSSE())
{
cpustring.push_back("SSE; ");
}
if (cpuinfo.haveSSE2())
{
cpustring.push_back("SSE 2; ");
}
if (cpuinfo.haveSSE3())
{
cpustring.push_back("SSE 3; ");
}
if (cpuinfo.haveSSE41())
{
cpustring.push_back("SSE 4.1; ");
}
if (cpuinfo.haveSSE42())
{
cpustring.push_back("SSE 4.2; ");
}
if (cpuinfo.haveAVX())
{
cpustring.push_back("AVX; ");
}
if (cpuinfo.haveAVX2())
{
cpustring.push_back("AVX 2; ");
}
if (cpuinfo.haveAVX512F())
{
cpustring.push_back("AVX 512; ");
}
#endif // defined(PLATFORM_WINDOWS_DESKTOP) || defined(PLATFORM_LINUX)
cpustring.push_back("\n\tFeatures used: ");
#ifdef _XM_SSE_INTRINSICS_
cpustring.push_back("SSE; ");
cpustring.push_back("SSE 2; ");
#endif // _XM_SSE_INTRINSICS_
#ifdef _XM_SSE3_INTRINSICS_
cpustring.push_back("SSE 3; ");
#endif // _XM_SSE3_INTRINSICS_
#ifdef _XM_SSE4_INTRINSICS_
cpustring.push_back("SSE 4.1; ");
#endif // _XM_SSE4_INTRINSICS_
#ifdef _XM_AVX_INTRINSICS_
cpustring.push_back("AVX; ");
#endif // _XM_AVX_INTRINSICS_
#ifdef _XM_AVX2_INTRINSICS_
cpustring.push_back("AVX 2; ");
#endif // _XM_AVX2_INTRINSICS_
#ifdef _XM_ARM_NEON_INTRINSICS_
cpustring.push_back("NEON; ");
#endif // _XM_ARM_NEON_INTRINSICS_
wi::backlog::post(cpustring.c_str());
if (!XMVerifyCPUSupport())
{
wilog_messagebox("XMVerifyCPUSupport() failed! This means that your CPU doesn't support a required feature! %s", cpustring.c_str());
}
wilog("\nRAM: %s", wi::helper::GetMemorySizeText(wi::helper::GetMemoryUsage().total_physical).c_str());
size_t shaderdump_count = wi::renderer::GetShaderDumpCount();
if (shaderdump_count > 0)
{
wilog("\nEmbedded shaders found: %d", (int)shaderdump_count);
}
else
{
wilog("\nNo embedded shaders found, shaders will be compiled at runtime if needed.\n\tShader source path: %s\n\tShader binary path: %s", wi::renderer::GetShaderSourcePath().c_str(), wi::renderer::GetShaderPath().c_str());
}
wi::backlog::post("");
wi::jobsystem::Initialize();
wi::backlog::post("");
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::image::Initialize(); systems[INITIALIZED_SYSTEM_IMAGE].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::input::Initialize(); systems[INITIALIZED_SYSTEM_INPUT].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::renderer::Initialize(); systems[INITIALIZED_SYSTEM_RENDERER].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::texturehelper::Initialize(); systems[INITIALIZED_SYSTEM_TEXTUREHELPER].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::HairParticleSystem::Initialize(); systems[INITIALIZED_SYSTEM_HAIRPARTICLESYSTEM].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::EmittedParticleSystem::Initialize(); systems[INITIALIZED_SYSTEM_EMITTEDPARTICLESYSTEM].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::Ocean::Initialize(); systems[INITIALIZED_SYSTEM_OCEAN].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::gpusortlib::Initialize(); systems[INITIALIZED_SYSTEM_GPUSORTLIB].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::GPUBVH::Initialize(); systems[INITIALIZED_SYSTEM_GPUBVH].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::physics::Initialize(); systems[INITIALIZED_SYSTEM_PHYSICS].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::TrailRenderer::Initialize(); systems[INITIALIZED_SYSTEM_TRAILRENDERER].store(true); });
// Initialize these immediately:
wi::lua::Initialize(); systems[INITIALIZED_SYSTEM_LUA].store(true);
wi::audio::Initialize(); systems[INITIALIZED_SYSTEM_AUDIO].store(true);
wi::font::Initialize(); systems[INITIALIZED_SYSTEM_FONT].store(true);
std::thread([] {
wi::jobsystem::Wait(ctx);
wilog("\n[wi::initializer] Wicked Engine Initialized (%d ms)", (int)std::round(timer.elapsed()));
}).detach();
}
bool IsInitializeFinished(INITIALIZED_SYSTEM system)
{
if (system == INITIALIZED_SYSTEM_COUNT)
{
return initializationStarted.load() && !wi::jobsystem::IsBusy(ctx);
}
else
{
return systems[system].load();
}
}
void WaitForInitializationsToFinish()
{
wi::jobsystem::Wait(ctx);
}
}