去掉异步渲染,因为OpenGL和Metal支持问题
This commit is contained in:
parent
192bb51f1d
commit
7a01b9d897
@ -6,6 +6,6 @@ int main(int argc, char* argv[]) {
|
|||||||
init.size = {800, 600};
|
init.size = {800, 600};
|
||||||
init.resizable = true;
|
init.resizable = true;
|
||||||
init.centered = true;
|
init.centered = true;
|
||||||
// init.api = mirage::renderer_api::opengl;
|
init.api = mirage::renderer_api::opengl;
|
||||||
return run(init);
|
return run(init);
|
||||||
}
|
}
|
||||||
|
@ -49,14 +49,15 @@ namespace mirage {
|
|||||||
LLGL::BindFlags::ConstantBuffer,
|
LLGL::BindFlags::ConstantBuffer,
|
||||||
LLGL::StageFlags::VertexStage,
|
LLGL::StageFlags::VertexStage,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
pipeline = generated_pipelines::create_aorii_rect_pipeline(get_renderer(), swap_chain->GetRenderPass(), pipeline_layout_desc);
|
pipeline = generated_pipelines::create_aorii_rect_pipeline(get_renderer(), swap_chain->GetRenderPass(),
|
||||||
|
pipeline_layout_desc);
|
||||||
|
|
||||||
push_rectangle({0, 0}, {100, 100}, linear_color::white);
|
push_rectangle({0, 0}, {100, 100}, linear_color::white);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
render_context::update_status render_context::update(const duration_type& in_delta_time) {
|
render_context::update_status render_context::render_update(const duration_type& in_delta_time) {
|
||||||
if (!command_buffer || !swap_chain) {
|
if (!command_buffer || !swap_chain) {
|
||||||
return update_status::fail;
|
return update_status::fail;
|
||||||
}
|
}
|
||||||
@ -64,11 +65,12 @@ namespace mirage {
|
|||||||
return update_status::wait_for_present;
|
return update_status::wait_for_present;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto size = new_size.exchange({})) {
|
if (new_size) {
|
||||||
swap_chain->ResizeBuffers(size.value());
|
swap_chain->ResizeBuffers(new_size.value());
|
||||||
pipeline_param param;
|
pipeline_param param;
|
||||||
param.mvp = get_projection_matrix();
|
param.mvp = get_projection_matrix();
|
||||||
param_buffer->set(param);
|
param_buffer->set(param);
|
||||||
|
new_size.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
command_buffer->Begin(); {
|
command_buffer->Begin(); {
|
||||||
@ -88,6 +90,7 @@ namespace mirage {
|
|||||||
command_buffer->EndRenderPass();
|
command_buffer->EndRenderPass();
|
||||||
}
|
}
|
||||||
command_buffer->End();
|
command_buffer->End();
|
||||||
|
get_renderer()->GetCommandQueue()->Submit(*command_buffer);
|
||||||
swap_chain->Present();
|
swap_chain->Present();
|
||||||
return update_status::success;
|
return update_status::success;
|
||||||
}
|
}
|
||||||
@ -106,7 +109,8 @@ namespace mirage {
|
|||||||
spdlog::info("垂直同步: {}", vsync);
|
spdlog::info("垂直同步: {}", vsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
void render_context::push_rectangle(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size, const linear_color_type& in_color) {
|
void render_context::push_rectangle(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size,
|
||||||
|
const linear_color_type& in_color) {
|
||||||
vertex va{};
|
vertex va{};
|
||||||
vertex vb{};
|
vertex vb{};
|
||||||
vertex vc{};
|
vertex vc{};
|
||||||
@ -139,7 +143,8 @@ namespace mirage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Eigen::Matrix4f render_context::get_projection_matrix() const {
|
Eigen::Matrix4f render_context::get_projection_matrix() const {
|
||||||
const bool is_clip_range_unit_cube = get_renderer()->GetRenderingCaps().clippingRange == LLGL::ClippingRange::MinusOneToOne;
|
const bool is_clip_range_unit_cube = get_renderer()->GetRenderingCaps().clippingRange ==
|
||||||
|
LLGL::ClippingRange::MinusOneToOne;
|
||||||
const auto& size = swap_chain->GetResolution();
|
const auto& size = swap_chain->GetResolution();
|
||||||
|
|
||||||
Eigen::Matrix4f matrix = Eigen::Matrix4f::Identity();
|
Eigen::Matrix4f matrix = Eigen::Matrix4f::Identity();
|
||||||
|
@ -12,7 +12,7 @@ namespace mirage {
|
|||||||
~render_context();
|
~render_context();
|
||||||
|
|
||||||
bool init(const swap_chain_descriptor& in_desc, const std::shared_ptr<LLGL::Surface>& in_surface);
|
bool init(const swap_chain_descriptor& in_desc, const std::shared_ptr<LLGL::Surface>& in_surface);
|
||||||
update_status update(const duration_type& in_delta_time);
|
update_status render_update(const duration_type& in_delta_time);
|
||||||
void resize_swap_chain(const LLGL::Extent2D& in_size, long in_flag);
|
void resize_swap_chain(const LLGL::Extent2D& in_size, long in_flag);
|
||||||
|
|
||||||
void set_vsync(bool in_vsync);
|
void set_vsync(bool in_vsync);
|
||||||
@ -43,6 +43,6 @@ namespace mirage {
|
|||||||
LLGL::SwapChain* swap_chain = nullptr;
|
LLGL::SwapChain* swap_chain = nullptr;
|
||||||
bool vsync = true;
|
bool vsync = true;
|
||||||
pipeline_info pipeline;
|
pipeline_info pipeline;
|
||||||
std::atomic<std::optional<LLGL::Extent2D>> new_size;
|
std::optional<LLGL::Extent2D> new_size;
|
||||||
};
|
};
|
||||||
} // namespace mirage
|
} // namespace mirage
|
||||||
|
@ -45,7 +45,7 @@ namespace mirage {
|
|||||||
|
|
||||||
void window::render_update(const duration_type& in_delta_time) {
|
void window::render_update(const duration_type& in_delta_time) {
|
||||||
if (context) {
|
if (context) {
|
||||||
context->update(in_delta_time);
|
context->render_update(in_delta_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,8 @@
|
|||||||
namespace mirage {
|
namespace mirage {
|
||||||
void window_manager::update(const duration_type& in_delta_time) {
|
void window_manager::update(const duration_type& in_delta_time) {
|
||||||
LLGL::Surface::ProcessEvents();
|
LLGL::Surface::ProcessEvents();
|
||||||
|
render_thread_func();
|
||||||
to_destroy.clear();
|
to_destroy.clear();
|
||||||
|
|
||||||
std::shared_lock lock(mutex);
|
|
||||||
should_exit_flag = windows.empty() && to_destroy.empty();
|
should_exit_flag = windows.empty() && to_destroy.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,13 +22,11 @@ namespace mirage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
last_time = std::chrono::high_resolution_clock::now();
|
last_time = std::chrono::high_resolution_clock::now();
|
||||||
render_thread = std::thread(&window_manager::render_thread_func, this);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool window_manager::destroy() {
|
bool window_manager::destroy() {
|
||||||
should_exit_flag = true;
|
should_exit_flag = true;
|
||||||
render_thread.join();
|
|
||||||
windows.clear();
|
windows.clear();
|
||||||
to_destroy.clear();
|
to_destroy.clear();
|
||||||
return true;
|
return true;
|
||||||
@ -38,10 +35,7 @@ namespace mirage {
|
|||||||
std::weak_ptr<window> window_manager::create_window(const LLGL::WindowDescriptor& desc) {
|
std::weak_ptr<window> window_manager::create_window(const LLGL::WindowDescriptor& desc) {
|
||||||
auto window_ptr = std::make_shared<window>(desc);
|
auto window_ptr = std::make_shared<window>(desc);
|
||||||
|
|
||||||
{
|
windows.push_back(window_ptr);
|
||||||
std::unique_lock lock(mutex);
|
|
||||||
windows.push_back(window_ptr);
|
|
||||||
}
|
|
||||||
if (!window_ptr) {
|
if (!window_ptr) {
|
||||||
spdlog::error("无法创建窗口");
|
spdlog::error("无法创建窗口");
|
||||||
return {};
|
return {};
|
||||||
@ -50,7 +44,6 @@ namespace mirage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void window_manager::destroy_window(const window& in_window) {
|
void window_manager::destroy_window(const window& in_window) {
|
||||||
std::unique_lock lock(mutex);
|
|
||||||
for (auto it = windows.begin(); it != windows.end(); ++it) {
|
for (auto it = windows.begin(); it != windows.end(); ++it) {
|
||||||
if (it->get() == &in_window) {
|
if (it->get() == &in_window) {
|
||||||
to_destroy.push_back(*it);
|
to_destroy.push_back(*it);
|
||||||
@ -61,7 +54,6 @@ namespace mirage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::weak_ptr<window> window_manager::get_main_window() {
|
std::weak_ptr<window> window_manager::get_main_window() {
|
||||||
std::shared_lock lock(mutex);
|
|
||||||
if (windows.empty()) {
|
if (windows.empty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -69,17 +61,12 @@ namespace mirage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void window_manager::render_thread_func() {
|
void window_manager::render_thread_func() {
|
||||||
while (!should_exit_flag) {
|
const auto& current_time = std::chrono::high_resolution_clock::now();
|
||||||
const auto& current_time = std::chrono::high_resolution_clock::now();
|
const auto in_delta_time = current_time - last_time;
|
||||||
const auto in_delta_time = current_time - last_time;
|
last_time = current_time;
|
||||||
last_time = current_time;
|
|
||||||
|
|
||||||
std::shared_lock lock(mutex);
|
for (const auto& w : windows) {
|
||||||
for (const auto& w : windows) {
|
w->render_update(in_delta_time);
|
||||||
w->render_update(in_delta_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(16));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace mirage
|
} // namespace mirage
|
||||||
|
@ -31,9 +31,7 @@ namespace mirage {
|
|||||||
std::vector<std::shared_ptr<window>> to_destroy;
|
std::vector<std::shared_ptr<window>> to_destroy;
|
||||||
|
|
||||||
void render_thread_func();
|
void render_thread_func();
|
||||||
std::thread render_thread;
|
|
||||||
time_type last_time = {};
|
time_type last_time = {};
|
||||||
std::atomic_bool should_exit_flag = false;
|
std::atomic_bool should_exit_flag = false;
|
||||||
std::shared_mutex mutex;
|
|
||||||
};
|
};
|
||||||
} // namespace mirage
|
} // namespace mirage
|
||||||
|
Loading…
x
Reference in New Issue
Block a user