diff --git a/src/compositor/meta-multi-texture-format-private.h b/src/compositor/meta-multi-texture-format-private.h index f17db98b4..13bcb4e6a 100644 --- a/src/compositor/meta-multi-texture-format-private.h +++ b/src/compositor/meta-multi-texture-format-private.h @@ -25,19 +25,20 @@ G_BEGIN_DECLS +typedef struct _MetaMultiTextureFormatInfo +{ + uint8_t n_planes; + + /* Per plane-information */ + CoglPixelFormat subformats[COGL_PIXEL_FORMAT_MAX_PLANES]; /* influences how we deal with it on a GL level */ + uint8_t plane_indices[COGL_PIXEL_FORMAT_MAX_PLANES]; /* source plane */ + uint8_t hsub[COGL_PIXEL_FORMAT_MAX_PLANES]; /* horizontal subsampling */ + uint8_t vsub[COGL_PIXEL_FORMAT_MAX_PLANES]; /* vertical subsampling */ +} MetaMultiTextureFormatInfo; + const char * meta_multi_texture_format_to_string (MetaMultiTextureFormat format); -int meta_multi_texture_format_get_n_planes (MetaMultiTextureFormat format); - -void meta_multi_texture_format_get_subformats (MetaMultiTextureFormat format, - CoglPixelFormat *formats_out); - -void meta_multi_texture_format_get_plane_indices (MetaMultiTextureFormat format, - uint8_t *plane_indices); - -void meta_multi_texture_format_get_subsampling_factors (MetaMultiTextureFormat format, - uint8_t *horizontal_factors, - uint8_t *vertical_factors); +const MetaMultiTextureFormatInfo * meta_multi_texture_format_get_info (MetaMultiTextureFormat format); gboolean meta_multi_texture_format_get_snippets (MetaMultiTextureFormat format, CoglSnippet **fragment_globals_snippet, diff --git a/src/compositor/meta-multi-texture-format.c b/src/compositor/meta-multi-texture-format.c index e5f8511bb..39048baeb 100644 --- a/src/compositor/meta-multi-texture-format.c +++ b/src/compositor/meta-multi-texture-format.c @@ -79,82 +79,86 @@ static const char y_u_v_shader[] = "yuva.z = texture2D(cogl_sampler2, cogl_tex_coord2_in.st).x; \n" "cogl_color_out = yuv_to_rgb(yuva); \n"; -typedef struct _MetaMultiTextureFormatInfo +typedef struct _MetaMultiTextureFormatFullInfo { - MetaMultiTextureFormat multi_format; + MetaMultiTextureFormatInfo info; + + /* Name */ const char *name; - uint8_t n_planes; - - /* Per plane-information */ - CoglPixelFormat subformats[COGL_PIXEL_FORMAT_MAX_PLANES]; /* influences how we deal with it on a GL level */ - uint8_t plane_indices[COGL_PIXEL_FORMAT_MAX_PLANES]; /* source plane */ - uint8_t hsub[COGL_PIXEL_FORMAT_MAX_PLANES]; /* horizontal subsampling */ - uint8_t vsub[COGL_PIXEL_FORMAT_MAX_PLANES]; /* vertical subsampling */ - - /* Shaders */ - const char *rgb_shader; /* Shader to convert to RGBA (or NULL) */ - + /* Shader to convert to RGBA (or NULL) */ + const char *rgb_shader; + /* Cached snippet */ GOnce snippet_once; -} MetaMultiTextureFormatInfo; +} MetaMultiTextureFormatFullInfo; /* NOTE: The actual enum values are used as the index, so you don't need to * loop over the table */ -static MetaMultiTextureFormatInfo multi_format_table[] = { +static MetaMultiTextureFormatFullInfo multi_format_table[] = { /* Invalid */ [META_MULTI_TEXTURE_FORMAT_INVALID] = {}, /* Simple */ [META_MULTI_TEXTURE_FORMAT_SIMPLE] = { .name = "", - .n_planes = 1, - .subformats = { COGL_PIXEL_FORMAT_ANY }, - .plane_indices = { 0 }, - .hsub = { 1 }, - .vsub = { 1 }, .rgb_shader = rgba_shader, .snippet_once = G_ONCE_INIT, + .info = { + .n_planes = 1, + .subformats = { COGL_PIXEL_FORMAT_ANY }, + .plane_indices = { 0 }, + .hsub = { 1 }, + .vsub = { 1 }, + }, }, /* Packed YUV */ [META_MULTI_TEXTURE_FORMAT_YUYV] = { .name = "YUYV", - .n_planes = 2, - .subformats = { COGL_PIXEL_FORMAT_RG_88, COGL_PIXEL_FORMAT_BGRA_8888_PRE }, - .plane_indices = { 0, 0 }, - .hsub = { 1, 2 }, - .vsub = { 1, 1 }, .rgb_shader = y_xuxv_shader, .snippet_once = G_ONCE_INIT, + .info = { + .n_planes = 2, + .subformats = { COGL_PIXEL_FORMAT_RG_88, COGL_PIXEL_FORMAT_BGRA_8888_PRE }, + .plane_indices = { 0, 0 }, + .hsub = { 1, 2 }, + .vsub = { 1, 1 }, + }, }, /* 2 plane YUV */ [META_MULTI_TEXTURE_FORMAT_NV12] = { .name = "NV12", - .n_planes = 2, - .subformats = { COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_RG_88 }, - .plane_indices = { 0, 1 }, - .hsub = { 1, 2 }, - .vsub = { 1, 2 }, .rgb_shader = y_uv_shader, .snippet_once = G_ONCE_INIT, + .info = { + .n_planes = 2, + .subformats = { COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_RG_88 }, + .plane_indices = { 0, 1 }, + .hsub = { 1, 2 }, + .vsub = { 1, 2 }, + }, }, [META_MULTI_TEXTURE_FORMAT_P010] = { .name = "P010", - .n_planes = 2, - .subformats = { COGL_PIXEL_FORMAT_R_16, COGL_PIXEL_FORMAT_RG_1616 }, - .plane_indices = { 0, 1 }, - .hsub = { 1, 2 }, - .vsub = { 1, 2 }, .rgb_shader = y_uv_shader, .snippet_once = G_ONCE_INIT, + .info = { + .n_planes = 2, + .subformats = { COGL_PIXEL_FORMAT_R_16, COGL_PIXEL_FORMAT_RG_1616 }, + .plane_indices = { 0, 1 }, + .hsub = { 1, 2 }, + .vsub = { 1, 2 }, + }, }, /* 3 plane YUV */ [META_MULTI_TEXTURE_FORMAT_YUV420] = { .name = "YUV420", - .n_planes = 3, - .subformats = { COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_R_8 }, - .plane_indices = { 0, 1, 2 }, - .hsub = { 1, 2, 2 }, - .vsub = { 1, 2, 2 }, .rgb_shader = y_u_v_shader, .snippet_once = G_ONCE_INIT, + .info = { + .n_planes = 3, + .subformats = { COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_R_8, COGL_PIXEL_FORMAT_R_8 }, + .plane_indices = { 0, 1, 2 }, + .hsub = { 1, 2, 2 }, + .vsub = { 1, 2, 2 }, + }, }, }; @@ -166,52 +170,12 @@ meta_multi_texture_format_to_string (MetaMultiTextureFormat format) return multi_format_table[format].name; } -int -meta_multi_texture_format_get_n_planes (MetaMultiTextureFormat format) +const MetaMultiTextureFormatInfo * +meta_multi_texture_format_get_info (MetaMultiTextureFormat format) { - g_return_val_if_fail (format < G_N_ELEMENTS (multi_format_table), 0); + g_return_val_if_fail (format < G_N_ELEMENTS (multi_format_table), NULL); - return multi_format_table[format].n_planes; -} - -void -meta_multi_texture_format_get_subformats (MetaMultiTextureFormat format, - CoglPixelFormat *formats_out) -{ - size_t i; - - g_return_if_fail (format < G_N_ELEMENTS (multi_format_table)); - - for (i = 0; i < multi_format_table[format].n_planes; i++) - formats_out[i] = multi_format_table[format].subformats[i]; -} - -void -meta_multi_texture_format_get_plane_indices (MetaMultiTextureFormat format, - uint8_t *plane_indices) -{ - size_t i; - - g_return_if_fail (format < G_N_ELEMENTS (multi_format_table)); - - for (i = 0; i < multi_format_table[format].n_planes; i++) - plane_indices[i] = multi_format_table[format].plane_indices[i]; -} - -void -meta_multi_texture_format_get_subsampling_factors (MetaMultiTextureFormat format, - uint8_t *horizontal_factors, - uint8_t *vertical_factors) -{ - size_t i; - - g_return_if_fail (format < G_N_ELEMENTS (multi_format_table)); - - for (i = 0; i < multi_format_table[format].n_planes; i++) - { - horizontal_factors[i] = multi_format_table[format].hsub[i]; - vertical_factors[i] = multi_format_table[format].vsub[i]; - } + return &multi_format_table[format].info; } static gpointer diff --git a/src/wayland/meta-wayland-dma-buf.c b/src/wayland/meta-wayland-dma-buf.c index d1f540e90..434bce8e9 100644 --- a/src/wayland/meta-wayland-dma-buf.c +++ b/src/wayland/meta-wayland-dma-buf.c @@ -437,21 +437,14 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer, { CoglTexture **textures; g_autoptr (GPtrArray) planes = NULL; - CoglPixelFormat subformats[META_WAYLAND_DMA_BUF_MAX_FDS]; - uint8_t horizontal_factors[META_WAYLAND_DMA_BUF_MAX_FDS]; - uint8_t vertical_factors[META_WAYLAND_DMA_BUF_MAX_FDS]; - uint8_t plane_indices[META_WAYLAND_DMA_BUF_MAX_FDS]; int n_planes, i; + const MetaMultiTextureFormatInfo *mt_format_info; - n_planes = meta_multi_texture_format_get_n_planes (multi_format); + mt_format_info = meta_multi_texture_format_get_info (multi_format); + n_planes = mt_format_info->n_planes; /* Each EGLImage is a plane in the final CoglMultiPlaneTexture */ planes = g_ptr_array_new_full (n_planes, g_object_unref); - meta_multi_texture_format_get_subformats (multi_format, subformats); - meta_multi_texture_format_get_plane_indices (multi_format, plane_indices); - meta_multi_texture_format_get_subsampling_factors (multi_format, - horizontal_factors, - vertical_factors); for (i = 0; i < n_planes; i++) { @@ -459,21 +452,22 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer, CoglEglImageFlags flags; CoglTexture *cogl_texture; uint32_t drm_format = 0; - int plane_index; const MetaFormatInfo *format_info; + int plane_index = mt_format_info->plane_indices[i]; + CoglPixelFormat subformat = mt_format_info->subformats[i]; + int horizontal_factor = mt_format_info->hsub[i]; + int vertical_factor = mt_format_info->vsub[i]; - format_info = meta_format_info_from_cogl_format (subformats[i]); + format_info = meta_format_info_from_cogl_format (subformat); g_return_val_if_fail (format_info != NULL, FALSE); drm_format = format_info->drm_format; - plane_index = plane_indices[i]; - egl_image = meta_egl_create_dmabuf_image (egl, egl_display, dma_buf->width / - horizontal_factors[i], + horizontal_factor, dma_buf->height / - vertical_factors[i], + vertical_factor, drm_format, 1, &dma_buf->fds[plane_index], @@ -488,7 +482,7 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer, cogl_texture = cogl_egl_texture_2d_new_from_image (cogl_context, dma_buf->width, dma_buf->height, - subformats[i], + subformat, egl_image, flags, error);