mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
cogl: Include DRM 4CC conversions into CoglPixelFormat
This is at the moment still part of both MetaRendererNative and MetaDmaBuf, which means duplicated effort in code sections only barely related to color formats. By doing this, we can keep more of the pixel format code together, which is more future-proof as we want to add support for new pixel formats (like YUV-based ones). https://gitlab.gnome.org/GNOME/mutter/merge_requests/594
This commit is contained in:
parent
a2c545c321
commit
eb2405f0f4
@ -29,6 +29,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cogl-config.h"
|
#include "cogl-config.h"
|
||||||
|
#include "cogl-defines.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@ -308,3 +309,66 @@ cogl_pixel_format_to_string (CoglPixelFormat format)
|
|||||||
|
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_LIBDRM
|
||||||
|
|
||||||
|
typedef struct _PixelFormatMap {
|
||||||
|
uint32_t drm_format;
|
||||||
|
CoglPixelFormat cogl_format;
|
||||||
|
CoglTextureComponents cogl_components;
|
||||||
|
} PixelFormatMap;
|
||||||
|
|
||||||
|
static const PixelFormatMap pixel_format_map[] = {
|
||||||
|
/* DRM formats are defined as little-endian, not machine endian. */
|
||||||
|
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||||
|
{ DRM_FORMAT_RGB565, COGL_PIXEL_FORMAT_RGB_565, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_ABGR8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_XBGR8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_ARGB8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_XRGB8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_BGRA8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_BGRX8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_RGBA8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_RGBX8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
||||||
|
/* DRM_FORMAT_RGB565 cannot be expressed. */
|
||||||
|
{ DRM_FORMAT_ABGR8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_XBGR8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_ARGB8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_XRGB8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_BGRA8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_BGRX8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
{ DRM_FORMAT_RGBA8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
||||||
|
{ DRM_FORMAT_RGBX8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
||||||
|
#else
|
||||||
|
#error "unexpected G_BYTE_ORDER"
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
||||||
|
CoglPixelFormat *out_format,
|
||||||
|
CoglTextureComponents *out_components)
|
||||||
|
{
|
||||||
|
const size_t n = G_N_ELEMENTS (pixel_format_map);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
if (pixel_format_map[i].drm_format == drm_format)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == n)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (out_format)
|
||||||
|
*out_format = pixel_format_map[i].cogl_format;
|
||||||
|
|
||||||
|
if (out_components)
|
||||||
|
*out_components = pixel_format_map[i].cogl_components;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -38,6 +38,10 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_LIBDRM
|
||||||
|
#include <drm_fourcc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cogl/cogl-defines.h>
|
#include <cogl/cogl-defines.h>
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
@ -58,6 +62,9 @@ G_BEGIN_DECLS
|
|||||||
*
|
*
|
||||||
* Other examples of factors that can influence the layout in memory are the
|
* Other examples of factors that can influence the layout in memory are the
|
||||||
* system's endianness.
|
* system's endianness.
|
||||||
|
*
|
||||||
|
* This file also contains methods to map Linux DRM 4CC codes to
|
||||||
|
* CoglPixelFormats.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define COGL_A_BIT (1 << 4)
|
#define COGL_A_BIT (1 << 4)
|
||||||
@ -295,6 +302,34 @@ _cogl_pixel_format_is_endian_dependant (CoglPixelFormat format);
|
|||||||
const char *
|
const char *
|
||||||
cogl_pixel_format_to_string (CoglPixelFormat format);
|
cogl_pixel_format_to_string (CoglPixelFormat format);
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_LIBDRM
|
||||||
|
|
||||||
|
/* added in libdrm 2.4.95 */
|
||||||
|
#ifndef DRM_FORMAT_INVALID
|
||||||
|
#define DRM_FORMAT_INVALID 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_pixel_format_from_drm_format:
|
||||||
|
* @drm_format: The DRM 4CC code (as specified in drm_fourcc.h)
|
||||||
|
* @out_format: (optional): The corresponding #CoglPixelFormat (if successful)
|
||||||
|
* @out_components: (optional): The corresponding #CoglTextureComponents (if
|
||||||
|
* sucessful)
|
||||||
|
*
|
||||||
|
* Does an internal lookup to find a #CoglPixelFormat that matches the given
|
||||||
|
* DRM 4CC code. If no such format could be found, this function will return
|
||||||
|
* %FALSE and the output parameters will stay untouched.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if a #CoglPixelFormat corresponding to the 4CC code exists,
|
||||||
|
* %FALSE otherwise.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
||||||
|
CoglPixelFormat *out_format,
|
||||||
|
CoglTextureComponents *out_components);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __COGL_PIXEL_FORMAT_H__ */
|
#endif /* __COGL_PIXEL_FORMAT_H__ */
|
||||||
|
@ -12,6 +12,9 @@ cdata.set('COGL_HAS_X11', have_x11)
|
|||||||
cdata.set('COGL_HAS_X11_SUPPORT', have_x11)
|
cdata.set('COGL_HAS_X11_SUPPORT', have_x11)
|
||||||
cdata.set('COGL_HAS_XLIB', have_x11)
|
cdata.set('COGL_HAS_XLIB', have_x11)
|
||||||
cdata.set('COGL_HAS_XLIB_SUPPORT', have_x11)
|
cdata.set('COGL_HAS_XLIB_SUPPORT', have_x11)
|
||||||
|
if have_native_backend
|
||||||
|
cdata.set('COGL_HAS_LIBDRM', libdrm_dep.found())
|
||||||
|
endif
|
||||||
|
|
||||||
cogl_defines_h = configure_file(
|
cogl_defines_h = configure_file(
|
||||||
input: 'cogl-defines.h.meson',
|
input: 'cogl-defines.h.meson',
|
||||||
|
@ -73,11 +73,6 @@
|
|||||||
#define EGL_DRM_MASTER_FD_EXT 0x333C
|
#define EGL_DRM_MASTER_FD_EXT 0x333C
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* added in libdrm 2.4.95 */
|
|
||||||
#ifndef DRM_FORMAT_INVALID
|
|
||||||
#define DRM_FORMAT_INVALID 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
@ -252,11 +247,6 @@ static void
|
|||||||
free_next_secondary_bo (MetaGpuKms *gpu_kms,
|
free_next_secondary_bo (MetaGpuKms *gpu_kms,
|
||||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state);
|
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state);
|
||||||
|
|
||||||
static gboolean
|
|
||||||
cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
|
||||||
CoglPixelFormat *out_format,
|
|
||||||
CoglTextureComponents *out_components);
|
|
||||||
|
|
||||||
static MetaBackend *
|
static MetaBackend *
|
||||||
backend_from_renderer_native (MetaRendererNative *renderer_native)
|
backend_from_renderer_native (MetaRendererNative *renderer_native)
|
||||||
{
|
{
|
||||||
@ -2126,65 +2116,6 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _PixelFormatMap {
|
|
||||||
uint32_t drm_format;
|
|
||||||
CoglPixelFormat cogl_format;
|
|
||||||
CoglTextureComponents cogl_components;
|
|
||||||
} PixelFormatMap;
|
|
||||||
|
|
||||||
static const PixelFormatMap pixel_format_map[] = {
|
|
||||||
/* DRM formats are defined as little-endian, not machine endian. */
|
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
||||||
{ DRM_FORMAT_RGB565, COGL_PIXEL_FORMAT_RGB_565, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_ABGR8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_XBGR8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_ARGB8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_XRGB8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_BGRA8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_BGRX8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_RGBA8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_RGBX8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
/* DRM_FORMAT_RGB565 cannot be expressed. */
|
|
||||||
{ DRM_FORMAT_ABGR8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_XBGR8888, COGL_PIXEL_FORMAT_ABGR_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_ARGB8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_XRGB8888, COGL_PIXEL_FORMAT_ARGB_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_BGRA8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_BGRX8888, COGL_PIXEL_FORMAT_BGRA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
{ DRM_FORMAT_RGBA8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGBA },
|
|
||||||
{ DRM_FORMAT_RGBX8888, COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_TEXTURE_COMPONENTS_RGB },
|
|
||||||
#else
|
|
||||||
#error "unexpected G_BYTE_ORDER"
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
|
||||||
CoglPixelFormat *out_format,
|
|
||||||
CoglTextureComponents *out_components)
|
|
||||||
{
|
|
||||||
const size_t n = G_N_ELEMENTS (pixel_format_map);
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
if (pixel_format_map[i].drm_format == drm_format)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == n)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (out_format)
|
|
||||||
*out_format = pixel_format_map[i].cogl_format;
|
|
||||||
|
|
||||||
if (out_components)
|
|
||||||
*out_components = pixel_format_map[i].cogl_components;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_shared_framebuffer_cpu (CoglOnscreen *onscreen,
|
copy_shared_framebuffer_cpu (CoglOnscreen *onscreen,
|
||||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state,
|
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state,
|
||||||
|
@ -43,10 +43,6 @@
|
|||||||
|
|
||||||
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
||||||
|
|
||||||
#ifndef DRM_FORMAT_MOD_INVALID
|
|
||||||
#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define META_WAYLAND_DMA_BUF_MAX_FDS 4
|
#define META_WAYLAND_DMA_BUF_MAX_FDS 4
|
||||||
|
|
||||||
struct _MetaWaylandDmaBufBuffer
|
struct _MetaWaylandDmaBufBuffer
|
||||||
@ -84,28 +80,15 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
|
|||||||
if (buffer->dma_buf.texture)
|
if (buffer->dma_buf.texture)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
switch (dma_buf->drm_format)
|
/*
|
||||||
|
* NOTE: The cogl_format here is only used for texture color channel
|
||||||
|
* swizzling as compared to COGL_PIXEL_FORMAT_ARGB. It is *not* used
|
||||||
|
* for accessing the buffer memory. EGL will access the buffer
|
||||||
|
* memory according to the DRM fourcc code. Cogl will not mmap
|
||||||
|
* and access the buffer memory at all.
|
||||||
|
*/
|
||||||
|
if (!cogl_pixel_format_from_drm_format (dma_buf->drm_format, &cogl_format, NULL))
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* NOTE: The cogl_format here is only used for texture color channel
|
|
||||||
* swizzling as compared to COGL_PIXEL_FORMAT_ARGB. It is *not* used
|
|
||||||
* for accessing the buffer memory. EGL will access the buffer
|
|
||||||
* memory according to the DRM fourcc code. Cogl will not mmap
|
|
||||||
* and access the buffer memory at all.
|
|
||||||
*/
|
|
||||||
case DRM_FORMAT_XRGB8888:
|
|
||||||
cogl_format = COGL_PIXEL_FORMAT_RGB_888;
|
|
||||||
break;
|
|
||||||
case DRM_FORMAT_ARGB8888:
|
|
||||||
cogl_format = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
|
|
||||||
break;
|
|
||||||
case DRM_FORMAT_ARGB2101010:
|
|
||||||
cogl_format = COGL_PIXEL_FORMAT_ARGB_2101010_PRE;
|
|
||||||
break;
|
|
||||||
case DRM_FORMAT_RGB565:
|
|
||||||
cogl_format = COGL_PIXEL_FORMAT_RGB_565;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_set_error (error, G_IO_ERROR,
|
g_set_error (error, G_IO_ERROR,
|
||||||
G_IO_ERROR_FAILED,
|
G_IO_ERROR_FAILED,
|
||||||
"Unsupported buffer format %d", dma_buf->drm_format);
|
"Unsupported buffer format %d", dma_buf->drm_format);
|
||||||
|
Loading…
Reference in New Issue
Block a user