#ifndef RENDER_GLES2_H #define RENDER_GLES2_H #include #include #include #include #include #include #include #include #include #include #include #include struct wlr_gles2_pixel_format { uint32_t drm_format; GLint gl_format, gl_type; bool has_alpha; }; struct wlr_gles2_tex_shader { GLuint program; GLint proj; GLint invert_y; GLint tex; GLint alpha; GLint pos_attrib; GLint tex_attrib; }; struct wlr_gles2_renderer { struct wlr_renderer wlr_renderer; float projection[9]; struct wlr_egl *egl; int drm_fd; const char *exts_str; struct { bool read_format_bgra_ext; bool debug_khr; bool egl_image_external_oes; bool egl_image_oes; } exts; struct { PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR; PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR; PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR; PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES; } procs; struct { struct { GLuint program; GLint proj; GLint color; GLint pos_attrib; } quad; struct wlr_gles2_tex_shader tex_rgba; struct wlr_gles2_tex_shader tex_rgbx; struct wlr_gles2_tex_shader tex_ext; } shaders; struct wl_list buffers; // wlr_gles2_buffer.link struct wl_list textures; // wlr_gles2_texture.link struct wlr_gles2_buffer *current_buffer; uint32_t viewport_width, viewport_height; }; struct wlr_gles2_buffer { struct wlr_buffer *buffer; struct wlr_gles2_renderer *renderer; struct wl_list link; // wlr_gles2_renderer.buffers EGLImageKHR image; GLuint rbo; GLuint fbo; struct wl_listener buffer_destroy; }; struct wlr_gles2_texture { struct wlr_texture wlr_texture; struct wlr_gles2_renderer *renderer; struct wl_list link; // wlr_gles2_renderer.textures // Basically: // GL_TEXTURE_2D == mutable // GL_TEXTURE_EXTERNAL_OES == immutable GLenum target; GLuint tex; EGLImageKHR image; bool inverted_y; bool has_alpha; // Only affects target == GL_TEXTURE_2D uint32_t drm_format; // used to interpret upload data // If imported from a wlr_buffer struct wlr_buffer *buffer; struct wl_listener buffer_destroy; }; const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt); const struct wlr_gles2_pixel_format *get_gles2_format_from_gl( GLint gl_format, GLint gl_type, bool alpha); const uint32_t *get_gles2_shm_formats(size_t *len); struct wlr_gles2_renderer *gles2_get_renderer( struct wlr_renderer *wlr_renderer); struct wlr_gles2_texture *gles2_get_texture( struct wlr_texture *wlr_texture); struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer, uint32_t fmt, uint32_t stride, uint32_t width, uint32_t height, const void *data); struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer, struct wl_resource *data); struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer, struct wlr_dmabuf_attributes *attribs); struct wlr_texture *gles2_texture_from_buffer(struct wlr_renderer *wlr_renderer, struct wlr_buffer *buffer); void push_gles2_debug_(struct wlr_gles2_renderer *renderer, const char *file, const char *func); #define push_gles2_debug(renderer) push_gles2_debug_(renderer, _WLR_FILENAME, __func__) void pop_gles2_debug(struct wlr_gles2_renderer *renderer); #endif