gl-renderer: Add APPLE_texture_packed_float support to utilities

APPLE_texture_packed_float allows OpenGL ES 2 implementations to
support GL_R11F_G11F_B10F and GL_RGB9_A5 texture formats.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-09-19 16:26:02 +02:00 committed by Daniel Stone
parent 58494e5ba2
commit e72d7d963d
3 changed files with 21 additions and 4 deletions

View file

@ -121,6 +121,7 @@ enum egl_display_extension_flag {
/* 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_EXT_COLOR_BUFFER_FLOAT = 1ull << 5,
EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT = 1ull << 6,
EXTENSION_EXT_DISJOINT_TIMER_QUERY = 1ull << 7,

View file

@ -279,6 +279,7 @@ struct timeline_render_point {
/* Keep in sync with gl-renderer-internal.h. */
static const struct gl_extension_table extension_table[] = {
EXT("GL_ANGLE_pack_reverse_row_order", EXTENSION_ANGLE_PACK_REVERSE_ROW_ORDER),
EXT("GL_APPLE_texture_packed_float", EXTENSION_APPLE_TEXTURE_PACKED_FLOAT),
EXT("GL_EXT_color_buffer_float", EXTENSION_EXT_COLOR_BUFFER_FLOAT),
EXT("GL_EXT_color_buffer_half_float", EXTENSION_EXT_COLOR_BUFFER_HALF_FLOAT),
EXT("GL_EXT_disjoint_timer_query", EXTENSION_EXT_DISJOINT_TIMER_QUERY),

View file

@ -436,7 +436,11 @@ is_valid_combination_es2(struct gl_renderer *gr,
return true;
case GL_UNSIGNED_INT_10F_11F_11F_REV:
return gl_extensions_has(gr, EXTENSION_NV_PACKED_FLOAT);
return gl_extensions_has(gr, EXTENSION_NV_PACKED_FLOAT) ||
gl_extensions_has(gr, EXTENSION_APPLE_TEXTURE_PACKED_FLOAT);
case GL_UNSIGNED_INT_5_9_9_9_REV:
return gl_extensions_has(gr, EXTENSION_APPLE_TEXTURE_PACKED_FLOAT);
case GL_HALF_FLOAT_OES:
return gl_extensions_has(gr, EXTENSION_OES_TEXTURE_HALF_FLOAT);
@ -505,7 +509,12 @@ gl_texture_is_format_supported(struct gl_renderer *gr,
case GL_R11F_G11F_B10F:
return gr->gl_version >= gl_version(3, 0) ||
gl_extensions_has(gr, EXTENSION_NV_PACKED_FLOAT);
gl_extensions_has(gr, EXTENSION_NV_PACKED_FLOAT) ||
gl_extensions_has(gr, EXTENSION_APPLE_TEXTURE_PACKED_FLOAT);
case GL_RGB9_E5:
return gr->gl_version >= gl_version(3, 0) ||
gl_extensions_has(gr, EXTENSION_APPLE_TEXTURE_PACKED_FLOAT);
case GL_R8I:
case GL_R8UI:
@ -528,7 +537,6 @@ gl_texture_is_format_supported(struct gl_renderer *gr,
case GL_RGB16UI:
case GL_RGB32I:
case GL_RGB32UI:
case GL_RGB9_E5:
case GL_SRGB8:
case GL_RGBA8I:
case GL_RGBA8UI:
@ -558,7 +566,7 @@ gl_texture_is_format_supported(struct gl_renderer *gr,
* Implementations support at least this subset of formats: GL_R8, GL_RG8,
* GL_RGB8, GL_RGB565, GL_RGBA8, GL_RGBA4 and GL_RGB5_A1. Additional formats are
* supported depending on extensions: GL_R16F, GL_RG16F, GL_RGB16F, GL_RGBA16F,
* GL_R32F, GL_RG32F, GL_RGB32F, GL_RGBA32F and GL_R11F_G11F_B10F.
* GL_R32F, GL_RG32F, GL_RGB32F, GL_RGBA32F, GL_R11F_G11F_B10F and GL_RGB9_E5.
*
* This is implemented by implicitly converting 'format' into an external
* format. If the red and red-green texture formats aren't supported
@ -693,6 +701,11 @@ gl_texture_2d_init(struct gl_renderer *gr,
type = GL_UNSIGNED_INT_10F_11F_11F_REV;
break;
case GL_RGB9_E5:
format = GL_RGB;
type = GL_UNSIGNED_INT_5_9_9_9_REV;
break;
case GL_RGBA8:
format = GL_RGBA;
type = GL_UNSIGNED_BYTE;
@ -753,6 +766,8 @@ gl_texture_2d_init(struct gl_renderer *gr,
* GL_RGB565 GL_RGB GL_UNSIGNED_BYTE
* GL_R11F_G11F_B10F GL_RGB GL_HALF_FLOAT,
* GL_FLOAT
* GL_RGB9_E5 GL_RGB GL_HALF_FLOAT,
* GL_FLOAT
* GL_RGBA4 GL_RGBA GL_UNSIGNED_BYTE
* GL_RGB5_A1 GL_RGBA GL_UNSIGNED_BYTE,
* GL_UNSIGNED_INT_2_10_10_10_REV