Map renderer primitive topologies to OpenGL

This commit is contained in:
2026-06-02 18:18:34 +02:00
parent dc03491b0d
commit 1065183e75
5 changed files with 41 additions and 6 deletions

View File

@@ -201,8 +201,9 @@ Known local toolchain state:
status used by `RTT::create` and framebuffer bind/restore paths, plus RTT
clear color/depth masks and color-write-mask query tokens. `RTT` no longer
spells GL enum names directly. It also
validates Shape index-type, fill/stroke primitive-mode, buffer target, static
upload usage, and vertex attribute component/normalization mapping used by
validates renderer API primitive-topology to OpenGL draw-mode mapping, Shape
index-type, fill/stroke primitive-mode, buffer target, static upload usage,
and vertex attribute component/normalization mapping used by
the legacy mesh draw path, plus the PanoPainter cube-face to OpenGL
texture-target mapping used by `TextureCube`.
It also owns and validates sampler wrap S/T/R, min/mag filter, and desktop

View File

@@ -455,10 +455,10 @@ framebuffer targets, binding queries, attachment points, and completion status
used by `RTT::create` and framebuffer bind/restore paths, also live in
`pp_renderer_gl`. RTT clear color/depth masks and color-write-mask query tokens
also live in `pp_renderer_gl`. `RTT` no longer spells GL enum names directly.
Mesh index-type and primitive-mode
decisions used by legacy `Shape` drawing, plus Shape buffer targets, static
upload usage, and vertex attribute component/normalization tokens, also live
in `pp_renderer_gl`. The PanoPainter cube-face to
Renderer API primitive-topology to OpenGL draw-mode mapping, mesh index-type
and primitive-mode decisions used by legacy `Shape` drawing, plus Shape buffer
targets, static upload usage, and vertex attribute component/normalization
tokens, also live in `pp_renderer_gl`. The PanoPainter cube-face to
OpenGL texture-target mapping used by `TextureCube` also lives in
`pp_renderer_gl`. The legacy app delegates extension, upload-format,
framebuffer diagnostic, framebuffer blit, render-target setup, clear-state,

View File

@@ -22,6 +22,7 @@ constexpr std::uint32_t gl_false = 0U;
constexpr std::uint32_t gl_points = 0x0000U;
constexpr std::uint32_t gl_lines = 0x0001U;
constexpr std::uint32_t gl_triangles = 0x0004U;
constexpr std::uint32_t gl_triangle_strip = 0x0005U;
constexpr std::uint32_t gl_fragment_shader = 0x8B30U;
constexpr std::uint32_t gl_vertex_shader = 0x8B31U;
constexpr std::uint32_t gl_compile_status = 0x8B81U;
@@ -459,6 +460,20 @@ std::uint32_t framebuffer_blit_filter(bool linear) noexcept
return linear ? gl_linear : gl_nearest;
}
std::uint32_t primitive_mode_for_renderer_topology(pp::renderer::PrimitiveTopology topology) noexcept
{
switch (topology) {
case pp::renderer::PrimitiveTopology::triangles:
return gl_triangles;
case pp::renderer::PrimitiveTopology::triangle_strip:
return gl_triangle_strip;
case pp::renderer::PrimitiveTopology::lines:
return gl_lines;
default:
return 0U;
}
}
std::uint32_t index_type_for_index_size(std::uint32_t index_size_bytes) noexcept
{
switch (index_size_bytes) {

View File

@@ -95,6 +95,8 @@ struct OpenGlWindowsWglContextConfig {
[[nodiscard]] std::uint32_t framebuffer_depth_buffer_mask() noexcept;
[[nodiscard]] std::uint32_t color_write_mask_query() noexcept;
[[nodiscard]] std::uint32_t framebuffer_blit_filter(bool linear) noexcept;
[[nodiscard]] std::uint32_t primitive_mode_for_renderer_topology(
pp::renderer::PrimitiveTopology topology) noexcept;
[[nodiscard]] std::uint32_t index_type_for_index_size(std::uint32_t index_size_bytes) noexcept;
[[nodiscard]] std::uint32_t primitive_mode_for_fill_count(std::uint32_t vertex_or_index_count) noexcept;
[[nodiscard]] std::uint32_t primitive_mode_for_stroke_count(std::uint32_t vertex_or_index_count) noexcept;

View File

@@ -258,6 +258,22 @@ void maps_framebuffer_blit_parameters(pp::tests::Harness& h)
PP_EXPECT(h, pp::renderer::gl::framebuffer_blit_filter(false) == 0x2600U);
}
void maps_renderer_primitive_topologies_to_draw_modes(pp::tests::Harness& h)
{
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_renderer_topology(
pp::renderer::PrimitiveTopology::triangles)
== 0x0004U);
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_renderer_topology(
pp::renderer::PrimitiveTopology::triangle_strip)
== 0x0005U);
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_renderer_topology(
pp::renderer::PrimitiveTopology::lines)
== 0x0001U);
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_renderer_topology(
static_cast<pp::renderer::PrimitiveTopology>(255U))
== 0U);
}
void maps_shape_index_and_primitive_modes(pp::tests::Harness& h)
{
constexpr std::uint32_t gl_points = 0x0000U;
@@ -545,6 +561,7 @@ int main()
harness.run("names_framebuffer_status_codes", names_framebuffer_status_codes);
harness.run("maps_framebuffer_render_target_parameters", maps_framebuffer_render_target_parameters);
harness.run("maps_framebuffer_blit_parameters", maps_framebuffer_blit_parameters);
harness.run("maps_renderer_primitive_topologies_to_draw_modes", maps_renderer_primitive_topologies_to_draw_modes);
harness.run("maps_shape_index_and_primitive_modes", maps_shape_index_and_primitive_modes);
harness.run("maps_panopainter_cube_faces_to_texture_targets", maps_panopainter_cube_faces_to_texture_targets);
harness.run("exposes_default_render_target_texture_parameters", exposes_default_render_target_texture_parameters);