Move OpenGL extension query into renderer backend

This commit is contained in:
2026-06-04 19:39:06 +02:00
parent 11c7d87330
commit 1057dd488a
6 changed files with 159 additions and 21 deletions

View File

@@ -344,6 +344,31 @@ pp::foundation::Result<OpenGlRuntimeInfo> query_opengl_runtime_info(
});
}
pp::foundation::Result<std::vector<std::string>> query_opengl_extensions(
OpenGlExtensionQueryDispatch dispatch)
{
if (dispatch.get_integer == nullptr || dispatch.get_string_indexed == nullptr) {
return pp::foundation::Result<std::vector<std::string>>::failure(
pp::foundation::Status::invalid_argument("OpenGL extension query callbacks must not be null"));
}
std::int32_t extension_count = 0;
dispatch.get_integer(extension_count_query(), &extension_count);
if (extension_count <= 0) {
return pp::foundation::Result<std::vector<std::string>>::success({});
}
std::vector<std::string> extensions;
extensions.reserve(static_cast<std::size_t>(extension_count));
for (std::int32_t index = 0; index < extension_count; ++index) {
const char* extension = dispatch.get_string_indexed(
extension_string_name(),
static_cast<std::uint32_t>(index));
extensions.emplace_back(extension != nullptr ? extension : "");
}
return pp::foundation::Result<std::vector<std::string>>::success(std::move(extensions));
}
OpenGlDefaultClear panopainter_default_clear() noexcept
{
return OpenGlDefaultClear {

View File

@@ -5,7 +5,9 @@
#include <array>
#include <cstdint>
#include <span>
#include <string>
#include <string_view>
#include <vector>
namespace pp::renderer::gl {
@@ -459,11 +461,17 @@ struct OpenGlRuntimeInfo {
};
using OpenGlStringQueryFn = const char* (*)(std::uint32_t name) noexcept;
using OpenGlIndexedStringQueryFn = const char* (*)(std::uint32_t name, std::uint32_t index) noexcept;
struct OpenGlRuntimeInfoDispatch {
OpenGlStringQueryFn get_string = nullptr;
};
struct OpenGlExtensionQueryDispatch {
OpenGlGetIntegerFn get_integer = nullptr;
OpenGlIndexedStringQueryFn get_string_indexed = nullptr;
};
struct OpenGlDefaultClear {
std::array<float, 4> color {};
std::uint32_t mask = 0;
@@ -690,6 +698,8 @@ struct OpenGlMeshDeleteDispatch {
OpenGlStateRestoreDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Result<OpenGlRuntimeInfo> query_opengl_runtime_info(
OpenGlRuntimeInfoDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Result<std::vector<std::string>> query_opengl_extensions(
OpenGlExtensionQueryDispatch dispatch);
[[nodiscard]] OpenGlDefaultClear panopainter_default_clear() noexcept;
[[nodiscard]] pp::foundation::Status clear_panopainter_default_target(OpenGlClearDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status apply_opengl_viewport(