|
@@ -204,4 +204,86 @@ RefPtr<Gfx::PaintingSurface> OpenGLContext::surface()
|
|
|
return m_painting_surface;
|
|
|
}
|
|
|
|
|
|
+Vector<StringView> s_available_webgl_extensions {
|
|
|
+ // Khronos ratified WebGL Extensions
|
|
|
+ "ANGLE_instanced_arrays"sv,
|
|
|
+ "EXT_blend_minmax"sv,
|
|
|
+ "EXT_frag_depth"sv,
|
|
|
+ "EXT_shader_texture_lod"sv,
|
|
|
+ "EXT_texture_filter_anisotropic"sv,
|
|
|
+ "OES_element_index_uint"sv,
|
|
|
+ "OES_standard_derivatives"sv,
|
|
|
+ "OES_texture_float"sv,
|
|
|
+ "OES_texture_float_linear"sv,
|
|
|
+ "OES_texture_half_float"sv,
|
|
|
+ "OES_texture_half_float_linear"sv,
|
|
|
+ "OES_vertex_array_object"sv,
|
|
|
+ "WEBGL_compressed_texture_s3tc"sv,
|
|
|
+ "WEBGL_debug_renderer_info"sv,
|
|
|
+ "WEBGL_debug_shaders"sv,
|
|
|
+ "WEBGL_depth_texture"sv,
|
|
|
+ "WEBGL_draw_buffers"sv,
|
|
|
+ "WEBGL_lose_context"sv,
|
|
|
+
|
|
|
+ // Community approved WebGL Extensions
|
|
|
+ "EXT_clip_control"sv,
|
|
|
+ "EXT_color_buffer_float"sv,
|
|
|
+ "EXT_color_buffer_half_float"sv,
|
|
|
+ "EXT_conservative_depth"sv,
|
|
|
+ "EXT_depth_clamp"sv,
|
|
|
+ "EXT_disjoint_timer_query"sv,
|
|
|
+ "EXT_disjoint_timer_query_webgl2"sv,
|
|
|
+ "EXT_float_blend"sv,
|
|
|
+ "EXT_polygon_offset_clamp"sv,
|
|
|
+ "EXT_render_snorm"sv,
|
|
|
+ "EXT_sRGB"sv,
|
|
|
+ "EXT_texture_compression_bptc"sv,
|
|
|
+ "EXT_texture_compression_rgtc"sv,
|
|
|
+ "EXT_texture_mirror_clamp_to_edge"sv,
|
|
|
+ "EXT_texture_norm16"sv,
|
|
|
+ "KHR_parallel_shader_compile"sv,
|
|
|
+ "NV_shader_noperspective_interpolation"sv,
|
|
|
+ "OES_draw_buffers_indexed"sv,
|
|
|
+ "OES_fbo_render_mipmap"sv,
|
|
|
+ "OES_sample_variables"sv,
|
|
|
+ "OES_shader_multisample_interpolation"sv,
|
|
|
+ "OVR_multiview2"sv,
|
|
|
+ "WEBGL_blend_func_extended"sv,
|
|
|
+ "WEBGL_clip_cull_distance"sv,
|
|
|
+ "WEBGL_color_buffer_float"sv,
|
|
|
+ "WEBGL_compressed_texture_astc"sv,
|
|
|
+ "WEBGL_compressed_texture_etc"sv,
|
|
|
+ "WEBGL_compressed_texture_etc1"sv,
|
|
|
+ "WEBGL_compressed_texture_pvrtc"sv,
|
|
|
+ "WEBGL_compressed_texture_s3tc_srgb"sv,
|
|
|
+ "WEBGL_multi_draw"sv,
|
|
|
+ "WEBGL_polygon_mode"sv,
|
|
|
+ "WEBGL_provoking_vertex"sv,
|
|
|
+ "WEBGL_render_shared_exponent"sv,
|
|
|
+ "WEBGL_stencil_texturing"sv,
|
|
|
+};
|
|
|
+
|
|
|
+Vector<String> OpenGLContext::get_supported_extensions()
|
|
|
+{
|
|
|
+#ifdef AK_OS_MACOS
|
|
|
+ make_current();
|
|
|
+
|
|
|
+ auto const* extensions_string = reinterpret_cast<char const*>(glGetString(GL_EXTENSIONS));
|
|
|
+ StringView extensions_view(extensions_string, strlen(extensions_string));
|
|
|
+
|
|
|
+ Vector<String> extensions;
|
|
|
+ for (auto const& extension : extensions_view.split_view(' ')) {
|
|
|
+ auto extension_name_without_gl_prefix = extension.substring_view(3);
|
|
|
+ // FIXME: WebGL 1 and WebGL 2 have different sets of available extensions, but for now we simply
|
|
|
+ // filter out everything that is not listed in https://registry.khronos.org/webgl/extensions/
|
|
|
+ if (s_available_webgl_extensions.contains_slow(extension_name_without_gl_prefix))
|
|
|
+ extensions.append(MUST(String::from_utf8(extension_name_without_gl_prefix)));
|
|
|
+ }
|
|
|
+
|
|
|
+ return extensions;
|
|
|
+#else
|
|
|
+ return {};
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
}
|