CreateRenderer

This commit is contained in:
Attila Uygun 2023-05-26 13:19:53 +02:00
parent 2afe66857a
commit a00110cc94
2 changed files with 62 additions and 81 deletions

View File

@ -37,20 +37,14 @@ Engine* Engine::singleton = nullptr;
Engine::Engine(Platform* platform) Engine::Engine(Platform* platform)
: platform_(platform), : platform_(platform),
#if (USE_VULKAN_RENDERER == 1)
renderer_{std::make_unique<RendererVulkan>()},
#else
renderer_{std::make_unique<RendererOpenGL>()},
#endif
audio_mixer_{std::make_unique<AudioMixer>()}, audio_mixer_{std::make_unique<AudioMixer>()},
quad_{CreateRenderResource<Geometry>()}, quad_{std::make_unique<Geometry>(nullptr)},
pass_through_shader_{CreateRenderResource<Shader>()}, pass_through_shader_{std::make_unique<Shader>(nullptr)},
solid_shader_{CreateRenderResource<Shader>()} { solid_shader_{std::make_unique<Shader>(nullptr)} {
DCHECK(!singleton); DCHECK(!singleton);
singleton = this; singleton = this;
platform_->SetObserver(this); platform_->SetObserver(this);
renderer_->SetContextLostCB(std::bind(&Engine::ContextLost, this));
stats_ = std::make_unique<ImageQuad>(); stats_ = std::make_unique<ImageQuad>();
} }
@ -74,7 +68,7 @@ Engine& Engine::Get() {
} }
void Engine::Run() { void Engine::Run() {
CHECK(Initialize()) << "Failed to initialize the engine."; Initialize();
timer_.Reset(); timer_.Reset();
float accumulator = 0.0; float accumulator = 0.0;
@ -105,10 +99,10 @@ void Engine::Run() {
} }
} }
bool Engine::Initialize() { void Engine::Initialize() {
thread_pool_.Initialize(); thread_pool_.Initialize();
InitializeRenderer(); CreateRenderer(true);
// Normalize viewport. // Normalize viewport.
if (GetScreenWidth() > GetScreenHeight()) { if (GetScreenWidth() > GetScreenHeight()) {
@ -125,29 +119,16 @@ bool Engine::Initialize() {
LOG << "image scale factor: " << GetImageScaleFactor(); LOG << "image scale factor: " << GetImageScaleFactor();
CreateTextureCompressors();
system_font_ = std::make_unique<Font>(); system_font_ = std::make_unique<Font>();
system_font_->Load("engine/RobotoMono-Regular.ttf"); system_font_->Load("engine/RobotoMono-Regular.ttf");
if (!CreateRenderResources())
return false;
SetImageSource("stats_tex", std::bind(&Engine::PrintStats, this)); SetImageSource("stats_tex", std::bind(&Engine::PrintStats, this));
stats_->SetZOrder(std::numeric_limits<int>::max()); stats_->SetZOrder(std::numeric_limits<int>::max());
game_ = GameFactoryBase::CreateGame(""); game_ = GameFactoryBase::CreateGame("");
if (!game_) { CHECK(game_) << "No game found to run.";
LOG << "No game found to run.";
return false;
}
if (!game_->Initialize()) { CHECK(game_->Initialize()) << "Failed to initialize the game.";
LOG << "Failed to initialize the game.";
return false;
}
return true;
} }
void Engine::Update(float delta_time) { void Engine::Update(float delta_time) {
@ -216,26 +197,31 @@ void Engine::RemoveAnimator(Animator* animator) {
} }
} }
void Engine::SwitchRenderer(bool vulkan) { void Engine::CreateRenderer(bool vulkan) {
// Renderer* new_renderer = platform_->SwitchRenderer(vulkan); if ((dynamic_cast<RendererVulkan*>(renderer_.get()) && vulkan) ||
// if (new_renderer == renderer_) (dynamic_cast<RendererOpenGL*>(renderer_.get()) && !vulkan))
// return; return;
// renderer_ = new_renderer; if (vulkan)
// renderer_->SetContextLostCB(std::bind(&Engine::ContextLost, this)); renderer_ = std::make_unique<RendererVulkan>();
// CreateTextureCompressors(); else
renderer_ = std::make_unique<RendererOpenGL>();
renderer_->SetContextLostCB(std::bind(&Engine::ContextLost, this));
// for (auto& t : textures_) bool result = InitializeRenderer();
// t.second.texture->SetRenderer(renderer_); LOG_IF(!result) << "Failed to initialize " << renderer_->GetDebugName()
<< " renderer.";
if (!result && vulkan) {
LOG << "Fallback to OpenGL renderer.";
renderer_ = std::make_unique<RendererOpenGL>();
renderer_->SetContextLostCB(std::bind(&Engine::ContextLost, this));
result = InitializeRenderer();
}
CHECK(result) << "Failed to initialize " << renderer_->GetDebugName()
<< " renderer.";
// for (auto& s : shaders_) CreateTextureCompressors();
// s.second.shader->SetRenderer(renderer_); ContextLost();
// quad_->SetRenderer(renderer_);
// pass_through_shader_->SetRenderer(renderer_);
// solid_shader_->SetRenderer(renderer_);
// ContextLost();
} }
void Engine::Exit() { void Engine::Exit() {
@ -560,15 +546,12 @@ void Engine::AddInputEvent(std::unique_ptr<InputEvent> event) {
input_queue_.push_back(std::move(event)); input_queue_.push_back(std::move(event));
} }
void Engine::InitializeRenderer() { bool Engine::InitializeRenderer() {
bool res;
#if defined(__ANDROID__) #if defined(__ANDROID__)
res = renderer_->Initialize(platform_->GetWindow()); return renderer_->Initialize(platform_->GetWindow());
#elif defined(__linux__) #elif defined(__linux__)
res = renderer_->Initialize(platform_->GetDisplay(), platform_->GetWindow()); return renderer_->Initialize(platform_->GetDisplay(), platform_->GetWindow());
#endif #endif
CHECK(res) << "Failed to initialize " << renderer_->GetDebugName()
<< " renderer.";
} }
void Engine::CreateTextureCompressors() { void Engine::CreateTextureCompressors() {
@ -594,24 +577,10 @@ void Engine::CreateTextureCompressors() {
} }
void Engine::ContextLost() { void Engine::ContextLost() {
CreateRenderResources(); quad_->SetRenderer(renderer_.get());
pass_through_shader_->SetRenderer(renderer_.get());
solid_shader_->SetRenderer(renderer_.get());
for (auto& t : textures_) {
t.second.texture->Destroy();
RefreshImage(t.first);
}
for (auto& s : shaders_) {
auto source = std::make_unique<ShaderSource>();
if (source->Load(s.second.file_name))
s.second.shader->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
}
game_->ContextLost();
}
bool Engine::CreateRenderResources() {
// This creates a normalized unit sized quad. // This creates a normalized unit sized quad.
static const char vertex_description[] = "p2f;t2f"; static const char vertex_description[] = "p2f;t2f";
static const float vertices[] = { static const float vertices[] = {
@ -626,23 +595,37 @@ bool Engine::CreateRenderResources() {
// Create the shader we can reuse for texture rendering. // Create the shader we can reuse for texture rendering.
auto source = std::make_unique<ShaderSource>(); auto source = std::make_unique<ShaderSource>();
if (!source->Load("engine/pass_through.glsl")) { if (source->Load("engine/pass_through.glsl")) {
pass_through_shader_->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
} else {
LOG << "Could not create pass through shader."; LOG << "Could not create pass through shader.";
return false;
} }
pass_through_shader_->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
// Create the shader we can reuse for solid rendering. // Create the shader we can reuse for solid rendering.
source = std::make_unique<ShaderSource>(); source = std::make_unique<ShaderSource>();
if (!source->Load("engine/solid.glsl")) { if (source->Load("engine/solid.glsl")) {
solid_shader_->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
} else {
LOG << "Could not create solid shader."; LOG << "Could not create solid shader.";
return false;
} }
solid_shader_->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
return true; for (auto& t : textures_) {
t.second.texture->SetRenderer(renderer_.get());
RefreshImage(t.first);
}
for (auto& s : shaders_) {
s.second.shader->SetRenderer(renderer_.get());
auto source = std::make_unique<ShaderSource>();
if (source->Load(s.second.file_name))
s.second.shader->Create(std::move(source), quad_->vertex_description(),
quad_->primitive(), false);
}
if (game_)
game_->ContextLost();
} }
void Engine::SetSatsVisible(bool visible) { void Engine::SetSatsVisible(bool visible) {

View File

@ -49,7 +49,7 @@ class Engine : public PlatformObserver {
void AddAnimator(Animator* animator); void AddAnimator(Animator* animator);
void RemoveAnimator(Animator* animator); void RemoveAnimator(Animator* animator);
void SwitchRenderer(bool vulkan); void CreateRenderer(bool vulkan);
void Exit(); void Exit();
@ -218,7 +218,7 @@ class Engine : public PlatformObserver {
base::Timer timer_; base::Timer timer_;
base::Randomf random_; base::Randomf random_;
bool Initialize(); void Initialize();
void Update(float delta_time); void Update(float delta_time);
void Draw(float frame_frac); void Draw(float frame_frac);
@ -231,14 +231,12 @@ class Engine : public PlatformObserver {
void GainedFocus(bool from_interstitial_ad) final; void GainedFocus(bool from_interstitial_ad) final;
void AddInputEvent(std::unique_ptr<InputEvent> event) final; void AddInputEvent(std::unique_ptr<InputEvent> event) final;
void InitializeRenderer(); bool InitializeRenderer();
void CreateTextureCompressors(); void CreateTextureCompressors();
void ContextLost(); void ContextLost();
bool CreateRenderResources();
void SetSatsVisible(bool visible); void SetSatsVisible(bool visible);
std::unique_ptr<Image> PrintStats(); std::unique_ptr<Image> PrintStats();