mirror of
https://github.com/brl/mutter.git
synced 2025-02-09 18:04:09 +00:00
wayland: make buffer handling generic
Separate the code specific to DRM buffers into its own functions/subclass to prepare for adding SHM buffers.
This commit is contained in:
parent
15cd4705db
commit
d4ccef786b
@ -86,12 +86,13 @@ get_visual (struct wl_display *display, CoglPixelFormat format)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ClutterStageWaylandWaylandBuffer *
|
static ClutterStageWaylandWaylandBuffer *
|
||||||
wayland_create_buffer (ClutterGeometry *geom)
|
wayland_create_drm_buffer (ClutterBackendWayland *backend_wayland,
|
||||||
|
ClutterGeometry *geom)
|
||||||
{
|
{
|
||||||
ClutterBackend *backend = clutter_get_default_backend ();
|
|
||||||
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
|
||||||
EGLDisplay edpy = clutter_wayland_get_egl_display ();
|
EGLDisplay edpy = clutter_wayland_get_egl_display ();
|
||||||
ClutterStageWaylandWaylandBuffer *buffer;
|
struct wl_visual *visual;
|
||||||
|
EGLint name, stride;
|
||||||
|
ClutterStageWaylandWaylandBufferDRM *buffer;
|
||||||
EGLint image_attribs[] = {
|
EGLint image_attribs[] = {
|
||||||
EGL_WIDTH, 0,
|
EGL_WIDTH, 0,
|
||||||
EGL_HEIGHT, 0,
|
EGL_HEIGHT, 0,
|
||||||
@ -99,12 +100,10 @@ wayland_create_buffer (ClutterGeometry *geom)
|
|||||||
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA,
|
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
struct wl_visual *visual;
|
|
||||||
EGLint name;
|
|
||||||
EGLint stride;
|
|
||||||
cairo_rectangle_int_t rect;
|
|
||||||
|
|
||||||
buffer = g_slice_new (ClutterStageWaylandWaylandBuffer);
|
buffer = g_slice_new (ClutterStageWaylandWaylandBufferDRM);
|
||||||
|
|
||||||
|
buffer->buffer.type = BUFFER_TYPE_DRM;
|
||||||
|
|
||||||
image_attribs[1] = geom->width;
|
image_attribs[1] = geom->width;
|
||||||
image_attribs[3] = geom->height;
|
image_attribs[3] = geom->height;
|
||||||
@ -113,25 +112,39 @@ wayland_create_buffer (ClutterGeometry *geom)
|
|||||||
glBindTexture (GL_TEXTURE_2D, buffer->texture);
|
glBindTexture (GL_TEXTURE_2D, buffer->texture);
|
||||||
backend_wayland->image_target_texture_2d (GL_TEXTURE_2D, buffer->drm_image);
|
backend_wayland->image_target_texture_2d (GL_TEXTURE_2D, buffer->drm_image);
|
||||||
|
|
||||||
buffer->tex = cogl_texture_new_from_foreign (buffer->texture,
|
buffer->buffer.tex = cogl_texture_new_from_foreign (buffer->texture,
|
||||||
GL_TEXTURE_2D,
|
GL_TEXTURE_2D,
|
||||||
geom->width,
|
geom->width,
|
||||||
geom->height,
|
geom->height,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
VISUAL_ARGB_PRE);
|
VISUAL_ARGB_PRE);
|
||||||
buffer->offscreen = cogl_offscreen_new_to_texture (buffer->tex);
|
|
||||||
|
|
||||||
backend_wayland->export_drm_image (edpy, buffer->drm_image,
|
backend_wayland->export_drm_image (edpy, buffer->drm_image,
|
||||||
&name, NULL, &stride);
|
&name, NULL, &stride);
|
||||||
visual = get_visual (backend_wayland->wayland_display, VISUAL_ARGB_PRE);
|
visual = get_visual (backend_wayland->wayland_display, VISUAL_ARGB_PRE);
|
||||||
buffer->wayland_buffer =
|
buffer->buffer.wayland_buffer =
|
||||||
wl_drm_create_buffer (backend_wayland->wayland_drm,
|
wl_drm_create_buffer (backend_wayland->wayland_drm,
|
||||||
name,
|
name,
|
||||||
geom->width,
|
geom->width,
|
||||||
geom->height,
|
geom->height,
|
||||||
stride, visual);
|
stride, visual);
|
||||||
|
|
||||||
|
return &buffer->buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ClutterStageWaylandWaylandBuffer *
|
||||||
|
wayland_create_buffer (ClutterGeometry *geom)
|
||||||
|
{
|
||||||
|
ClutterBackend *backend = clutter_get_default_backend ();
|
||||||
|
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
||||||
|
ClutterStageWaylandWaylandBuffer *buffer;
|
||||||
|
cairo_rectangle_int_t rect;
|
||||||
|
|
||||||
|
buffer = wayland_create_drm_buffer (backend_wayland, geom);
|
||||||
|
|
||||||
|
buffer->offscreen = cogl_offscreen_new_to_texture (buffer->tex);
|
||||||
|
|
||||||
rect.x = geom->x;
|
rect.x = geom->x;
|
||||||
rect.y = geom->y;
|
rect.y = geom->y;
|
||||||
rect.width = geom->width;
|
rect.width = geom->width;
|
||||||
@ -142,18 +155,29 @@ wayland_create_buffer (ClutterGeometry *geom)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wayland_free_buffer (ClutterStageWaylandWaylandBuffer *buffer)
|
wayland_free_drm_buffer (ClutterStageWaylandWaylandBuffer *generic_buffer)
|
||||||
{
|
{
|
||||||
ClutterBackend *backend = clutter_get_default_backend ();
|
ClutterBackend *backend = clutter_get_default_backend ();
|
||||||
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
||||||
EGLDisplay edpy = clutter_wayland_get_egl_display ();
|
EGLDisplay edpy = clutter_wayland_get_egl_display ();
|
||||||
|
ClutterStageWaylandWaylandBufferDRM *buffer;
|
||||||
|
|
||||||
|
buffer = (ClutterStageWaylandWaylandBufferDRM *)generic_buffer;
|
||||||
|
|
||||||
|
glDeleteTextures (1, &buffer->texture);
|
||||||
|
backend_wayland->destroy_image (edpy, buffer->drm_image);
|
||||||
|
g_slice_free (ClutterStageWaylandWaylandBufferDRM, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wayland_free_buffer (ClutterStageWaylandWaylandBuffer *buffer)
|
||||||
|
{
|
||||||
cogl_handle_unref (buffer->tex);
|
cogl_handle_unref (buffer->tex);
|
||||||
wl_buffer_destroy (buffer->wayland_buffer);
|
wl_buffer_destroy (buffer->wayland_buffer);
|
||||||
cogl_handle_unref (buffer->offscreen);
|
cogl_handle_unref (buffer->offscreen);
|
||||||
glDeleteTextures (1, &buffer->texture);
|
|
||||||
backend_wayland->destroy_image (edpy, buffer->drm_image);
|
if (buffer->type == BUFFER_TYPE_DRM)
|
||||||
g_slice_free (ClutterStageWaylandWaylandBuffer, buffer);
|
wayland_free_drm_buffer(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -51,16 +51,24 @@
|
|||||||
typedef struct _ClutterStageWayland ClutterStageWayland;
|
typedef struct _ClutterStageWayland ClutterStageWayland;
|
||||||
typedef struct _ClutterStageWaylandClass ClutterStageWaylandClass;
|
typedef struct _ClutterStageWaylandClass ClutterStageWaylandClass;
|
||||||
|
|
||||||
|
#define BUFFER_TYPE_DRM 1
|
||||||
|
|
||||||
typedef struct _ClutterStageWaylandWaylandBuffer
|
typedef struct _ClutterStageWaylandWaylandBuffer
|
||||||
{
|
{
|
||||||
EGLImageKHR drm_image;
|
|
||||||
GLuint texture;
|
|
||||||
CoglHandle offscreen;
|
CoglHandle offscreen;
|
||||||
struct wl_buffer *wayland_buffer;
|
struct wl_buffer *wayland_buffer;
|
||||||
cairo_region_t *dirty_region;
|
cairo_region_t *dirty_region;
|
||||||
CoglHandle tex;
|
CoglHandle tex;
|
||||||
|
guint8 type;
|
||||||
} ClutterStageWaylandWaylandBuffer;
|
} ClutterStageWaylandWaylandBuffer;
|
||||||
|
|
||||||
|
typedef struct _ClutterStageWaylandWaylandBufferDRM
|
||||||
|
{
|
||||||
|
ClutterStageWaylandWaylandBuffer buffer;
|
||||||
|
EGLImageKHR drm_image;
|
||||||
|
GLuint texture;
|
||||||
|
} ClutterStageWaylandWaylandBufferDRM;
|
||||||
|
|
||||||
struct _ClutterStageWayland
|
struct _ClutterStageWayland
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user