Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
scenefx/include/render/fx_renderer/fx_renderer.h (6K)
1 #ifndef _FX_OPENGL_H
2 #define _FX_OPENGL_H
3
4 #include <GLES2/gl2.h>
5 #include <scenefx/render/fx_renderer/fx_renderer.h>
6 #include <stdbool.h>
7 #include <time.h>
8 #include <wlr/render/egl.h>
9 #include <wlr/render/interface.h>
10 #include <wlr/render/swapchain.h>
11 #include <wlr/render/wlr_texture.h>
12 #include <wlr/util/addon.h>
13 #include <wlr/util/box.h>
14
15 #include "render/fx_renderer/shaders.h"
16 #include "render/tracy.h"
17
18 struct fx_framebuffer;
19
20 struct fx_pixel_format {
21 uint32_t drm_format;
22 // optional field, if empty then internalformat = format
23 GLint gl_internalformat;
24 GLint gl_format, gl_type;
25 };
26
27 bool is_fx_pixel_format_supported(const struct fx_renderer *renderer, const struct fx_pixel_format *format);
28 const struct fx_pixel_format *get_fx_format_from_drm(uint32_t fmt);
29 const struct fx_pixel_format *get_fx_format_from_gl(GLint gl_format, GLint gl_type, bool alpha);
30 void get_fx_shm_formats(const struct fx_renderer *renderer, struct wlr_drm_format_set *out);
31
32 GLuint fx_framebuffer_get_fbo(struct fx_framebuffer *buffer);
33
34 ///
35 /// fx_framebuffer
36 ///
37
38 struct fx_framebuffer {
39 struct wlr_buffer *buffer;
40 struct fx_renderer *renderer;
41 struct wl_list link; // fx_renderer.buffers
42 bool external_only;
43
44 EGLImageKHR image;
45 GLuint rbo;
46 GLuint fbo;
47 GLuint tex;
48 GLuint sb; // Stencil
49
50 struct wlr_addon addon;
51 };
52
53 /**
54 * Should only be used with custom fbs.
55 * Note: Does not bind back to the default Framebuffer!
56 */
57 void fx_framebuffer_get_or_create_custom(struct fx_renderer *fx_renderer,
58 struct wlr_allocator *allocator, int width, int height, bool has_alpha,
59 struct fx_framebuffer **fx_buffer, bool *failed);
60
61 struct fx_framebuffer *fx_framebuffer_get_or_create(struct fx_renderer *renderer,
62 struct wlr_buffer *wlr_buffer);
63
64 void fx_framebuffer_bind(struct fx_framebuffer *buffer);
65
66 /**
67 * Destroy the fx_framebuffer.
68 * Note: Doesn't drop the wlr_buffer, so should only be used internally.
69 */
70 void fx_framebuffer_destroy(struct fx_framebuffer *buffer);
71
72 ///
73 /// fx_texture
74 ///
75
76 struct fx_texture {
77 struct wlr_texture wlr_texture;
78 struct fx_renderer *fx_renderer;
79 struct wl_list link; // fx_renderer.textures
80
81 GLuint target;
82
83 // If this texture is imported from a buffer, the texture is does not own
84 // these states. These cannot be destroyed along with the texture in this
85 // case.
86 GLuint tex;
87 GLuint fbo;
88
89 bool has_alpha;
90
91 uint32_t drm_format; // for mutable textures only, used to interpret upload data
92 struct fx_framebuffer *buffer; // for DMA-BUF imports only
93 };
94
95 struct fx_texture *fx_get_texture(struct wlr_texture *wlr_texture);
96
97 void fx_texture_destroy(struct fx_texture *texture);
98
99 bool wlr_texture_is_fx(struct wlr_texture *wlr_texture);
100
101 bool wlr_renderer_is_fx(struct wlr_renderer *wlr_renderer);
102
103 struct fx_render_timer *fx_get_render_timer(struct wlr_render_timer *timer);
104
105 struct fx_texture *fx_get_texture(struct wlr_texture *wlr_texture);
106
107 struct wlr_renderer *fx_renderer_create_egl(struct wlr_egl *egl);
108
109 struct wlr_egl *wlr_fx_renderer_get_egl(struct wlr_renderer *renderer);
110
111 void push_fx_debug_(struct fx_renderer *renderer, const char *file, const char *func);
112
113 #define push_fx_debug(renderer) push_fx_debug_(renderer, _WLR_FILENAME, __func__)
114
115 void pop_fx_debug(struct fx_renderer *renderer);
116
117 ///
118 /// Render Timer
119 ///
120
121 struct fx_render_timer {
122 struct wlr_render_timer base;
123 struct fx_renderer *renderer;
124 struct timespec cpu_start;
125 struct timespec cpu_end;
126 GLuint id;
127 GLint64 gl_cpu_end;
128 };
129
130 bool wlr_render_timer_is_fx(struct wlr_render_timer *timer);
131
132 ///
133 /// fx_renderer
134 ///
135
136 /**
137 * OpenGL ES 2 renderer.
138 *
139 * Care must be taken to avoid stepping each other's toes with EGL contexts:
140 * the current EGL is global state. The GLES2 renderer operations will save
141 * and restore any previous EGL context when called. A render pass is seen as
142 * a single operation.
143 *
144 * The GLES2 renderer doesn't support arbitrarily nested render passes. It
145 * supports a subset only: after a nested render pass is created, any parent
146 * render pass can't be used before the nested render pass is submitted.
147 */
148
149 struct fx_renderer {
150 struct wlr_renderer wlr_renderer;
151
152 struct wlr_egl *egl;
153 int drm_fd;
154
155 struct wlr_drm_format_set shm_texture_formats;
156
157 const char *exts_str;
158 struct {
159 bool EXT_read_format_bgra;
160 bool KHR_debug;
161 bool OES_egl_image_external;
162 bool OES_egl_image;
163 bool EXT_texture_type_2_10_10_10_REV;
164 bool OES_texture_half_float_linear;
165 bool EXT_texture_norm16;
166 bool EXT_disjoint_timer_query;
167 } exts;
168
169 struct {
170 PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
171 PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR;
172 PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR;
173 PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
174 PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
175 PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES;
176 PFNGLGETGRAPHICSRESETSTATUSKHRPROC glGetGraphicsResetStatusKHR;
177 PFNGLGENQUERIESEXTPROC glGenQueriesEXT;
178 PFNGLDELETEQUERIESEXTPROC glDeleteQueriesEXT;
179 PFNGLQUERYCOUNTEREXTPROC glQueryCounterEXT;
180 PFNGLGETQUERYOBJECTIVEXTPROC glGetQueryObjectivEXT;
181 PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64vEXT;
182 PFNGLGETINTEGER64VEXTPROC glGetInteger64vEXT;
183 TRACY_FN(
184 PFNGLGETQUERYIVEXTPROC glGetQueryivEXT;
185 )
186 } procs;
187
188 struct {
189 struct quad_shader quad;
190 struct quad_shader quad_clip;
191 struct quad_grad_shader quad_grad;
192 struct quad_round_shader quad_round;
193 struct quad_grad_round_shader quad_grad_round;
194
195 struct tex_shader tex_rgba;
196 struct tex_shader tex_rgbx;
197 struct tex_shader tex_ext;
198 struct tex_shader tex_effects_rgba;
199 struct tex_shader tex_effects_rgbx;
200 struct tex_shader tex_effects_ext;
201
202 struct box_shadow_shader box_shadow;
203 struct bevel_shader bevel;
204 struct frame_shader frame;
205 struct droplet_shader droplet;
206 struct blur_shader blur1;
207 struct blur_shader blur2;
208 struct blur_effects_shader blur_effects;
209 } shaders;
210
211 struct wl_list buffers; // fx_framebuffer.link
212 struct wl_list textures; // fx_texture.link
213 struct wl_list offscreen_buffers; // fx_offscreen_buffers.link
214
215 TRACY_FN(
216 struct tracy_data *tracy_data;
217 )
218 };
219
220 #endif