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

@@ -1025,6 +1025,40 @@ void treats_desktop_gl_float_rendering_as_core(pp::tests::Harness& h)
PP_EXPECT(h, features.float32_render_targets);
}
void detects_feature_state_from_extension_capabilities(pp::tests::Harness& h)
{
constexpr std::array<std::string_view, 2> extensions {
"GL_EXT_shader_framebuffer_fetch",
"GL_ARB_map_buffer_alignment",
};
const auto feature_state = pp::renderer::gl::detect_opengl_feature_state(
extensions,
pp::renderer::gl::OpenGlRuntime {});
PP_EXPECT(h, feature_state.capabilities.framebuffer_fetch);
PP_EXPECT(h, feature_state.capabilities.map_buffer_alignment);
PP_EXPECT(h, !feature_state.capabilities.float32_textures);
PP_EXPECT(h, feature_state.features.framebuffer_fetch);
PP_EXPECT(h, feature_state.features.texture_copy);
PP_EXPECT(h, feature_state.features.render_target_blit);
PP_EXPECT(h, !feature_state.features.float32_render_targets);
}
void detects_desktop_feature_state_without_extensions(pp::tests::Harness& h)
{
const auto feature_state = pp::renderer::gl::detect_opengl_feature_state(
{},
pp::renderer::gl::OpenGlRuntime { .desktop_gl = true });
PP_EXPECT(h, !feature_state.capabilities.framebuffer_fetch);
PP_EXPECT(h, feature_state.capabilities.float32_textures);
PP_EXPECT(h, feature_state.capabilities.float32_linear);
PP_EXPECT(h, feature_state.capabilities.float16_textures);
PP_EXPECT(h, feature_state.features.float32_render_targets);
PP_EXPECT(h, feature_state.features.float16_render_targets);
}
void detects_gles_texture_float_extensions(pp::tests::Harness& h)
{
constexpr std::array<std::string_view, 3> extensions {
@@ -1890,6 +1924,58 @@ void rejects_incomplete_extension_query_dispatch(pp::tests::Harness& h)
PP_EXPECT(h, result.status().code == pp::foundation::StatusCode::invalid_argument);
}
void queries_app_capability_detection(pp::tests::Harness& h)
{
recorded_integer_queries.clear();
recorded_indexed_string_queries.clear();
recorded_extension_count = 3;
const auto result = pp::renderer::gl::query_opengl_capability_detection(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = record_get_integer,
.get_string_indexed = record_indexed_string_query,
},
pp::renderer::gl::OpenGlRuntime {});
PP_EXPECT(h, result.ok());
PP_EXPECT(h, recorded_integer_queries.size() == 1U);
PP_EXPECT(h, recorded_integer_queries[0] == 0x821DU);
PP_EXPECT(h, recorded_indexed_string_queries.size() == 3U);
PP_EXPECT(h, result.value().extensions.size() == 3U);
PP_EXPECT(h, result.value().extensions[0] == "GL_EXT_shader_framebuffer_fetch");
PP_EXPECT(h, result.value().feature_state.capabilities.framebuffer_fetch);
PP_EXPECT(h, result.value().feature_state.capabilities.map_buffer_alignment);
PP_EXPECT(h, !result.value().feature_state.capabilities.float32_textures);
PP_EXPECT(h, result.value().feature_state.features.framebuffer_fetch);
}
void query_capability_detection_preserves_webgl_float_policy(pp::tests::Harness& h)
{
recorded_extension_count = 3;
const auto result = pp::renderer::gl::query_opengl_capability_detection(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = record_get_integer,
.get_string_indexed = record_indexed_string_query,
},
pp::renderer::gl::OpenGlRuntime { .gles = true, .web = true });
PP_EXPECT(h, result.ok());
PP_EXPECT(h, result.value().feature_state.capabilities.framebuffer_fetch);
PP_EXPECT(h, !result.value().feature_state.capabilities.float32_textures);
PP_EXPECT(h, !result.value().feature_state.features.float32_render_targets);
}
void rejects_incomplete_capability_detection_dispatch(pp::tests::Harness& h)
{
const auto result = pp::renderer::gl::query_opengl_capability_detection(
pp::renderer::gl::OpenGlExtensionQueryDispatch {},
pp::renderer::gl::OpenGlRuntime {});
PP_EXPECT(h, !result.ok());
PP_EXPECT(h, result.status().code == pp::foundation::StatusCode::invalid_argument);
}
void clears_app_default_target(pp::tests::Harness& h)
{
recorded_clear_calls.clear();
@@ -4185,6 +4271,8 @@ int main()
pp::tests::Harness harness;
harness.run("detects_common_extension_capabilities", detects_common_extension_capabilities);
harness.run("treats_desktop_gl_float_rendering_as_core", treats_desktop_gl_float_rendering_as_core);
harness.run("detects_feature_state_from_extension_capabilities", detects_feature_state_from_extension_capabilities);
harness.run("detects_desktop_feature_state_without_extensions", detects_desktop_feature_state_without_extensions);
harness.run("detects_gles_texture_float_extensions", detects_gles_texture_float_extensions);
harness.run("ignores_gles_texture_extensions_for_webgl_runtime", ignores_gles_texture_extensions_for_webgl_runtime);
harness.run("classifies_current_build_opengl_runtime", classifies_current_build_opengl_runtime);
@@ -4219,6 +4307,9 @@ int main()
harness.run("converts_null_extension_names_to_empty_strings", converts_null_extension_names_to_empty_strings);
harness.run("treats_negative_extension_count_as_empty", treats_negative_extension_count_as_empty);
harness.run("rejects_incomplete_extension_query_dispatch", rejects_incomplete_extension_query_dispatch);
harness.run("queries_app_capability_detection", queries_app_capability_detection);
harness.run("query_capability_detection_preserves_webgl_float_policy", query_capability_detection_preserves_webgl_float_policy);
harness.run("rejects_incomplete_capability_detection_dispatch", rejects_incomplete_capability_detection_dispatch);
harness.run("clears_app_default_target", clears_app_default_target);
harness.run("rejects_incomplete_app_clear_dispatch", rejects_incomplete_app_clear_dispatch);
harness.run("applies_viewport_dispatch", applies_viewport_dispatch);