diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h index 28677a547..a12c3d837 100644 --- a/libweston/renderer-gl/gl-renderer-internal.h +++ b/libweston/renderer-gl/gl-renderer-internal.h @@ -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) diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 1bc2a16d8..9c727b2bc 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -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;