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_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
project ("EtrediaEmpires")
|
project (EtrediaEmpires)
|
||||||
|
|
||||||
add_subdirectory ("p7lib")
|
add_subdirectory(utils)
|
||||||
add_subdirectory ("ECSAPI")
|
add_subdirectory (p7lib)
|
||||||
add_subdirectory ("frontend")
|
add_subdirectory (ECSAPI)
|
||||||
|
add_subdirectory (frontend)
|
||||||
@ -13,14 +13,15 @@ project (EEfrontend)
|
|||||||
|
|
||||||
# List sources
|
# List sources
|
||||||
|
|
||||||
#set(HEADERS "RmlVulkanInterface.hpp")
|
set(HEADERS "Renderer.hpp")
|
||||||
set(SOURCES "main.cpp")
|
set(SOURCES "main.cpp" "Renderer.cpp")
|
||||||
|
|
||||||
#list(TRANSFORM HEADERS PREPEND "include/")
|
list(TRANSFORM HEADERS PREPEND "include/")
|
||||||
list(TRANSFORM SOURCES PREPEND "src/")
|
list(TRANSFORM SOURCES PREPEND "src/")
|
||||||
|
|
||||||
# Find dependencies
|
# Find dependencies
|
||||||
|
|
||||||
|
find_package(Boost REQUIRED COMPONENTS lockfree)
|
||||||
find_package(SDL2 CONFIG REQUIRED)
|
find_package(SDL2 CONFIG REQUIRED)
|
||||||
find_package(Vulkan REQUIRED)
|
find_package(Vulkan REQUIRED)
|
||||||
find_package(RmlUi CONFIG REQUIRED)
|
find_package(RmlUi CONFIG REQUIRED)
|
||||||
@ -29,6 +30,9 @@ find_package(RmlUi CONFIG REQUIRED)
|
|||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES})
|
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} PRIVATE p7)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
${PROJECT_NAME}
|
${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
|
#ifdef _DEBUG
|
||||||
#define P7_SINK L"/P7.Sink=Console"
|
#define P7_SINK L"/P7.Sink=Console"
|
||||||
#else
|
#else
|
||||||
#define P7_SINK L"/P7.Sink=FileTxt"
|
#define P7_SINK L"/P7.Sink=FileTxt"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "P7_Client.h"
|
IP7_Trace* Logger::trace;
|
||||||
#include "P7_Trace.h"
|
|
||||||
#include <SDL2/SDL.h>
|
|
||||||
#include <SDL2/SDL_vulkan.h>
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
#include <RmlUi/Core.h>
|
|
||||||
|
|
||||||
int SDL_main(int argc, char **argv)
|
int SDL_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
// Setup P7 logger
|
// Setup P7 logger
|
||||||
IP7_Client *p7client = P7_Create_Client(P7_SINK);
|
IP7_Client *p7client = P7_Create_Client(P7_SINK);
|
||||||
P7_Set_Crash_Handler();
|
P7_Set_Crash_Handler();
|
||||||
IP7_Trace *logger = P7_Create_Trace(p7client, L"TC 1");
|
Logger::trace = P7_Create_Trace(p7client, L"TC 1");
|
||||||
logger->Register_Thread(L"MainThread", 0);
|
Logger::trace->Register_Thread(L"Main", 0);
|
||||||
|
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
bool quit = false;
|
bool quit = false;
|
||||||
@ -37,45 +38,13 @@ int SDL_main(int argc, char **argv)
|
|||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
quit = true;
|
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
|
// Setup Renderer
|
||||||
VkInstance vulkan;
|
Renderer renderer(window);
|
||||||
|
renderer.Start();
|
||||||
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));
|
|
||||||
|
|
||||||
// Process SDL events
|
// Process SDL events
|
||||||
while(!quit)
|
while(!quit)
|
||||||
@ -96,7 +65,8 @@ int SDL_main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
case SDL_WINDOWEVENT_RESIZED:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,12 +78,11 @@ int SDL_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Free memory
|
// Free memory
|
||||||
LOG(logger, INFO, "Exit...");
|
LOG(INFO, "Exit...");
|
||||||
Rml::Shutdown();
|
renderer.Stop(); while(renderer.isRunning) {/* */}
|
||||||
vkDestroyInstance(vulkan, nullptr);
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
logger->Unregister_Thread(0);
|
Logger::trace->Unregister_Thread(0);
|
||||||
logger->Release();
|
Logger::trace->Release();
|
||||||
p7client->Release();
|
p7client->Release();
|
||||||
|
|
||||||
return 0;
|
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,\
|
i_hModule,\
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
#define LOG(logger, level, format, ...) logger->P7_DELIVER(0, EP7TRACE_LEVEL_##level, NULL, TM(format), __VA_ARGS__)
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////IP7_Trace//////////////////////////////////////////
|
/////////////////////////////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": [
|
"dependencies": [
|
||||||
|
"boost-lockfree",
|
||||||
"entt",
|
"entt",
|
||||||
"vulkan",
|
"vulkan",
|
||||||
{"name": "sdl2", "features": ["vulkan"]},
|
{"name": "sdl2", "features": ["vulkan"]},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user