diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index 48f3302..c2de205 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -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 diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index f0244f9..0402987 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -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, diff --git a/src/renderer_gl/opengl_capabilities.cpp b/src/renderer_gl/opengl_capabilities.cpp index 9a11374..89e5e44 100644 --- a/src/renderer_gl/opengl_capabilities.cpp +++ b/src/renderer_gl/opengl_capabilities.cpp @@ -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) { diff --git a/src/renderer_gl/opengl_capabilities.h b/src/renderer_gl/opengl_capabilities.h index ec463f2..ba1ca7e 100644 --- a/src/renderer_gl/opengl_capabilities.h +++ b/src/renderer_gl/opengl_capabilities.h @@ -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; diff --git a/tests/renderer_gl/capabilities_tests.cpp b/tests/renderer_gl/capabilities_tests.cpp index 5f48263..28012a3 100644 --- a/tests/renderer_gl/capabilities_tests.cpp +++ b/tests/renderer_gl/capabilities_tests.cpp @@ -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(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);