Route RTT utility clears through GL backend

This commit is contained in:
2026-06-04 21:58:27 +02:00
parent ce787ce186
commit 4c61a490ce
7 changed files with 275 additions and 23 deletions

View File

@@ -464,6 +464,45 @@ pp::foundation::Status clear_panopainter_default_target(OpenGlClearDispatch disp
return pp::foundation::Status::success();
}
pp::foundation::Status clear_opengl_render_target(
OpenGlDefaultClear clear,
OpenGlClearDispatch dispatch) noexcept
{
if (dispatch.clear_color == nullptr || dispatch.clear == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL render-target clear dispatch callbacks must not be null");
}
if (clear.mask == 0U) {
return pp::foundation::Status::invalid_argument("OpenGL render-target clear mask is invalid");
}
dispatch.clear_color(clear.color[0], clear.color[1], clear.color[2], clear.color[3]);
dispatch.clear(clear.mask);
return pp::foundation::Status::success();
}
pp::foundation::Status clear_opengl_color_buffer_with_write_mask(
OpenGlColorMaskedClear clear,
OpenGlColorMaskedClearDispatch dispatch) noexcept
{
if (dispatch.get_boolean == nullptr
|| dispatch.color_mask == nullptr
|| dispatch.clear_color == nullptr
|| dispatch.clear == nullptr) {
return pp::foundation::Status::invalid_argument(
"OpenGL color-masked clear dispatch callbacks must not be null");
}
std::array<std::uint8_t, 4> old_mask {};
dispatch.get_boolean(color_write_mask_query(), old_mask.data());
dispatch.color_mask(clear.mask.r, clear.mask.g, clear.mask.b, clear.mask.a);
dispatch.clear_color(clear.color[0], clear.color[1], clear.color[2], clear.color[3]);
dispatch.clear(framebuffer_color_buffer_mask());
dispatch.color_mask(old_mask[0], old_mask[1], old_mask[2], old_mask[3]);
return pp::foundation::Status::success();
}
pp::foundation::Status apply_opengl_viewport(
OpenGlViewportRect viewport,
OpenGlViewportDispatch dispatch) noexcept

View File

@@ -316,9 +316,15 @@ using OpenGlCapabilityFn = void (*)(std::uint32_t state) noexcept;
using OpenGlIsEnabledFn = std::uint8_t (*)(std::uint32_t state) noexcept;
using OpenGlGetIntegerFn = void (*)(std::uint32_t name, std::int32_t* value) noexcept;
using OpenGlGetFloatFn = void (*)(std::uint32_t name, float* value) noexcept;
using OpenGlGetBooleanFn = void (*)(std::uint32_t name, std::uint8_t* value) noexcept;
using OpenGlActiveTextureFn = void (*)(std::uint32_t texture_unit) noexcept;
using OpenGlClearColorFn = void (*)(float r, float g, float b, float a) noexcept;
using OpenGlClearFn = void (*)(std::uint32_t mask) noexcept;
using OpenGlColorMaskFn = void (*)(
std::uint8_t r,
std::uint8_t g,
std::uint8_t b,
std::uint8_t a) noexcept;
using OpenGlViewportFn = void (*)(std::int32_t x, std::int32_t y, std::int32_t width, std::int32_t height) noexcept;
using OpenGlScissorFn = void (*)(std::int32_t x, std::int32_t y, std::int32_t width, std::int32_t height) noexcept;
using OpenGlBlendFuncFn = void (*)(std::uint32_t source_factor, std::uint32_t destination_factor) noexcept;
@@ -547,11 +553,23 @@ struct OpenGlDefaultClear {
std::uint32_t mask = 0;
};
struct OpenGlColorMaskedClear {
OpenGlColorWriteMask mask;
std::array<float, 4> color {};
};
struct OpenGlClearDispatch {
OpenGlClearColorFn clear_color = nullptr;
OpenGlClearFn clear = nullptr;
};
struct OpenGlColorMaskedClearDispatch {
OpenGlGetBooleanFn get_boolean = nullptr;
OpenGlColorMaskFn color_mask = nullptr;
OpenGlClearColorFn clear_color = nullptr;
OpenGlClearFn clear = nullptr;
};
struct OpenGlViewportDispatch {
OpenGlViewportFn viewport = nullptr;
};
@@ -854,6 +872,12 @@ struct OpenGlMeshDeleteDispatch {
OpenGlExtensionQueryDispatch dispatch);
[[nodiscard]] OpenGlDefaultClear panopainter_default_clear() noexcept;
[[nodiscard]] pp::foundation::Status clear_panopainter_default_target(OpenGlClearDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status clear_opengl_render_target(
OpenGlDefaultClear clear,
OpenGlClearDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status clear_opengl_color_buffer_with_write_mask(
OpenGlColorMaskedClear clear,
OpenGlColorMaskedClearDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status apply_opengl_viewport(
OpenGlViewportRect viewport,
OpenGlViewportDispatch dispatch) noexcept;