Unravel Engine C++ Reference
Loading...
Searching...
No Matches
renderer.cpp
Go to the documentation of this file.
1#include "renderer.h"
2#include "../events.h"
3#include "spdlog/common.h"
4#include "gpu_program.h"
5
6#include <base/assert.hpp>
8#include <graphics/graphics.h>
10
11#include <logging/logging.h>
12
13namespace unravel
14{
16{
18 [](const std::string& msg, const char* file_path, uint16_t line)
19 {
20 APPLOG_TRACE_LOC(file_path, line, "renderer", msg);
21 });
23 [](const std::string& msg, const char* file_path, uint16_t line)
24 {
25 APPLOG_INFO_LOC(file_path, line, "renderer", msg);
26 });
28 [](const std::string& msg, const char* file_path, uint16_t line)
29 {
30 APPLOG_WARNING_LOC(file_path, line, "renderer", msg);
31 });
33 [](const std::string& msg, const char* file_path, uint16_t line)
34 {
35 APPLOG_ERROR_LOC(file_path, line, "renderer", msg);
36 });
37
38 auto& ev = ctx.get_cached<events>();
40 ev.on_frame_begin.connect(sentinel_, this, &renderer::frame_begin);
41 ev.on_frame_end.connect(sentinel_, this, &renderer::frame_end);
42
43 parser.set_optional<std::string>("r", "renderer", "auto", "Select preferred renderer.");
44 parser.set_optional<bool>("n", "novsync", false, "Disable vsync.");
45}
46
47auto renderer::init(rtti::context& ctx, const cmd_line::parser& parser) -> bool
48{
49 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
50
51 if(!os::init())
52 {
53 return false;
54 }
55
56 if(!init_backend(parser))
57 {
58 return false;
59 }
60
61 return true;
62}
63
64auto renderer::create_window_for_display(int index, const std::string& title, uint32_t flags)
65 -> const std::unique_ptr<render_window>&
66{
67 auto mode = os::display::get_desktop_mode(index);
68 auto bounds = os::display::get_usable_bounds(index);
69
70 if(flags & os::window::resizable)
71 {
72 uint32_t window_header = 38 / mode.display_scale;
73 bounds.y += window_header;
74 bounds.h -= window_header;
75 }
76
77 os::window window(title, bounds.x, bounds.y, bounds.w * mode.display_scale, bounds.h * mode.display_scale, flags);
78 set_main_window(std::move(window));
79 return render_window_;
80}
81
82void renderer::set_main_window(os::window&& window)
83{
84 render_window_ = std::make_unique<render_window>(std::move(window));
85}
86
88{
89 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
90 return true;
91}
92
93auto renderer::init_backend(const cmd_line::parser& parser) -> bool
94{
95 init_window_.reset();
96 init_window_ =
97 std::make_unique<os::window>("INIT", os::window::centered, os::window::centered, 64, 64, os::window::hidden);
98 const auto sz = init_window_->get_size();
99
100 gfx::init_type init_data;
101 init_data.type = get_renderer_type(parser);
102 init_data.resolution.width = sz.w;
103 init_data.resolution.height = sz.h;
104 init_data.resolution.reset = get_reset_flags(parser);
105 init_data.platformData.ndt = init_window_->get_native_display();
106 init_data.platformData.nwh = init_window_->get_native_handle();
107 reset_flags_ = init_data.resolution.reset;
108 if(!gfx::init(init_data))
109 {
110 APPLOG_ERROR("Could not initialize rendering backend!");
111 return false;
112 }
113 APPLOG_TRACE("Using {0} rendering backend.", gfx::get_renderer_name(gfx::get_renderer_type()));
114
115 APPLOG_TRACE("DebugDraw Init.");
116 ddInit();
117
118 const bgfx::Caps* caps = bgfx::getCaps();
119 if (0 != (caps->supported & BGFX_CAPS_GRAPHICS_DEBUGGER) )
120 {
121 APPLOG_TRACE("Graphics debugger is supported.");
122 }
123 else
124 {
125 APPLOG_TRACE("Graphics debugger is not supported.");
126 }
127
128 return true;
129}
130
131void renderer::on_os_event(rtti::context& ctx, os::event& e)
132{
133 if(e.type == os::events::window)
134 {
135 if(e.window.type == os::window_event_id::close)
136 {
137 auto window_id = e.window.window_id;
139 {
140 if(render_window_->get_window().get_id() == window_id)
141 {
143 }
144 }
145 }
146
147 if(e.window.type == os::window_event_id::resized)
148 {
149 auto window_id = e.window.window_id;
150
152 {
153 if(render_window_->get_window().get_id() == window_id)
154 {
155 render_window_->prepare_surface();
156 }
157 }
158 }
159 }
160}
161
163{
164 // auto detect
165 auto preferred_renderer_type = gfx::renderer_type::Count;
166
167 std::string preferred_renderer;
168 if(parser.try_get("renderer", preferred_renderer))
169 {
170 if(preferred_renderer == "opengl")
171 {
172 preferred_renderer_type = gfx::renderer_type::OpenGL;
173 }
174 else if(preferred_renderer == "vulkan")
175 {
176 preferred_renderer_type = gfx::renderer_type::Vulkan;
177 }
178 else if(preferred_renderer == "directx11")
179 {
180 preferred_renderer_type = gfx::renderer_type::Direct3D11;
181 }
182 else if(preferred_renderer == "directx12")
183 {
184 preferred_renderer_type = gfx::renderer_type::Direct3D12;
185 }
186 }
187
188 return preferred_renderer_type;
189}
190
191auto renderer::get_reset_flags(const cmd_line::parser& parser) const -> uint32_t
192{
193 bool novsync = false;
194 parser.try_get("novsync", novsync);
195 return get_reset_flags(!novsync);
196}
197
198auto renderer::get_reset_flags(bool vsync) const -> uint32_t
199{
200 uint32_t flags = BGFX_RESET_MAXANISOTROPY | BGFX_RESET_HIDPI;
201
202 if(vsync)
203 {
204 flags |= BGFX_RESET_VSYNC;
205 }
206 else
207 {
208 flags |= BGFX_RESET_NONE;
209 }
210
211 return flags;
212}
213
215{
216 render_window_.reset();
217
218 gfx::set_trace_logger(nullptr);
219 gfx::set_info_logger(nullptr);
221 gfx::set_error_logger(nullptr);
222
223 ddShutdown();
225
226 init_window_.reset();
227 os::shutdown();
228}
229
231{
232 return render_window_.get();
233}
234
236{
237 render_window_.reset();
238}
239
240void renderer::request_screenshot(const std::string& file)
241{
242 request_screenshot_ = file;
243}
244
245auto renderer::get_vsync() const -> bool
246{
247 return (reset_flags_ & BGFX_RESET_VSYNC) != 0;
248}
249void renderer::set_vsync(bool vsync)
250{
251 if(vsync)
252 {
253 reset_flags_ |= BGFX_RESET_VSYNC;
254 }
255 else
256 {
257 reset_flags_ &= ~BGFX_RESET_VSYNC;
258 }
259
260 const auto sz = init_window_->get_size();
261
262 gfx::reset(sz.w, sz.h, reset_flags_);
263}
264
266{
267 auto window = get_main_window();
268 if(window)
269 {
270 auto& pass = window->begin_present_pass();
271 pass.clear();
272 }
273}
274
276{
277 gfx::render_pass pass(gfx::render_pass::get_max_pass_id(), "backbuffer_update");
278 pass.bind();
279
280 gfx::frame();
281
282 // if(!request_screenshot_.empty())
283 // {
284 // gfx::request_screen_shot(get_main_window()->get_surface()->native_handle(), request_screenshot_.c_str());
285 // request_screenshot_ = {};
286 // }
287
289}
290
291} // namespace unravel
void set_optional(const std::string &name, const std::string &alternative, T defaultValue, const std::string &description="", bool dominant=false)
Definition parser.h:303
std::chrono::duration< float > delta_t
#define APPLOG_ERROR(...)
Definition logging.h:20
#define APPLOG_INFO_LOC(FILE_LOC, LINE_LOC, FUNC_LOC,...)
Definition logging.h:34
#define APPLOG_WARNING_LOC(FILE_LOC, LINE_LOC, FUNC_LOC,...)
Definition logging.h:36
#define APPLOG_ERROR_LOC(FILE_LOC, LINE_LOC, FUNC_LOC,...)
Definition logging.h:38
#define APPLOG_TRACE_LOC(FILE_LOC, LINE_LOC, FUNC_LOC,...)
Definition logging.h:32
#define APPLOG_TRACE(...)
Definition logging.h:17
bgfx::Init init_type
Definition graphics.h:19
renderer_type get_renderer_type()
Definition graphics.cpp:281
void shutdown()
Definition graphics.cpp:167
bool init(init_type init_data)
Definition graphics.cpp:177
void set_info_logger(const std::function< void(const std::string &, const char *, uint16_t)> &logger)
Definition graphics.cpp:35
const char * get_renderer_name(renderer_type _type)
Definition graphics.cpp:255
void reset(uint32_t _width, uint32_t _height, uint32_t _flags)
Definition graphics.cpp:260
void set_warning_logger(const std::function< void(const std::string &, const char *, uint16_t)> &logger)
Definition graphics.cpp:39
void set_trace_logger(const std::function< void(const std::string &, const char *, uint16_t)> &logger)
Definition graphics.cpp:30
bgfx::RendererType::Enum renderer_type
Definition graphics.h:21
void set_error_logger(const std::function< void(const std::string &, const char *, uint16_t)> &logger)
Definition graphics.cpp:43
uint32_t frame(bool _capture)
Definition graphics.cpp:275
static void reset()
static auto get_max_pass_id() -> gfx::view_id
void bind(const frame_buffer *fb=nullptr) const
auto get_cached() -> T &
Definition context.hpp:49
hpp::event< void(rtti::context &, os::event &e)> on_os_event
os events
Definition events.h:34
Struct representing a render window.
auto get_reset_flags(const cmd_line::parser &parser) const -> uint32_t
Definition renderer.cpp:191
std::string request_screenshot_
Definition renderer.h:51
void frame_begin(rtti::context &ctx, delta_t dt)
Definition renderer.cpp:265
auto get_renderer_type(const cmd_line::parser &parser) const -> gfx::renderer_type
Definition renderer.cpp:162
uint32_t reset_flags_
Definition renderer.h:47
auto init_backend(const cmd_line::parser &parser) -> bool
Definition renderer.cpp:93
std::unique_ptr< render_window > render_window_
Definition renderer.h:50
std::unique_ptr< os::window > init_window_
engine windows
Definition renderer.h:49
void on_os_event(rtti::context &ctx, os::event &e)
Definition renderer.cpp:131
auto deinit(rtti::context &ctx) -> bool
Definition renderer.cpp:87
void frame_end(rtti::context &ctx, delta_t dt)
Definition renderer.cpp:275
auto get_vsync() const -> bool
Definition renderer.cpp:245
std::shared_ptr< int > sentinel_
Definition renderer.h:53
void request_screenshot(const std::string &file)
Definition renderer.cpp:240
renderer(rtti::context &ctx, cmd_line::parser &parser)
Definition renderer.cpp:15
auto init(rtti::context &ctx, const cmd_line::parser &parser) -> bool
Definition renderer.cpp:47
void set_vsync(bool vsync)
Definition renderer.cpp:249
void close_main_window()
Definition renderer.cpp:235
void set_main_window(os::window &&window)
Definition renderer.cpp:82
auto create_window_for_display(int index, const std::string &title, uint32_t flags) -> const std::unique_ptr< render_window > &
Definition renderer.cpp:64
auto get_main_window() const -> render_window *
Definition renderer.cpp:230
void ddShutdown()
void ddInit(bx::AllocatorI *_allocator)