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

@@ -167,6 +167,7 @@ struct RecordedOpenGlMeshDrawCall {
std::vector<RecordedOpenGlStateCall> recorded_state_calls;
std::vector<std::uint32_t> recorded_string_queries;
std::vector<std::uint32_t> recorded_indexed_string_queries;
std::vector<pp::renderer::gl::OpenGlDefaultClear> recorded_clear_calls;
std::vector<pp::renderer::gl::OpenGlViewportRect> recorded_viewport_calls;
std::vector<pp::renderer::gl::OpenGlScissorRect> recorded_scissor_calls;
@@ -188,6 +189,7 @@ std::vector<std::uint32_t> recorded_generated_sampler_counts;
std::vector<RecordedOpenGlSamplerParameterCall> recorded_sampler_parameter_calls;
std::vector<RecordedOpenGlSamplerBorderCall> recorded_sampler_border_calls;
std::vector<std::uint32_t> recorded_deleted_programs;
std::int32_t recorded_extension_count = 3;
std::vector<RecordedOpenGlUniformFloatVectorCall> recorded_uniform_vector_calls;
std::vector<RecordedOpenGlUniformScalarCall> recorded_uniform_scalar_calls;
std::vector<std::uint32_t> recorded_attrib_location_programs;
@@ -278,6 +280,25 @@ const char* record_string_query(std::uint32_t name) noexcept
}
}
const char* record_indexed_string_query(std::uint32_t name, std::uint32_t index) noexcept
{
recorded_indexed_string_queries.push_back(name);
if (name != 0x1F03U) {
return "unexpected";
}
switch (index) {
case 0U:
return "GL_EXT_shader_framebuffer_fetch";
case 1U:
return "GL_EXT_map_buffer_alignment";
case 2U:
return "GL_OES_texture_float";
default:
return nullptr;
}
}
void record_clear_color(float r, float g, float b, float a) noexcept
{
recorded_clear_calls.push_back(pp::renderer::gl::OpenGlDefaultClear {
@@ -331,6 +352,9 @@ void record_get_integer(std::uint32_t name, std::int32_t* value) noexcept
{
recorded_integer_queries.push_back(name);
switch (name) {
case 0x821DU:
*value = recorded_extension_count;
break;
case 0x0BA2U:
value[0] = 2;
value[1] = 4;
@@ -1805,6 +1829,67 @@ void rejects_incomplete_app_runtime_info_dispatch(pp::tests::Harness& h)
PP_EXPECT(h, result.status().code == pp::foundation::StatusCode::invalid_argument);
}
void queries_app_extensions(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_extensions(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = record_get_integer,
.get_string_indexed = record_indexed_string_query,
});
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().size() == 3U);
PP_EXPECT(h, result.value()[0] == "GL_EXT_shader_framebuffer_fetch");
PP_EXPECT(h, result.value()[1] == "GL_EXT_map_buffer_alignment");
PP_EXPECT(h, result.value()[2] == "GL_OES_texture_float");
}
void converts_null_extension_names_to_empty_strings(pp::tests::Harness& h)
{
recorded_extension_count = 4;
const auto result = pp::renderer::gl::query_opengl_extensions(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = record_get_integer,
.get_string_indexed = record_indexed_string_query,
});
PP_EXPECT(h, result.ok());
PP_EXPECT(h, result.value().size() == 4U);
PP_EXPECT(h, result.value()[3].empty());
}
void treats_negative_extension_count_as_empty(pp::tests::Harness& h)
{
recorded_indexed_string_queries.clear();
recorded_extension_count = -7;
const auto result = pp::renderer::gl::query_opengl_extensions(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = record_get_integer,
.get_string_indexed = record_indexed_string_query,
});
PP_EXPECT(h, result.ok());
PP_EXPECT(h, result.value().empty());
PP_EXPECT(h, recorded_indexed_string_queries.empty());
}
void rejects_incomplete_extension_query_dispatch(pp::tests::Harness& h)
{
const auto result = pp::renderer::gl::query_opengl_extensions(pp::renderer::gl::OpenGlExtensionQueryDispatch {});
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();
@@ -4130,6 +4215,10 @@ int main()
harness.run("rejects_incomplete_gl_state_restore_dispatch", rejects_incomplete_gl_state_restore_dispatch);
harness.run("queries_app_runtime_info", queries_app_runtime_info);
harness.run("rejects_incomplete_app_runtime_info_dispatch", rejects_incomplete_app_runtime_info_dispatch);
harness.run("queries_app_extensions", queries_app_extensions);
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("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);