weston/libweston/renderer-gl/gl-renderer-internal.h
Leandro Ribeiro ec646f34d6 gl-renderer: add support to query EGL configs with float-point formats
Currently when we have a blend-to-output color transformation, we have a
16FP shadow buffer representing the blending space. Then we blit from
that to the primary plane fb, which is a regular buffer (fixed-point,
not 16bpc).

The shadow buffer needs to be 16FP because the blending space is linear
with relation to light. So it needs more bits for encoding.

In the next patches we enable the option to offload the blend-to-output
color transformation to KMS, so we'll need the primary plane fb to be
of a 16FP format. In order to do that, we need to be able to find EGL
configs with float-point formats. In this patch we enable that.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2025-09-02 13:34:00 +00:00

730 lines
20 KiB
C

/*
* Copyright © 2019 Collabora, Ltd.
* Copyright © 2019 Harish Krupo
* Copyright © 2019 Intel Corporation
* Copyright 2021 Advanced Micro Devices, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*
* GL renderer best practices:
*
* 1. Extensions and features
*
* 1. An extension flag ensures the availability of an EGL or OpenGL ES
* extension at run-time, independently of the version.
* 2. A feature flag ensures the availability of a minimal OpenGL ES version
* and/or extensions at run-time in order to enable the use of a specific
* feature.
* 3. Any function pointers declared in the gl_renderer structure must be
* loaded at setup so that an extension availability check can ensure
* valid pointers.
* 4. OpenGL ES 3 functions must be loaded at run-time after having checked
* for EGL_KHR_get_all_proc_addresses extension availability in order to
* correctly link against OpenGL ES 2 only implementations.
*
* 2. Pixel storage modes
*
* 1. Any functions changing modes must restore them to their default values
* before return so that other functions can assume default values.
*
* 3. Texture units
*
* 1. Fixed allocation using the gl_tex_unit enumeration.
* 2. Any functions changing the active unit must restore it to 0 before
* return so that other functions can assume a default value.
*/
#ifndef GL_RENDERER_INTERNAL_H
#define GL_RENDERER_INTERNAL_H
#include <stdbool.h>
#include <time.h>
#include <wayland-util.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES3/gl32.h>
#include "color.h"
#include "libweston-internal.h"
#include "shared/weston-egl-ext.h" /* for PFN* stuff */
#include "shared/helpers.h"
/* Max number of images per buffer. */
#define SHADER_INPUT_TEX_MAX 3
#define GET_PROC_ADDRESS(dest, proc) do { \
dest = (void *) eglGetProcAddress(proc); \
assert(dest); \
} while (0)
#define EXT(string, flag) { string, ARRAY_LENGTH(string) - 1, (uint64_t) flag }
/* Keep in sync with egl-glue.c. */
enum egl_client_extension_flag {
EXTENSION_EXT_DEVICE_QUERY = 1ull << 0,
EXTENSION_EXT_PLATFORM_BASE = 1ull << 1,
EXTENSION_EXT_PLATFORM_WAYLAND = 1ull << 2,
EXTENSION_EXT_PLATFORM_X11 = 1ull << 3,
EXTENSION_KHR_PLATFORM_GBM = 1ull << 4,
EXTENSION_KHR_PLATFORM_WAYLAND = 1ull << 5,
EXTENSION_KHR_PLATFORM_X11 = 1ull << 6,
EXTENSION_MESA_PLATFORM_GBM = 1ull << 7,
EXTENSION_MESA_PLATFORM_SURFACELESS = 1ull << 8,
};
/* Keep in sync with egl-glue.c. */
enum egl_device_extension_flag {
EXTENSION_EXT_DEVICE_DRM = 1ull << 0,
EXTENSION_EXT_DEVICE_DRM_RENDER_NODE = 1ull << 1,
};
/* Keep in sync with egl-glue.c. */
enum egl_display_extension_flag {
EXTENSION_ANDROID_NATIVE_FENCE_SYNC = 1ull << 0,
EXTENSION_EXT_BUFFER_AGE = 1ull << 1,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT = 1ull << 2,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS = 1ull << 3,
EXTENSION_EXT_PIXEL_FORMAT_FLOAT = 1ull << 4,
EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 5,
EXTENSION_IMG_CONTEXT_PRIORITY = 1ull << 6,
EXTENSION_KHR_FENCE_SYNC = 1ull << 7,
EXTENSION_KHR_GET_ALL_PROC_ADDRESSES = 1ull << 8,
EXTENSION_KHR_IMAGE_BASE = 1ull << 9,
EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 10,
EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 11,
EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 12,
EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 13,
EXTENSION_KHR_WAIT_SYNC = 1ull << 14,
EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 15,
EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 16,
};
/* Keep in sync with gl-renderer.c. */
enum gl_extension_flag {
EXTENSION_ANGLE_PACK_REVERSE_ROW_ORDER = 1ull << 1,
EXTENSION_APPLE_TEXTURE_PACKED_FLOAT = 1ull << 3,
EXTENSION_ARM_RGBA8 = 1ull << 4,
EXTENSION_EXT_COLOR_BUFFER_FLOAT = 1ull << 5,
EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT = 1ull << 6,
EXTENSION_EXT_DISJOINT_TIMER_QUERY = 1ull << 7,
EXTENSION_EXT_EGL_IMAGE_STORAGE = 1ull << 8,
EXTENSION_EXT_MAP_BUFFER_RANGE = 1ull << 9,
EXTENSION_EXT_READ_FORMAT_BGRA = 1ull << 10,
EXTENSION_EXT_TEXTURE_FORMAT_BGRA8888 = 1ull << 11,
EXTENSION_EXT_TEXTURE_NORM16 = 1ull << 12,
EXTENSION_EXT_TEXTURE_RG = 1ull << 13,
EXTENSION_EXT_TEXTURE_SRGB_R8 = 1ull << 14,
EXTENSION_EXT_TEXTURE_SRGB_RG8 = 1ull << 15,
EXTENSION_EXT_TEXTURE_STORAGE = 1ull << 16,
EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV = 1ull << 17,
EXTENSION_EXT_UNPACK_SUBIMAGE = 1ull << 18,
EXTENSION_NV_PACKED_FLOAT = 1ull << 20,
EXTENSION_NV_PIXEL_BUFFER_OBJECT = 1ull << 21,
EXTENSION_OES_EGL_IMAGE = 1ull << 22,
EXTENSION_OES_EGL_IMAGE_EXTERNAL = 1ull << 23,
EXTENSION_OES_MAPBUFFER = 1ull << 24,
EXTENSION_OES_REQUIRED_INTERNALFORMAT = 1ull << 25,
EXTENSION_OES_RGB8_RGBA8 = 1ull << 26,
EXTENSION_OES_TEXTURE_3D = 1ull << 27,
EXTENSION_OES_TEXTURE_FLOAT = 1ull << 28,
EXTENSION_OES_TEXTURE_FLOAT_LINEAR = 1ull << 29,
EXTENSION_OES_TEXTURE_HALF_FLOAT = 1ull << 30,
EXTENSION_QCOM_RENDER_SRGB_R8_RG8 = 1ull << 31,
};
enum gl_feature_flag {
/* GL renderer can create contexts without specifying an EGLConfig. */
FEATURE_NO_CONFIG_CONTEXT = 1ull << 0,
/* GL renderer can pass a list of damage rectangles at buffer swap in
* order to reduce recomposition costs. */
FEATURE_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 1,
/* GL renderer can create native sync objects and wait on them. This
* enables support for the Linux explicit sync Wayland protocol. */
FEATURE_EXPLICIT_SYNC = 1ull << 2,
/* GL renderer can asynchronously map the framebuffer into CPU memory
* for reading. This is exposed by binding a Pixel Buffer Object (PBO)
* to the GL_PIXEL_PACK_BUFFER target before read-back with
* glReadPixels(). map_buffer_range() is then called to sync and map and
* unmap_buffer() to unmap once read. A fence sync can be used to signal
* pixel transfer completion, this is flagged as another feature. */
FEATURE_ASYNC_READBACK = 1ull << 3,
/* GL renderer can create 16-bit floating-point framebuffers and
* transform colours using linearly interpolated 3D look-up tables.
*
* Strong dependency on the texture 3D feature. */
FEATURE_COLOR_TRANSFORMS = 1ull << 4,
/* GL renderer can instrument output repaint time and report it through
* the timeline logging scope. */
FEATURE_GPU_TIMELINE = 1ull << 5,
/* GL renderer can specify the entire structure of a texture in a single
* call. Once specified, format and dimensions can't be changed.
*
* Weak dependency on the texture 3D feature, enabling immutability of
* of 3D textures. */
FEATURE_TEXTURE_IMMUTABILITY = 1ull << 6,
/* GL renderer can create two-component red-green textures. */
FEATURE_TEXTURE_RG = 1ull << 7,
/* GL renderer supports the GL_EXT_texture_format_BGRA8888 extension
* with the GL_BGRA8_EXT sized internal format revision (23/06/2024) for
* renderbuffer objects. */
FEATURE_SIZED_BGRA8_RENDERBUFFER = 1ull << 8,
/* GL renderer can create 3D textures. */
FEATURE_TEXTURE_3D = 1ull << 9,
};
/* Keep the following in sync with vertex.glsl. */
enum gl_shader_texcoord_input {
SHADER_TEXCOORD_INPUT_ATTRIB = 0,
SHADER_TEXCOORD_INPUT_SURFACE,
};
enum gl_shader_texture_variant {
SHADER_VARIANT_NONE = 0,
/* Keep the following in sync with fragment.glsl. */
SHADER_VARIANT_RGBA,
SHADER_VARIANT_Y_U_V,
SHADER_VARIANT_Y_UV,
SHADER_VARIANT_XYUV,
SHADER_VARIANT_SOLID,
SHADER_VARIANT_EXTERNAL,
};
/* Keep the following in sync with fragment.glsl. */
enum gl_shader_color_curve {
SHADER_COLOR_CURVE_IDENTITY = 0,
SHADER_COLOR_CURVE_LUT_3x1D,
SHADER_COLOR_CURVE_LINPOW,
SHADER_COLOR_CURVE_POWLIN,
SHADER_COLOR_CURVE_PQ,
SHADER_COLOR_CURVE_PQ_INVERSE,
};
/* Keep the following in sync with fragment.glsl. */
enum gl_shader_color_mapping {
SHADER_COLOR_MAPPING_IDENTITY = 0,
SHADER_COLOR_MAPPING_3DLUT,
SHADER_COLOR_MAPPING_MATRIX,
};
enum gl_shader_attrib_loc {
SHADER_ATTRIB_LOC_POSITION = 0,
SHADER_ATTRIB_LOC_TEXCOORD,
SHADER_ATTRIB_LOC_BARYCENTRIC,
};
enum gl_tex_unit {
TEX_UNIT_IMAGES = 0,
TEX_UNIT_COLOR_PRE_CURVE = SHADER_INPUT_TEX_MAX,
TEX_UNIT_COLOR_MAPPING,
TEX_UNIT_COLOR_POST_CURVE,
TEX_UNIT_WIREFRAME,
TEX_UNIT_LAST,
};
static_assert(TEX_UNIT_LAST < 8, "OpenGL ES 2.0 requires at least 8 texture "
"units. Consider replacing this assert with a "
"GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS check at display creation "
"to require more.");
enum gl_bgra8_texture_support {
BGRA8_TEXTURE_SUPPORT_STORAGE = 0,
BGRA8_TEXTURE_SUPPORT_IMAGE_REVISED,
BGRA8_TEXTURE_SUPPORT_IMAGE_ORIGINAL,
BGRA8_TEXTURE_SUPPORT_NONE,
};
struct gl_extension_table {
const char *str;
size_t len;
uint64_t flag;
};
/** GL shader requirements key
*
* This structure is used as a binary blob key for building and searching
* shaders. Therefore it must not contain any bytes or bits the C compiler
* would be free to leave undefined e.g. after struct initialization,
* struct assignment, or member operations.
*
* Use 'pahole' from package 'dwarves' to inspect this structure.
*/
struct gl_shader_requirements
{
unsigned texcoord_input:1; /* enum gl_shader_texcoord_input */
unsigned variant:4; /* enum gl_shader_texture_variant */
bool input_is_premult:1;
bool tint:1;
bool wireframe:1;
unsigned color_pre_curve:3; /* enum gl_shader_color_curve */
unsigned color_mapping:2; /* enum gl_shader_color_mapping */
unsigned color_post_curve:3; /* enum gl_shader_color_curve */
/*
* The total size of all bitfields plus pad_bits_ must fill up exactly
* how many bytes the compiler allocates for them together.
*/
unsigned pad_bits_:16;
};
static_assert(sizeof(struct gl_shader_requirements) ==
4 /* total bitfield size in bytes */,
"struct gl_shader_requirements must not contain implicit padding");
enum gl_texture_flag {
TEXTURE_FILTERS_DIRTY = 1 << 0,
TEXTURE_WRAP_MODES_DIRTY = 1 << 1,
TEXTURE_SWIZZLES_DIRTY = 1 << 2,
TEXTURE_ALL_DIRTY = (TEXTURE_FILTERS_DIRTY |
TEXTURE_WRAP_MODES_DIRTY |
TEXTURE_SWIZZLES_DIRTY),
};
struct gl_texture_parameters {
GLenum target;
union {
struct { GLint min, mag; };
GLint array[2];
} filters;
union {
struct { GLint s, t, r; };
GLint array[3];
} wrap_modes;
union {
struct { GLint r, g, b, a; };
GLint array[4];
} swizzles;
uint32_t flags;
};
struct gl_shader;
struct weston_color_transform;
struct dmabuf_allocator;
union gl_shader_config_color_curve {
struct {
GLuint tex;
float scale;
float offset;
} lut_3x1d;
struct {
union weston_color_curve_parametric_data params;
GLboolean clamped_input;
} parametric;
};
union gl_shader_config_color_mapping {
struct {
GLuint tex3d;
float scale;
float offset;
} lut3d;
struct weston_color_mapping_matrix mat;
};
struct gl_shader_config {
struct gl_shader_requirements req;
struct weston_matrix projection;
struct weston_matrix surface_to_buffer;
float view_alpha;
GLfloat unicolor[4];
GLfloat tint[4];
struct gl_texture_parameters *input_param;
GLuint *input_tex;
int input_num;
GLuint wireframe_tex;
union gl_shader_config_color_curve color_pre_curve;
union gl_shader_config_color_mapping color_mapping;
union gl_shader_config_color_curve color_post_curve;
};
struct gl_renderer {
struct weston_renderer base;
struct weston_compositor *compositor;
struct weston_log_scope *renderer_scope;
/* Debug modes. */
struct weston_binding *debug_mode_binding;
int debug_mode;
bool debug_clear;
bool wireframe_dirty;
GLuint wireframe_tex;
int wireframe_size;
int nbatches;
EGLenum platform;
EGLDisplay egl_display;
EGLContext egl_context;
EGLConfig egl_config;
uint32_t gl_version;
/* Vertex streams. */
struct wl_array position_stream;
struct wl_array barycentric_stream;
struct wl_array indices;
EGLDeviceEXT egl_device;
const char *drm_device;
struct weston_drm_format_array supported_formats;
uint64_t egl_client_extensions;
uint64_t egl_device_extensions;
uint64_t egl_display_extensions;
/* EGL_EXT_device_query */
PFNEGLQUERYDISPLAYATTRIBEXTPROC query_display_attrib;
PFNEGLQUERYDEVICESTRINGEXTPROC query_device_string;
/* EGL_EXT_platform_base */
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display;
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC create_platform_window;
/* EGL_KHR_image_base */
PFNEGLCREATEIMAGEKHRPROC create_image;
PFNEGLDESTROYIMAGEKHRPROC destroy_image;
/* EGL_WL_bind_wayland_display */
PFNEGLBINDWAYLANDDISPLAYWL bind_display;
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
PFNEGLQUERYWAYLANDBUFFERWL query_buffer;
bool display_bound;
/* EGL_KHR_partial_update */
PFNEGLSETDAMAGEREGIONKHRPROC set_damage_region;
/* EGL_KHR_swap_buffers_with_damage
* EGL_EXT_swap_buffers_with_damage */
PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC swap_buffers_with_damage;
/* EGL_EXT_image_dma_buf_import_modifiers */
PFNEGLQUERYDMABUFFORMATSEXTPROC query_dmabuf_formats;
PFNEGLQUERYDMABUFMODIFIERSEXTPROC query_dmabuf_modifiers;
/* EGL_KHR_fence_sync */
PFNEGLCREATESYNCKHRPROC create_sync;
PFNEGLDESTROYSYNCKHRPROC destroy_sync;
/* EGL_ANDROID_native_fence_sync */
PFNEGLDUPNATIVEFENCEFDANDROIDPROC dup_native_fence_fd;
/* EGL_KHR_wait_sync */
PFNEGLWAITSYNCKHRPROC wait_sync;
uint64_t gl_extensions;
/* GL_OES_EGL_image */
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC image_target_renderbuffer_storage;
/* GL_EXT_EGL_image_storage */
PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC image_target_tex_storage;
/* GL_OES_mapbuffer */
PFNGLUNMAPBUFFEROESPROC unmap_buffer;
/* GL_EXT_map_buffer_range */
PFNGLMAPBUFFERRANGEEXTPROC map_buffer_range;
/* GL_OES_texture_3d */
PFNGLTEXIMAGE3DOESPROC tex_image_3d;
PFNGLTEXSUBIMAGE3DOESPROC tex_sub_image_3d;
/* GL_EXT_disjoint_timer_query */
PFNGLGENQUERIESEXTPROC gen_queries;
PFNGLDELETEQUERIESEXTPROC delete_queries;
PFNGLBEGINQUERYEXTPROC begin_query;
PFNGLENDQUERYEXTPROC end_query;
#if !defined(NDEBUG)
PFNGLGETQUERYOBJECTIVEXTPROC get_query_object_iv;
#endif
PFNGLGETQUERYOBJECTUI64VEXTPROC get_query_object_ui64v;
/* GL_EXT_texture_storage */
PFNGLTEXSTORAGE2DEXTPROC tex_storage_2d;
PFNGLTEXSTORAGE3DEXTPROC tex_storage_3d;
uint64_t features;
GLenum pbo_usage;
enum gl_bgra8_texture_support bgra8_texture_support;
bool blend_state;
struct wl_list dmabuf_images;
struct wl_list dmabuf_formats;
struct wl_list pending_capture_list;
struct gl_shader *current_shader;
struct gl_shader *fallback_shader;
struct wl_signal destroy_signal;
/** Shader program cache in most recently used order
*
* Uses struct gl_shader::link.
*/
struct wl_list shader_list;
struct weston_log_scope *shader_scope;
struct dmabuf_allocator *allocator;
};
static inline uint32_t
gl_version(uint16_t major, uint16_t minor)
{
return ((uint32_t)major << 16) | minor;
}
static inline int
gl_version_major(uint32_t ver)
{
return ver >> 16;
}
static inline int
gl_version_minor(uint32_t ver)
{
return ver & 0xffff;
}
void
gl_extensions_add(const struct gl_extension_table *table,
const char *extensions,
uint64_t *flags_out);
static inline bool
egl_client_has(struct gl_renderer *gr,
enum egl_client_extension_flag flag)
{
return (bool) (gr->egl_client_extensions & ((uint64_t) flag));
}
static inline bool
egl_device_has(struct gl_renderer *gr,
enum egl_device_extension_flag flag)
{
return (bool) (gr->egl_device_extensions & ((uint64_t) flag));
}
static inline bool
egl_display_has(struct gl_renderer *gr,
enum egl_display_extension_flag flag)
{
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)
{
return (bool) (gr->features & ((uint64_t) flag));
}
enum gl_bgra8_texture_support
gl_get_bgra8_texture_support(struct gl_renderer *gr);
bool
gl_has_sized_bgra8_renderbuffer(struct gl_renderer *gr);
bool
gl_texture_is_format_supported(struct gl_renderer *gr,
GLenum format);
bool
gl_texture_2d_init(struct gl_renderer *gr,
int levels,
GLenum format,
int width,
int height,
GLuint *tex_out);
void
gl_texture_2d_store(struct gl_renderer *gr,
int level,
int x,
int y,
int width,
int height,
GLenum format,
GLenum type,
const void *data);
bool
gl_texture_3d_init(struct gl_renderer *gr,
int levels,
GLenum format,
int width,
int height,
int depth,
GLuint *tex_out);
bool
gl_texture_3d_store(struct gl_renderer *gr,
int level,
int x,
int y,
int z,
int width,
int height,
int depth,
GLenum format,
GLenum type,
const void *data);
void
gl_texture_fini(GLuint *tex);
void
gl_texture_parameters_init(struct gl_renderer *gr,
struct gl_texture_parameters *parameters,
GLenum target,
const GLint *filters,
const GLint *wrap_modes,
const GLint *swizzles,
bool flush);
void
gl_texture_parameters_flush(struct gl_renderer *gr,
struct gl_texture_parameters *parameters);
bool
gl_fbo_is_format_supported(struct gl_renderer *gr,
GLenum format);
bool
gl_fbo_init(struct gl_renderer *gr,
GLenum format,
int width,
int height,
GLuint *fb_out,
GLuint *rb_out);
void
gl_fbo_fini(GLuint *fb,
GLuint *rb);
bool
gl_fbo_image_init(struct gl_renderer *gr,
EGLImageKHR image,
GLuint *fb_out,
GLuint *rb_out);
bool
gl_fbo_texture_init(struct gl_renderer *gr,
GLenum format,
int width,
int height,
GLuint *fb_out,
GLuint *tex_out);
void
gl_fbo_texture_fini(GLuint *fb,
GLuint *tex);
static inline struct gl_renderer *
get_renderer(struct weston_compositor *ec)
{
return (struct gl_renderer *)ec->renderer;
}
void
gl_renderer_print_egl_error_state(void);
void
gl_renderer_log_extensions(struct gl_renderer *gr,
const char *name, const char *extensions);
void
log_egl_config_info(EGLDisplay egldpy, EGLConfig eglconfig);
EGLConfig
gl_renderer_get_egl_config(struct gl_renderer *gr,
EGLint egl_surface_type,
const struct pixel_format_info *const *formats,
unsigned formats_count);
int
gl_renderer_setup_egl_display(struct gl_renderer *gr, void *native_display);
int
gl_renderer_setup_egl_client_extensions(struct gl_renderer *gr);
int
gl_renderer_setup_egl_extensions(struct weston_compositor *ec);
GLenum
gl_shader_texture_variant_get_target(enum gl_shader_texture_variant v);
bool
gl_shader_texture_variant_can_be_premult(enum gl_shader_texture_variant v);
void
gl_shader_destroy(struct gl_renderer *gr, struct gl_shader *shader);
void
gl_renderer_shader_list_destroy(struct gl_renderer *gr);
struct gl_shader *
gl_renderer_create_fallback_shader(struct gl_renderer *gr);
void
gl_renderer_garbage_collect_programs(struct gl_renderer *gr);
bool
gl_renderer_use_program(struct gl_renderer *gr,
const struct gl_shader_config *sconf);
struct weston_log_scope *
gl_shader_scope_create(struct gl_renderer *gr);
bool
gl_shader_config_set_color_transform(struct gl_renderer *gr,
struct gl_shader_config *sconf,
struct weston_color_transform *xform);
#endif /* GL_RENDERER_INTERNAL_H */