Route GL state snapshot through renderer GL

This commit is contained in:
2026-06-03 06:15:51 +02:00
parent 3e15b2f46c
commit 9971b2b7f2
6 changed files with 516 additions and 37 deletions

View File

@@ -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
{