Unravel Engine C++ Reference
Loading...
Searching...
No Matches
render_pass.cpp
Go to the documentation of this file.
1#include "render_pass.h"
2#include "graphics/graphics.h"
3#include <bitset>
4#include <limits>
5
6namespace gfx
7{
8namespace
9{
10auto get_last_frame_counter() -> gfx::view_id&
11{
12 static gfx::view_id id = 0;
13 return id;
14}
15
16auto get_counter() -> gfx::view_id&
17{
18 static gfx::view_id id = 0;
19 return id;
20}
21
22auto generate_id() -> gfx::view_id
23{
24 const auto& limits = gfx::get_caps()->limits;
25 auto& counter = get_counter();
26 if(counter >= limits.maxViews - 1)
27 {
28 gfx::log("warning", "Render pass ID overflow", __FILE__, __LINE__);
29 frame();
30 counter = 0;
31 }
32 gfx::view_id idx = counter++;
33
34 return idx;
35}
36
37auto get_scopes() -> std::vector<std::string>&
38{
39 static std::vector<std::string> scopes;
40 return scopes;
41}
42}
44{
45 get_scopes().emplace_back(name);
46}
47
49{
50 get_scopes().pop_back();
51}
52
53render_pass::render_pass(const char* name) : render_pass(generate_id(), name)
54{
55}
56
58{
59 reset_view(id);
60
61 const auto& scopes = get_scopes();
62 if(scopes.empty())
63 {
65 }
66 else
67 {
68 std::string scoped_name{};
69 for(const auto& scope : scopes)
70 {
71 scoped_name.append(scope).append("/");
72 }
73
74 scoped_name.append(name);
75
76 set_view_name(id, scoped_name.c_str());
77
78 }
79}
80
81void render_pass::bind(const frame_buffer* fb) const
82{
83 set_view_mode(id, gfx::view_mode::Sequential);
84 if(fb != nullptr)
85 {
86 const auto size = fb->get_size();
87 const auto width = size.width;
88 const auto height = size.height;
91 gfx::set_view_scissor(id, uint16_t(0), uint16_t(0), uint16_t(width), uint16_t(height));
92 }
93 else
94 {
96 gfx::set_view_rect(id, uint16_t(0), uint16_t(0), backbuffer_ratio::Equal);
97 }
98 touch();
99}
100
102{
103 gfx::touch(id);
104}
105
106void render_pass::clear(uint16_t _flags,
107 uint32_t _rgba /*= 0x000000ff */,
108 float _depth /*= 1.0f */,
109 uint8_t _stencil /*= 0*/) const
110{
111 set_view_clear(id, _flags, _rgba, _depth, _stencil);
112 touch();
113}
114
116{
117 clear(BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH | BGFX_CLEAR_STENCIL, 0x000000FF, 1.0f, 0);
118}
119
120void render_pass::set_view_proj(const float* v, const float* p)
121{
122 set_view_transform(id, v, p);
123}
124
125void render_pass::set_view_scissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
126{
127 gfx::set_view_scissor(id, _x, _y, _width, _height);
128}
129
130void render_pass::set_view_rect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
131{
132 gfx::set_view_rect(id, _x, _y, _width, _height);
133}
134
136{
137 auto& count = get_counter();
138 get_last_frame_counter() = count;
139 count = 0;
140}
141
143{
144 const auto& limits = gfx::get_caps()->limits;
145 return limits.maxViews - 1;
146}
147
149{
150 return get_last_frame_counter();
151}
152} // namespace gfx
uint32_t width
uint32_t height
static auto invalid_handle() -> frame_buffer_handle
Definition handle_impl.h:68
auto native_handle() const -> T
Definition handle_impl.h:53
const char * id
uint32_t frame
Definition graphics.cpp:23
std::string name
Definition hub.cpp:33
void set_view_scissor(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:876
void set_view_mode(view_id _id, view_mode _mode)
Definition graphics.cpp:902
void set_view_clear(view_id _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
Definition graphics.cpp:881
void reset_view(view_id _id)
Definition graphics.cpp:927
void touch(view_id _id)
void set_view_frame_buffer(view_id _id, frame_buffer_handle _handle)
Definition graphics.cpp:907
void set_view_rect(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:866
void set_view_name(view_id _id, const char *_name)
Definition graphics.cpp:861
void log(const std::string &category, const std::string &log_msg, const char *_filePath, uint16_t _line)
Definition graphics.cpp:71
void set_view_transform(view_id _id, const void *_view, const void *_proj)
Definition graphics.cpp:912
const caps * get_caps()
Definition graphics.cpp:445
bgfx::ViewId view_id
Definition graphics.h:20
uint32_t count
auto get_size() const -> usize32_t
static auto get_last_frame_max_pass_id() -> gfx::view_id
void set_view_rect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
static void reset()
static auto get_max_pass_id() -> gfx::view_id
static void pop_scope()
void clear() const
void set_view_proj(const float *v, const float *p)
void set_view_scissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
render_pass(const char *name)
void touch() const
static void push_scope(const char *name)
void bind(const frame_buffer *fb=nullptr) const
T width
Definition basetypes.hpp:55
T height
Definition basetypes.hpp:56