git.lucas.co / cce-compositor
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