Route GL state snapshot through renderer GL
This commit is contained in:
@@ -245,6 +245,73 @@ pp::foundation::Status apply_panopainter_initial_state(OpenGlStateDispatch dispa
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
pp::foundation::Result<OpenGlSavedState> snapshot_opengl_state(OpenGlStateSnapshotDispatch dispatch) noexcept
|
||||
{
|
||||
if (dispatch.is_enabled == nullptr
|
||||
|| dispatch.get_integer == nullptr
|
||||
|| dispatch.get_float == nullptr
|
||||
|| dispatch.active_texture == nullptr) {
|
||||
return pp::foundation::Result<OpenGlSavedState>::failure(
|
||||
pp::foundation::Status::invalid_argument("OpenGL state snapshot dispatch callbacks must not be null"));
|
||||
}
|
||||
|
||||
OpenGlSavedState state {};
|
||||
state.blend_enabled = dispatch.is_enabled(blend_state());
|
||||
state.depth_test_enabled = dispatch.is_enabled(depth_test_state());
|
||||
state.scissor_test_enabled = dispatch.is_enabled(scissor_test_state());
|
||||
dispatch.get_integer(viewport_query(), state.viewport.data());
|
||||
dispatch.get_float(color_clear_value_query(), state.clear_color.data());
|
||||
dispatch.get_integer(current_program_query(), &state.program);
|
||||
dispatch.get_integer(draw_framebuffer_binding_query(), &state.draw_framebuffer);
|
||||
dispatch.get_integer(read_framebuffer_binding_query(), &state.read_framebuffer);
|
||||
dispatch.get_integer(active_texture_query(), &state.active_texture);
|
||||
dispatch.get_integer(texture_binding_cube_map_query(), &state.cube_map_binding);
|
||||
|
||||
for (std::size_t i = 0; i < state.texture_2d_bindings.size(); ++i) {
|
||||
dispatch.active_texture(active_texture_unit(static_cast<std::uint32_t>(i)));
|
||||
dispatch.get_integer(texture_binding_2d_query(), &state.texture_2d_bindings[i]);
|
||||
dispatch.get_integer(sampler_binding_query(), &state.sampler_bindings[i]);
|
||||
}
|
||||
|
||||
return pp::foundation::Result<OpenGlSavedState>::success(state);
|
||||
}
|
||||
|
||||
pp::foundation::Status restore_opengl_state(
|
||||
const OpenGlSavedState& state,
|
||||
OpenGlStateRestoreDispatch dispatch) noexcept
|
||||
{
|
||||
if (dispatch.enable == nullptr
|
||||
|| dispatch.disable == nullptr
|
||||
|| dispatch.viewport == nullptr
|
||||
|| dispatch.clear_color == nullptr
|
||||
|| dispatch.bind_framebuffer == nullptr
|
||||
|| dispatch.use_program == nullptr
|
||||
|| dispatch.active_texture == nullptr
|
||||
|| dispatch.bind_texture == nullptr
|
||||
|| dispatch.bind_sampler == nullptr) {
|
||||
return pp::foundation::Status::invalid_argument("OpenGL state restore dispatch callbacks must not be null");
|
||||
}
|
||||
|
||||
(state.blend_enabled != 0U ? dispatch.enable : dispatch.disable)(blend_state());
|
||||
(state.depth_test_enabled != 0U ? dispatch.enable : dispatch.disable)(depth_test_state());
|
||||
(state.scissor_test_enabled != 0U ? dispatch.enable : dispatch.disable)(scissor_test_state());
|
||||
dispatch.viewport(state.viewport[0], state.viewport[1], state.viewport[2], state.viewport[3]);
|
||||
dispatch.clear_color(state.clear_color[0], state.clear_color[1], state.clear_color[2], state.clear_color[3]);
|
||||
dispatch.bind_framebuffer(draw_framebuffer_target(), static_cast<std::uint32_t>(state.draw_framebuffer));
|
||||
dispatch.bind_framebuffer(read_framebuffer_target(), static_cast<std::uint32_t>(state.read_framebuffer));
|
||||
dispatch.use_program(static_cast<std::uint32_t>(state.program));
|
||||
|
||||
for (std::size_t i = 0; i < state.texture_2d_bindings.size(); ++i) {
|
||||
dispatch.active_texture(active_texture_unit(static_cast<std::uint32_t>(i)));
|
||||
dispatch.bind_texture(texture_2d_target(), static_cast<std::uint32_t>(state.texture_2d_bindings[i]));
|
||||
dispatch.bind_sampler(static_cast<std::uint32_t>(i), static_cast<std::uint32_t>(state.sampler_bindings[i]));
|
||||
}
|
||||
|
||||
dispatch.active_texture(static_cast<std::uint32_t>(state.active_texture));
|
||||
dispatch.bind_texture(texture_cube_map_target(), static_cast<std::uint32_t>(state.cube_map_binding));
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
pp::foundation::Result<OpenGlRuntimeInfo> query_opengl_runtime_info(
|
||||
OpenGlRuntimeInfoDispatch dispatch) noexcept
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user