2021-03-09 23:51:28 -05:00
|
|
|
/*!
|
|
|
|
* @file gfx.cpp
|
2021-08-09 19:16:39 -04:00
|
|
|
* Graphics component for the runtime. Abstraction layer for the main graphics routines.
|
2021-03-09 23:51:28 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "gfx.h"
|
2021-06-23 22:07:17 -04:00
|
|
|
#include <functional>
|
2021-03-09 23:51:28 -05:00
|
|
|
#include "common/log/log.h"
|
|
|
|
#include "game/runtime.h"
|
|
|
|
#include "display.h"
|
|
|
|
|
2021-08-09 19:16:39 -04:00
|
|
|
#include "pipelines/opengl.h"
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
// initializes a gfx settings.
|
|
|
|
// TODO save and load from file
|
|
|
|
void InitSettings(GfxSettings& settings) {
|
|
|
|
// use opengl by default for now
|
|
|
|
settings.renderer = Gfx::GetRenderer(GfxPipeline::OpenGL); // Gfx::renderers[0];
|
|
|
|
|
|
|
|
// 1 screen update per frame
|
|
|
|
settings.vsync = 1;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
2021-03-09 23:51:28 -05:00
|
|
|
|
|
|
|
namespace Gfx {
|
|
|
|
|
2021-08-09 19:16:39 -04:00
|
|
|
GfxVertex g_vertices_temp[VERTEX_BUFFER_LENGTH_TEMP];
|
|
|
|
|
|
|
|
GfxSettings g_settings;
|
|
|
|
// const std::vector<const GfxRendererModule*> renderers = {&moduleOpenGL};
|
|
|
|
|
|
|
|
const GfxRendererModule* GetRenderer(GfxPipeline pipeline) {
|
|
|
|
switch (pipeline) {
|
|
|
|
case GfxPipeline::Invalid:
|
|
|
|
lg::error("Requested invalid graphics pipeline!");
|
|
|
|
return NULL;
|
|
|
|
break;
|
|
|
|
case GfxPipeline::OpenGL:
|
|
|
|
return &moduleOpenGL;
|
|
|
|
default:
|
|
|
|
lg::error("Unknown graphics pipeline {}", (u64)pipeline);
|
|
|
|
return NULL;
|
|
|
|
}
|
2021-03-09 23:51:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
u32 Init() {
|
2021-08-09 19:16:39 -04:00
|
|
|
lg::info("GFX Init");
|
|
|
|
// initialize settings
|
|
|
|
InitSettings(g_settings);
|
2021-03-09 23:51:28 -05:00
|
|
|
|
2021-08-09 19:16:39 -04:00
|
|
|
if (g_settings.renderer->init()) {
|
|
|
|
lg::error("Gfx::Init error");
|
2021-03-09 23:51:28 -05:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g_main_thread_id != std::this_thread::get_id()) {
|
|
|
|
lg::warn("ran Gfx::Init outside main thread. Init display elsewhere?");
|
|
|
|
} else {
|
2021-08-09 19:16:39 -04:00
|
|
|
Display::InitMainDisplay(640, 480, "testy", g_settings);
|
2021-03-09 23:51:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-06-23 22:07:17 -04:00
|
|
|
void Loop(std::function<bool()> f) {
|
2021-08-09 19:16:39 -04:00
|
|
|
lg::info("GFX Loop");
|
2021-06-23 22:07:17 -04:00
|
|
|
while (f()) {
|
2021-08-09 19:16:39 -04:00
|
|
|
// check if we have a display
|
|
|
|
if (Display::GetMainDisplay()) {
|
2021-06-23 22:07:17 -04:00
|
|
|
// lg::debug("run display");
|
2021-08-09 19:16:39 -04:00
|
|
|
Display::GetMainDisplay()->render_graphics();
|
2021-06-23 22:07:17 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-09 23:51:28 -05:00
|
|
|
u32 Exit() {
|
2021-08-09 19:16:39 -04:00
|
|
|
lg::info("GFX Exit");
|
|
|
|
Display::KillDisplay(Display::GetMainDisplay());
|
|
|
|
g_settings.renderer->exit();
|
2021-03-09 23:51:28 -05:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-08-09 21:42:05 -04:00
|
|
|
u32 vsync() {
|
|
|
|
return g_settings.renderer->vsync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void send_chain(const void* data, u32 offset) {
|
2021-08-09 21:54:40 -04:00
|
|
|
if (g_settings.renderer) {
|
|
|
|
g_settings.renderer->send_chain(data, offset);
|
|
|
|
}
|
2021-08-09 21:42:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void texture_upload_now(const u8* tpage, int mode, u32 s7_ptr) {
|
2021-08-09 21:54:40 -04:00
|
|
|
if (g_settings.renderer) {
|
|
|
|
g_settings.renderer->texture_upload_now(tpage, mode, s7_ptr);
|
|
|
|
}
|
2021-08-09 21:42:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void texture_relocate(u32 destination, u32 source) {
|
2021-08-09 21:54:40 -04:00
|
|
|
if (g_settings.renderer) {
|
|
|
|
g_settings.renderer->texture_relocate(destination, source);
|
|
|
|
}
|
2021-08-09 21:42:05 -04:00
|
|
|
}
|
|
|
|
|
2021-03-09 23:51:28 -05:00
|
|
|
} // namespace Gfx
|