| 
									
										
										
										
											2024-02-06 11:54:29 +01:00
										 |  |  | #define _POSIX_C_SOURCE 199309L
 | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  | #include <drm_fourcc.h>
 | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | #include <GLES2/gl2.h>
 | 
					
						
							|  |  |  | #include <GLES2/gl2ext.h>
 | 
					
						
							|  |  |  | #include "render/gles2.h"
 | 
					
						
							| 
									
										
										
										
											2023-06-23 17:24:38 -04:00
										 |  |  | #include "render/pixel_format.h"
 | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-23 22:06:54 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  |  * The DRM formats are little endian while the GL formats are big endian, | 
					
						
							|  |  |  |  * so DRM_FORMAT_ARGB8888 is actually compatible with GL_BGRA_EXT. | 
					
						
							| 
									
										
										
										
											2018-10-31 17:20:27 +01:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-04-25 23:24:58 +01:00
										 |  |  | static const struct wlr_gles2_pixel_format formats[] = { | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  | 		.drm_format = DRM_FORMAT_ARGB8888, | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 		.gl_format = GL_BGRA_EXT, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_BYTE, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  | 		.drm_format = DRM_FORMAT_XRGB8888, | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 		.gl_format = GL_BGRA_EXT, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_BYTE, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  | 		.drm_format = DRM_FORMAT_XBGR8888, | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_BYTE, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2021-02-16 19:12:04 +01:00
										 |  |  | 		.drm_format = DRM_FORMAT_ABGR8888, | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_BYTE, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2021-07-29 08:05:43 +02:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_BGR888, | 
					
						
							|  |  |  | 		.gl_format = GL_RGB, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_BYTE, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | #if WLR_LITTLE_ENDIAN
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_RGBX4444, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT_4_4_4_4, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_RGBA4444, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT_4_4_4_4, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_RGBX5551, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT_5_5_5_1, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_RGBA5551, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT_5_5_5_1, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_RGB565, | 
					
						
							|  |  |  | 		.gl_format = GL_RGB, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT_5_6_5, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2021-07-29 23:55:57 -04:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_XBGR2101010, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_ABGR2101010, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_XBGR16161616F, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_HALF_FLOAT_OES, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_ABGR16161616F, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_HALF_FLOAT_OES, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2022-04-30 22:43:49 -04:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_XBGR16161616, | 
					
						
							|  |  |  | 		.gl_internalformat = GL_RGBA16_EXT, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.drm_format = DRM_FORMAT_ABGR16161616, | 
					
						
							|  |  |  | 		.gl_internalformat = GL_RGBA16_EXT, | 
					
						
							|  |  |  | 		.gl_format = GL_RGBA, | 
					
						
							|  |  |  | 		.gl_type = GL_UNSIGNED_SHORT, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2021-07-29 08:05:43 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-03-21 08:50:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | // TODO: more pixel formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 00:16:59 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Return true if supported for texturing, even if other operations like | 
					
						
							|  |  |  |  * reading aren't supported. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer, | 
					
						
							|  |  |  | 		const struct wlr_gles2_pixel_format *format) { | 
					
						
							| 
									
										
										
										
											2021-07-29 23:55:57 -04:00
										 |  |  | 	if (format->gl_type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT | 
					
						
							|  |  |  | 			&& !renderer->exts.EXT_texture_type_2_10_10_10_REV) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (format->gl_type == GL_HALF_FLOAT_OES | 
					
						
							|  |  |  | 			&& !renderer->exts.OES_texture_half_float_linear) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-04-30 22:43:49 -04:00
										 |  |  | 	if (format->gl_type == GL_UNSIGNED_SHORT | 
					
						
							|  |  |  | 			&& !renderer->exts.EXT_texture_norm16) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-01-05 00:16:59 -08:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Note that we don't need to check for GL_EXT_texture_format_BGRA8888 | 
					
						
							|  |  |  | 	 * here, since we've already checked if we have it at renderer creation | 
					
						
							|  |  |  | 	 * time and bailed out if not. We do the check there because Wayland | 
					
						
							|  |  |  | 	 * requires all compositors to support SHM buffers in that format. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 19:17:18 +01:00
										 |  |  | const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt) { | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 	for (size_t i = 0; i < sizeof(formats) / sizeof(*formats); ++i) { | 
					
						
							| 
									
										
										
										
											2021-02-16 19:17:18 +01:00
										 |  |  | 		if (formats[i].drm_format == fmt) { | 
					
						
							| 
									
										
										
										
											2017-06-23 14:25:55 -04:00
										 |  |  | 			return &formats[i]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-03-21 08:50:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-31 17:20:27 +01:00
										 |  |  | const struct wlr_gles2_pixel_format *get_gles2_format_from_gl( | 
					
						
							|  |  |  | 		GLint gl_format, GLint gl_type, bool alpha) { | 
					
						
							|  |  |  | 	for (size_t i = 0; i < sizeof(formats) / sizeof(*formats); ++i) { | 
					
						
							| 
									
										
										
										
											2023-06-23 17:24:38 -04:00
										 |  |  | 		if (formats[i].gl_format != gl_format || | 
					
						
							|  |  |  | 				formats[i].gl_type != gl_type) { | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 14:15:00 -05:00
										 |  |  | 		if (pixel_format_has_alpha(formats[i].drm_format) != alpha) { | 
					
						
							| 
									
										
										
										
											2023-06-23 17:24:38 -04:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2018-10-31 17:20:27 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-06-23 17:24:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return &formats[i]; | 
					
						
							| 
									
										
										
										
											2018-10-31 17:20:27 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | const uint32_t *get_gles2_shm_formats(const struct wlr_gles2_renderer *renderer, | 
					
						
							|  |  |  | 		size_t *len) { | 
					
						
							| 
									
										
										
										
											2021-02-16 19:20:00 +01:00
										 |  |  | 	static uint32_t shm_formats[sizeof(formats) / sizeof(formats[0])]; | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | 	size_t j = 0; | 
					
						
							| 
									
										
										
										
											2020-03-09 11:26:56 +01:00
										 |  |  | 	for (size_t i = 0; i < sizeof(formats) / sizeof(formats[0]); i++) { | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | 		if (!is_gles2_pixel_format_supported(renderer, &formats[i])) { | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		shm_formats[j++] = formats[i].drm_format; | 
					
						
							| 
									
										
										
										
											2020-03-09 11:26:56 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-07-29 23:53:22 -04:00
										 |  |  | 	*len = j; | 
					
						
							| 
									
										
										
										
											2021-02-16 19:20:00 +01:00
										 |  |  | 	return shm_formats; | 
					
						
							| 
									
										
										
										
											2018-03-21 08:50:59 +01:00
										 |  |  | } |