Renderer thread base
- Renderer class - Vulkan and RmlUi moved from main to Renderer thread
This commit is contained in:
parent
32f4597c4d
commit
0062aa85e5
@ -8,8 +8,9 @@ endif()
|
||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
project ("EtrediaEmpires")
|
||||
project (EtrediaEmpires)
|
||||
|
||||
add_subdirectory ("p7lib")
|
||||
add_subdirectory ("ECSAPI")
|
||||
add_subdirectory ("frontend")
|
||||
add_subdirectory(utils)
|
||||
add_subdirectory (p7lib)
|
||||
add_subdirectory (ECSAPI)
|
||||
add_subdirectory (frontend)
|
||||
@ -13,14 +13,15 @@ project (EEfrontend)
|
||||
|
||||
# List sources
|
||||
|
||||
#set(HEADERS "RmlVulkanInterface.hpp")
|
||||
set(SOURCES "main.cpp")
|
||||
set(HEADERS "Renderer.hpp")
|
||||
set(SOURCES "main.cpp" "Renderer.cpp")
|
||||
|
||||
#list(TRANSFORM HEADERS PREPEND "include/")
|
||||
list(TRANSFORM HEADERS PREPEND "include/")
|
||||
list(TRANSFORM SOURCES PREPEND "src/")
|
||||
|
||||
# Find dependencies
|
||||
|
||||
find_package(Boost REQUIRED COMPONENTS lockfree)
|
||||
find_package(SDL2 CONFIG REQUIRED)
|
||||
find_package(Vulkan REQUIRED)
|
||||
find_package(RmlUi CONFIG REQUIRED)
|
||||
@ -29,6 +30,9 @@ find_package(RmlUi CONFIG REQUIRED)
|
||||
|
||||
add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES})
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PUBLIC utils)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE Boost::lockfree)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE p7)
|
||||
target_link_libraries(
|
||||
${PROJECT_NAME}
|
||||
|
||||
31
frontend/include/Renderer.hpp
Normal file
31
frontend/include/Renderer.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_vulkan.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <RmlUi/Core.h>
|
||||
|
||||
class Renderer
|
||||
{
|
||||
private:
|
||||
std::stop_token *stoken;
|
||||
std::jthread renderThread;
|
||||
|
||||
SDL_Window *window;
|
||||
VkInstance vulkan;
|
||||
Rml::Context *uiContext;
|
||||
|
||||
void Threading();
|
||||
void Loop();
|
||||
void Release();
|
||||
|
||||
public:
|
||||
std::atomic<bool> isRunning;
|
||||
|
||||
Renderer(SDL_Window *window);
|
||||
|
||||
void Start();
|
||||
void Stop();
|
||||
};
|
||||
89
frontend/src/Renderer.cpp
Normal file
89
frontend/src/Renderer.cpp
Normal file
@ -0,0 +1,89 @@
|
||||
#include "Renderer.hpp"
|
||||
#include "Logger.h"
|
||||
#include <allocator.hpp>
|
||||
|
||||
Renderer::Renderer(SDL_Window *window) : isRunning(false)
|
||||
{
|
||||
this->window = window;
|
||||
}
|
||||
|
||||
void Renderer::Start()
|
||||
{
|
||||
isRunning = true;
|
||||
renderThread = std::jthread([this](std::stop_token stop) {
|
||||
this->stoken = &stop;
|
||||
Threading();
|
||||
});
|
||||
}
|
||||
|
||||
void Renderer::Threading()
|
||||
{
|
||||
Logger::trace->Register_Thread(L"Renderer", 0);
|
||||
LOG(INFO, "Renderer thread started");
|
||||
|
||||
// Setup Vulkan
|
||||
uint32_t sdlExtensionsCount = 0;
|
||||
if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, nullptr) )
|
||||
LOG(CRITICAL, "Fail to get SDL Vulkan extensions number! %hs", SDL_GetError());
|
||||
|
||||
const char **sdlExtentions = AllocateArray<const char*>(sdlExtensionsCount);
|
||||
|
||||
if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, sdlExtentions) )
|
||||
LOG(CRITICAL, "Fail to load SDL Vulkan extentions! %hs", SDL_GetError());
|
||||
else LOG(INFO, "Load %d SDL Vulkan extenstions", sdlExtensionsCount);
|
||||
|
||||
VkInstanceCreateInfo vkCreateConfig = {
|
||||
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||
.enabledLayerCount = 0,
|
||||
.enabledExtensionCount = sdlExtensionsCount,
|
||||
.ppEnabledExtensionNames = sdlExtentions
|
||||
};
|
||||
|
||||
VkResult vkCreateResult = vkCreateInstance(&vkCreateConfig, nullptr, &vulkan);
|
||||
if (vkCreateResult != VK_SUCCESS)
|
||||
LOG(CRITICAL, "Vulkan is not instantiated! Code: %d", vkCreateResult);
|
||||
else LOG(INFO, "Vulkan is instantiated");
|
||||
|
||||
DeallocateArray(sdlExtentions);
|
||||
|
||||
//Setup RmlUi
|
||||
if (!Rml::Initialise())
|
||||
LOG(CRITICAL, "RmlUi initialization failed!");
|
||||
else LOG(INFO, "RmlUi initialized");
|
||||
|
||||
int32_t screenWidth, screenHeight;
|
||||
SDL_GetWindowSize(window, &screenWidth, &screenHeight);
|
||||
uiContext = Rml::CreateContext("default", Rml::Vector2i(screenWidth, screenHeight));
|
||||
if (!uiContext)
|
||||
LOG(CRITICAL, "RmlUi context creation failed!");
|
||||
else LOG(INFO, "RmlUi context created");
|
||||
|
||||
Loop();
|
||||
|
||||
Release();
|
||||
}
|
||||
|
||||
void Renderer::Loop()
|
||||
{
|
||||
while (!stoken->stop_requested())
|
||||
{
|
||||
/* */
|
||||
LOG(DEBUG, "...");
|
||||
Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::Stop()
|
||||
{
|
||||
renderThread.request_stop();
|
||||
}
|
||||
|
||||
void Renderer::Release()
|
||||
{
|
||||
Rml::Shutdown();
|
||||
vkDestroyInstance(vulkan, nullptr);
|
||||
|
||||
isRunning = false;
|
||||
|
||||
LOG(INFO, "Renderer released");
|
||||
}
|
||||
@ -1,23 +1,24 @@
|
||||
#include "Logger.h"
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include "Renderer.hpp"
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define P7_SINK L"/P7.Sink=Console"
|
||||
#else
|
||||
#define P7_SINK L"/P7.Sink=FileTxt"
|
||||
#endif
|
||||
|
||||
#include "P7_Client.h"
|
||||
#include "P7_Trace.h"
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_vulkan.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <RmlUi/Core.h>
|
||||
IP7_Trace* Logger::trace;
|
||||
|
||||
int SDL_main(int argc, char **argv)
|
||||
{
|
||||
// Setup P7 logger
|
||||
IP7_Client *p7client = P7_Create_Client(P7_SINK);
|
||||
P7_Set_Crash_Handler();
|
||||
IP7_Trace *logger = P7_Create_Trace(p7client, L"TC 1");
|
||||
logger->Register_Thread(L"MainThread", 0);
|
||||
Logger::trace = P7_Create_Trace(p7client, L"TC 1");
|
||||
Logger::trace->Register_Thread(L"Main", 0);
|
||||
|
||||
// Setup SDL
|
||||
bool quit = false;
|
||||
@ -37,45 +38,13 @@ int SDL_main(int argc, char **argv)
|
||||
if (!window)
|
||||
{
|
||||
quit = true;
|
||||
LOG(logger, CRITICAL, "SDL Window fails: %hs", SDL_GetError());
|
||||
LOG(CRITICAL, "SDL Window fails: %hs", SDL_GetError());
|
||||
}
|
||||
else LOG(logger, INFO, "SDL Window created");
|
||||
else LOG(INFO, "SDL Window created");
|
||||
|
||||
// Setup Vulkan
|
||||
VkInstance vulkan;
|
||||
|
||||
uint32_t sdlExtensionsCount = 0;
|
||||
if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, nullptr) )
|
||||
LOG(logger, CRITICAL, "Fail to get SDL Vulkan extensions number! %hs", SDL_GetError());
|
||||
|
||||
const char **sdlExtentions = new const char*[sdlExtensionsCount]();
|
||||
|
||||
if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, sdlExtentions) )
|
||||
LOG(logger, CRITICAL, "Fail to load SDL Vulkan extentions! %hs", SDL_GetError());
|
||||
else LOG(logger, INFO, "Load %d SDL Vulkan extenstions", sdlExtensionsCount);
|
||||
|
||||
VkInstanceCreateInfo vkCreateConfig = {
|
||||
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||
.enabledLayerCount = 0,
|
||||
.enabledExtensionCount = sdlExtensionsCount,
|
||||
.ppEnabledExtensionNames = sdlExtentions
|
||||
};
|
||||
|
||||
VkResult vkCreateResult = vkCreateInstance(&vkCreateConfig, nullptr, &vulkan);
|
||||
if (vkCreateResult != VK_SUCCESS)
|
||||
LOG(logger, CRITICAL, "Vulkan is not instantiated! Code: %d", vkCreateResult);
|
||||
else LOG(logger, INFO, "Vulkan is instantiated");
|
||||
|
||||
delete[] sdlExtentions;
|
||||
|
||||
//Setup RmlUi
|
||||
if (!Rml::Initialise())
|
||||
LOG(logger, CRITICAL, "RmlUi initialization failed!");
|
||||
else LOG(logger, INFO, "RmlUi initialized");
|
||||
|
||||
int32_t screenWidth, screenHeight;
|
||||
SDL_GetWindowSize(window, &screenWidth, &screenHeight);
|
||||
Rml::Context *uiContext = Rml::CreateContext("default", Rml::Vector2i(screenWidth, screenHeight));
|
||||
// Setup Renderer
|
||||
Renderer renderer(window);
|
||||
renderer.Start();
|
||||
|
||||
// Process SDL events
|
||||
while(!quit)
|
||||
@ -96,7 +65,8 @@ int SDL_main(int argc, char **argv)
|
||||
{
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
{
|
||||
uiContext->SetDimensions(Rml::Vector2i(event.window.data1, event.window.data2));
|
||||
//TODO: move to renderer
|
||||
//uiContext->SetDimensions(Rml::Vector2i(event.window.data1, event.window.data2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -108,12 +78,11 @@ int SDL_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
// Free memory
|
||||
LOG(logger, INFO, "Exit...");
|
||||
Rml::Shutdown();
|
||||
vkDestroyInstance(vulkan, nullptr);
|
||||
LOG(INFO, "Exit...");
|
||||
renderer.Stop(); while(renderer.isRunning) {/* */}
|
||||
SDL_Quit();
|
||||
logger->Unregister_Thread(0);
|
||||
logger->Release();
|
||||
Logger::trace->Unregister_Thread(0);
|
||||
Logger::trace->Release();
|
||||
p7client->Release();
|
||||
|
||||
return 0;
|
||||
|
||||
10
p7lib/Headers/Logger.h
Normal file
10
p7lib/Headers/Logger.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include "P7_Trace.h"
|
||||
|
||||
#define LOG(level, format, ...) Logger::trace->P7_DELIVER(0, EP7TRACE_LEVEL_##level, NULL, TM(format), __VA_ARGS__)
|
||||
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
static IP7_Trace *trace;
|
||||
};
|
||||
@ -140,9 +140,6 @@ enum eP7Trace_Level
|
||||
i_hModule,\
|
||||
__VA_ARGS__)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#define LOG(logger, level, format, ...) logger->P7_DELIVER(0, EP7TRACE_LEVEL_##level, NULL, TM(format), __VA_ARGS__)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////IP7_Trace//////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
4
utils/CMakeLists.txt
Normal file
4
utils/CMakeLists.txt
Normal file
@ -0,0 +1,4 @@
|
||||
project(utils)
|
||||
|
||||
add_library(${PROJECT_NAME} INTERFACE)
|
||||
target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
21
utils/include/allocator.hpp
Normal file
21
utils/include/allocator.hpp
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
template<typename T> T* Allocate()
|
||||
{
|
||||
return new T();
|
||||
}
|
||||
|
||||
template<typename T> void Deallocate(T* obj)
|
||||
{
|
||||
delete obj;
|
||||
}
|
||||
|
||||
template<typename T> T* AllocateArray(size_t size)
|
||||
{
|
||||
return new T[size];
|
||||
}
|
||||
|
||||
template<typename T> void DeallocateArray(T* obj)
|
||||
{
|
||||
delete[] obj;
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": [
|
||||
"boost-lockfree",
|
||||
"entt",
|
||||
"vulkan",
|
||||
{"name": "sdl2", "features": ["vulkan"]},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user