Move shader feature negotiation into renderer backend

This commit is contained in:
2026-06-04 19:49:06 +02:00
parent 1057dd488a
commit f2cb0f2276
7 changed files with 171 additions and 35 deletions

View File

@@ -228,6 +228,17 @@ pp::renderer::RenderDeviceFeatures render_device_features(OpenGlCapabilities cap
};
}
OpenGlFeatureState detect_opengl_feature_state(
std::span<const std::string_view> extensions,
OpenGlRuntime runtime) noexcept
{
const auto capabilities = detect_opengl_capabilities(extensions, runtime);
return OpenGlFeatureState {
.capabilities = capabilities,
.features = render_device_features(capabilities),
};
}
OpenGlInitialState panopainter_initial_state() noexcept
{
return OpenGlInitialState {
@@ -369,6 +380,28 @@ pp::foundation::Result<std::vector<std::string>> query_opengl_extensions(
return pp::foundation::Result<std::vector<std::string>>::success(std::move(extensions));
}
pp::foundation::Result<OpenGlCapabilityDetectionResult> query_opengl_capability_detection(
OpenGlExtensionQueryDispatch dispatch,
OpenGlRuntime runtime)
{
auto extensions_result = query_opengl_extensions(dispatch);
if (!extensions_result.ok()) {
return pp::foundation::Result<OpenGlCapabilityDetectionResult>::failure(extensions_result.status());
}
auto extensions = std::move(extensions_result.value());
std::vector<std::string_view> extension_views;
extension_views.reserve(extensions.size());
for (const auto& extension : extensions) {
extension_views.push_back(extension);
}
return pp::foundation::Result<OpenGlCapabilityDetectionResult>::success(OpenGlCapabilityDetectionResult {
.extensions = std::move(extensions),
.feature_state = detect_opengl_feature_state(extension_views, runtime),
});
}
OpenGlDefaultClear panopainter_default_clear() noexcept
{
return OpenGlDefaultClear {

View File

@@ -27,6 +27,16 @@ struct OpenGlCapabilities {
bool float16_textures = false;
};
struct OpenGlFeatureState {
OpenGlCapabilities capabilities;
pp::renderer::RenderDeviceFeatures features;
};
struct OpenGlCapabilityDetectionResult {
std::vector<std::string> extensions;
OpenGlFeatureState feature_state;
};
struct OpenGlPixelFormat {
std::uint32_t internal_format = 0;
std::uint32_t pixel_format = 0;
@@ -689,6 +699,12 @@ struct OpenGlMeshDeleteDispatch {
[[nodiscard]] OpenGlRuntime opengl_runtime_for_current_build() noexcept;
[[nodiscard]] pp::renderer::RenderDeviceFeatures render_device_features(
OpenGlCapabilities capabilities) noexcept;
[[nodiscard]] OpenGlFeatureState detect_opengl_feature_state(
std::span<const std::string_view> extensions,
OpenGlRuntime runtime) noexcept;
[[nodiscard]] pp::foundation::Result<OpenGlCapabilityDetectionResult> query_opengl_capability_detection(
OpenGlExtensionQueryDispatch dispatch,
OpenGlRuntime runtime);
[[nodiscard]] OpenGlInitialState panopainter_initial_state() noexcept;
[[nodiscard]] pp::foundation::Status apply_panopainter_initial_state(OpenGlStateDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Result<OpenGlSavedState> snapshot_opengl_state(