Move shader feature negotiation into renderer backend
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user