gl-renderer: Store GL extensions as flags

A new gl_extensions bitfield is added to the renderer to store the
flags supported by the GL implementation. This allows the GL renderer
to easily check for extension support whenever needed.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-09-28 17:12:58 +02:00 committed by Daniel Stone
parent db5c06bd16
commit 4ae493ff25
2 changed files with 71 additions and 18 deletions

View file

@ -99,6 +99,27 @@ enum egl_display_extension_flag {
EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 14,
};
/* Keep in sync with gl-renderer.c. */
enum gl_extension_flag {
EXTENSION_ANGLE_PACK_REVERSE_ROW_ORDER = 1ull << 0,
EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT = 1ull << 1,
EXTENSION_EXT_DISJOINT_TIMER_QUERY = 1ull << 2,
EXTENSION_EXT_MAP_BUFFER_RANGE = 1ull << 3,
EXTENSION_EXT_READ_FORMAT_BGRA = 1ull << 4,
EXTENSION_EXT_TEXTURE_FORMAT_BGRA8888 = 1ull << 5,
EXTENSION_EXT_TEXTURE_NORM16 = 1ull << 6,
EXTENSION_EXT_TEXTURE_RG = 1ull << 7,
EXTENSION_EXT_TEXTURE_STORAGE = 1ull << 8,
EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV = 1ull << 9,
EXTENSION_EXT_UNPACK_SUBIMAGE = 1ull << 10,
EXTENSION_NV_PIXEL_BUFFER_OBJECT = 1ull << 11,
EXTENSION_OES_EGL_IMAGE_EXTERNAL = 1ull << 12,
EXTENSION_OES_MAPBUFFER = 1ull << 13,
EXTENSION_OES_RGB8_RGBA8 = 1ull << 14,
EXTENSION_OES_TEXTURE_3D = 1ull << 15,
EXTENSION_OES_TEXTURE_FLOAT_LINEAR = 1ull << 16,
};
enum gl_feature_flag {
/* GL renderer can create contexts without specifying an EGLConfig. */
FEATURE_NO_CONFIG_CONTEXT = 1ull << 0,
@ -327,6 +348,8 @@ struct gl_renderer {
uint64_t features;
uint64_t gl_extensions;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
PFNGLTEXIMAGE3DOESPROC tex_image_3d;
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC image_target_renderbuffer_storage;
@ -421,6 +444,13 @@ egl_display_has(struct gl_renderer *gr,
return (bool) (gr->egl_display_extensions & ((uint64_t) flag));
}
static inline bool
gl_extensions_has(struct gl_renderer *gr,
enum gl_extension_flag flag)
{
return (bool) (gr->gl_extensions & ((uint64_t) flag));
}
static inline bool
gl_features_has(struct gl_renderer *gr,
enum gl_feature_flag flag)

View file

@ -261,6 +261,28 @@ struct timeline_render_point {
struct wl_event_source *event_source;
};
/* Keep in sync with gl-renderer-internal.h. */
static const struct gl_extension_table extension_table[] = {
EXT("GL_ANGLE_pack_reverse_row_order", EXTENSION_ANGLE_PACK_REVERSE_ROW_ORDER),
EXT("GL_EXT_color_buffer_half_float", EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT),
EXT("GL_EXT_disjoint_timer_query", EXTENSION_EXT_DISJOINT_TIMER_QUERY),
EXT("GL_EXT_map_buffer_range", EXTENSION_EXT_MAP_BUFFER_RANGE),
EXT("GL_EXT_read_format_bgra", EXTENSION_EXT_READ_FORMAT_BGRA),
EXT("GL_EXT_texture_format_BGRA8888", EXTENSION_EXT_TEXTURE_FORMAT_BGRA8888),
EXT("GL_EXT_texture_norm16", EXTENSION_EXT_TEXTURE_NORM16),
EXT("GL_EXT_texture_rg", EXTENSION_EXT_TEXTURE_RG),
EXT("GL_EXT_texture_storage", EXTENSION_EXT_TEXTURE_STORAGE),
EXT("GL_EXT_texture_type_2_10_10_10_REV", EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV),
EXT("GL_EXT_unpack_subimage", EXTENSION_EXT_UNPACK_SUBIMAGE),
EXT("GL_NV_pixel_buffer_object", EXTENSION_NV_PIXEL_BUFFER_OBJECT),
EXT("GL_OES_EGL_image_external", EXTENSION_OES_EGL_IMAGE_EXTERNAL),
EXT("GL_OES_mapbuffer", EXTENSION_OES_MAPBUFFER),
EXT("GL_OES_rgb8_rgba8", EXTENSION_OES_RGB8_RGBA8),
EXT("GL_OES_texture_3D", EXTENSION_OES_TEXTURE_3D),
EXT("GL_OES_texture_float_linear", EXTENSION_OES_TEXTURE_FLOAT_LINEAR),
{ NULL, 0, 0 }
};
static inline const char *
dump_format(uint32_t format, char out[4])
{
@ -4815,45 +4837,47 @@ gl_renderer_setup(struct weston_compositor *ec)
return -1;
}
if (!weston_check_egl_extension(extensions, "GL_EXT_texture_format_BGRA8888")) {
gl_extensions_add(extension_table, extensions, &gr->gl_extensions);
if (!gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_FORMAT_BGRA8888)) {
weston_log("GL_EXT_texture_format_BGRA8888 not available\n");
return -1;
}
if (weston_check_egl_extension(extensions, "GL_EXT_read_format_bgra"))
if (gl_extensions_has(gr, EXTENSION_EXT_READ_FORMAT_BGRA))
ec->read_format = pixel_format_get_info(DRM_FORMAT_ARGB8888);
else
ec->read_format = pixel_format_get_info(DRM_FORMAT_ABGR8888);
if (gr->gl_version < gl_version(3, 0) &&
!weston_check_egl_extension(extensions, "GL_EXT_unpack_subimage")) {
!gl_extensions_has(gr, EXTENSION_EXT_UNPACK_SUBIMAGE)) {
weston_log("GL_EXT_unpack_subimage not available.\n");
return -1;
}
if (gr->gl_version >= gl_version(3, 0) ||
weston_check_egl_extension(extensions, "GL_EXT_texture_type_2_10_10_10_REV"))
gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV))
gr->has_texture_type_2_10_10_10_rev = true;
if (weston_check_egl_extension(extensions, "GL_EXT_texture_norm16"))
if (gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_NORM16))
gr->has_texture_norm16 = true;
if (gr->gl_version >= gl_version(3, 0) ||
weston_check_egl_extension(extensions, "GL_EXT_texture_storage"))
gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_STORAGE))
gr->has_texture_storage = true;
if (weston_check_egl_extension(extensions, "GL_ANGLE_pack_reverse_row_order"))
if (gl_extensions_has(gr, EXTENSION_ANGLE_PACK_REVERSE_ROW_ORDER))
gr->has_pack_reverse = true;
if (gr->gl_version >= gl_version(3, 0) ||
weston_check_egl_extension(extensions, "GL_EXT_texture_rg"))
gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_RG))
gr->has_gl_texture_rg = true;
if (weston_check_egl_extension(extensions, "GL_OES_EGL_image_external"))
if (gl_extensions_has(gr, EXTENSION_OES_EGL_IMAGE_EXTERNAL))
gr->has_egl_image_external = true;
if (gr->gl_version >= gl_version(3, 0) ||
weston_check_egl_extension(extensions, "GL_OES_rgb8_rgba8"))
gl_extensions_has(gr, EXTENSION_OES_RGB8_RGBA8))
gr->has_rgb8_rgba8 = true;
if (gr->gl_version >= gl_version(3, 0)) {
@ -4863,10 +4887,9 @@ gl_renderer_setup(struct weston_compositor *ec)
assert(gr->unmap_buffer);
gr->pbo_usage = GL_STREAM_READ;
gr->has_pbo = true;
} else if (gr->gl_version >= gl_version(2, 0) &&
weston_check_egl_extension(extensions, "GL_NV_pixel_buffer_object") &&
weston_check_egl_extension(extensions, "GL_EXT_map_buffer_range") &&
weston_check_egl_extension(extensions, "GL_OES_mapbuffer")) {
} else if (gl_extensions_has(gr, EXTENSION_NV_PIXEL_BUFFER_OBJECT) &&
gl_extensions_has(gr, EXTENSION_EXT_MAP_BUFFER_RANGE) &&
gl_extensions_has(gr, EXTENSION_OES_MAPBUFFER)) {
gr->map_buffer_range = (void *) eglGetProcAddress("glMapBufferRangeEXT");
gr->unmap_buffer = (void *) eglGetProcAddress("glUnmapBufferOES");
assert(gr->map_buffer_range);
@ -4887,15 +4910,15 @@ gl_renderer_setup(struct weston_compositor *ec)
wl_list_init(&gr->pending_capture_list);
if (gr->gl_version >= gl_version(3, 0) &&
weston_check_egl_extension(extensions, "GL_OES_texture_float_linear") &&
weston_check_egl_extension(extensions, "GL_EXT_color_buffer_half_float") &&
weston_check_egl_extension(extensions, "GL_OES_texture_3D")) {
gl_extensions_has(gr, EXTENSION_OES_TEXTURE_FLOAT_LINEAR) &&
gl_extensions_has(gr, EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT) &&
gl_extensions_has(gr, EXTENSION_OES_TEXTURE_3D)) {
gr->gl_supports_color_transforms = true;
gr->tex_image_3d = (void *) eglGetProcAddress("glTexImage3D");
assert(gr->tex_image_3d);
}
if (weston_check_egl_extension(extensions, "GL_EXT_disjoint_timer_query")) {
if (gl_extensions_has(gr, EXTENSION_EXT_DISJOINT_TIMER_QUERY)) {
PFNGLGETQUERYIVEXTPROC get_query_iv =
(void *) eglGetProcAddress("glGetQueryivEXT");
int elapsed_bits;