1
0
Fork 0

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:
nobled 2011-01-31 03:07:37 +00:00
parent 15cd4705db
commit d4ccef786b
2 changed files with 50 additions and 18 deletions

View file

@ -86,12 +86,13 @@ get_visual (struct wl_display *display, CoglPixelFormat format)
}
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 ();
ClutterStageWaylandWaylandBuffer *buffer;
struct wl_visual *visual;
EGLint name, stride;
ClutterStageWaylandWaylandBufferDRM *buffer;
EGLint image_attribs[] = {
EGL_WIDTH, 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_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[3] = geom->height;
@ -113,25 +112,39 @@ wayland_create_buffer (ClutterGeometry *geom)
glBindTexture (GL_TEXTURE_2D, buffer->texture);
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,
geom->width,
geom->height,
0,
0,
VISUAL_ARGB_PRE);
buffer->offscreen = cogl_offscreen_new_to_texture (buffer->tex);
backend_wayland->export_drm_image (edpy, buffer->drm_image,
&name, NULL, &stride);
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,
name,
geom->width,
geom->height,
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.y = geom->y;
rect.width = geom->width;
@ -142,18 +155,29 @@ wayland_create_buffer (ClutterGeometry *geom)
}
static void
wayland_free_buffer (ClutterStageWaylandWaylandBuffer *buffer)
wayland_free_drm_buffer (ClutterStageWaylandWaylandBuffer *generic_buffer)
{
ClutterBackend *backend = clutter_get_default_backend ();
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
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);
wl_buffer_destroy (buffer->wayland_buffer);
cogl_handle_unref (buffer->offscreen);
glDeleteTextures (1, &buffer->texture);
backend_wayland->destroy_image (edpy, buffer->drm_image);
g_slice_free (ClutterStageWaylandWaylandBuffer, buffer);
if (buffer->type == BUFFER_TYPE_DRM)
wayland_free_drm_buffer(buffer);
}
static void

View file

@ -51,16 +51,24 @@
typedef struct _ClutterStageWayland ClutterStageWayland;
typedef struct _ClutterStageWaylandClass ClutterStageWaylandClass;
#define BUFFER_TYPE_DRM 1
typedef struct _ClutterStageWaylandWaylandBuffer
{
EGLImageKHR drm_image;
GLuint texture;
CoglHandle offscreen;
struct wl_buffer *wayland_buffer;
cairo_region_t *dirty_region;
CoglHandle tex;
guint8 type;
} ClutterStageWaylandWaylandBuffer;
typedef struct _ClutterStageWaylandWaylandBufferDRM
{
ClutterStageWaylandWaylandBuffer buffer;
EGLImageKHR drm_image;
GLuint texture;
} ClutterStageWaylandWaylandBufferDRM;
struct _ClutterStageWayland
{
GObject parent_instance;