Use struct buffer from cairo-util.c in flower.c.
authorKristian Høgsberg <krh@redhat.com>
Wed, 26 Nov 2008 03:53:28 +0000 (22:53 -0500)
committerKristian Høgsberg <krh@redhat.com>
Wed, 26 Nov 2008 03:53:28 +0000 (22:53 -0500)
Makefile
flower.c

index 9999cfc..22b1930 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -43,7 +43,7 @@ glx-compositor.so : $(glx_compositor_objs)
 libwayland.so $(compositors) :
        gcc -o $@ $^ $(LDLIBS) -shared 
 
-flower_objs = flower.o wayland-glib.o
+flower_objs = flower.o wayland-glib.o cairo-util.o
 pointer_objs = pointer.o wayland-glib.o cairo-util.o
 background_objs = background.o wayland-glib.o
 window_objs = window.o gears.o wayland-glib.o cairo-util.o
index 2536c5e..e6c2e27 100644 (file)
--- a/flower.c
+++ b/flower.c
 
 #include "wayland-client.h"
 #include "wayland-glib.h"
+#include "cairo-util.h"
 
 static const char gem_device[] = "/dev/dri/card0";
 static const char socket_name[] = "\0wayland";
 
-static uint32_t name_cairo_surface(int fd, cairo_surface_t *surface)
-{
-       struct drm_i915_gem_create create;
-       struct drm_gem_flink flink;
-       struct drm_i915_gem_pwrite pwrite;
-       int32_t width, height, stride;
-       void *data;
-
-       width = cairo_image_surface_get_width(surface);
-       height = cairo_image_surface_get_height(surface);
-       stride = cairo_image_surface_get_stride(surface);
-       data = cairo_image_surface_get_data(surface);
-
-       memset(&create, 0, sizeof(create));
-       create.size = height * stride;
-
-       if (ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) != 0) {
-               fprintf(stderr, "gem create failed: %m\n");
-               return 0;
-       }
-
-       pwrite.handle = create.handle;
-       pwrite.offset = 0;
-       pwrite.size = height * stride;
-       pwrite.data_ptr = (uint64_t) (uintptr_t) data;
-       if (ioctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite) < 0) {
-               fprintf(stderr, "gem pwrite failed: %m\n");
-               return 0;
-       }
-
-       flink.handle = create.handle;
-       if (ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink) != 0) {
-               fprintf(stderr, "gem flink failed: %m\n");
-               return 0;
-       }
-
-#if 0
-       /* We need to hold on to the handle until the server has received
-        * the attach request... we probably need a confirmation event.
-        * I guess the breadcrumb idea will suffice. */
-       struct drm_gem_close close;
-       close.handle = create.handle;
-       if (ioctl(fd, DRM_IOCTL_GEM_CLOSE, &close) < 0) {
-               fprintf(stderr, "gem close failed: %m\n");
-               return 0;
-       }
-#endif
-
-       return flink.name;
-}
-
 static void
 set_random_color(cairo_t *cr)
 {
@@ -155,12 +105,12 @@ int main(int argc, char *argv[])
 {
        struct wl_display *display;
        int fd;
-       uint32_t name;
        cairo_surface_t *s;
        struct timespec ts;
        GMainLoop *loop;
        GSource *source;
        struct flower flower;
+       struct buffer *buffer;
 
        fd = open(gem_device, O_RDWR);
        if (fd < 0) {
@@ -190,10 +140,10 @@ int main(int argc, char *argv[])
        flower.i = ts.tv_nsec;
 
        s = draw_stuff(flower.width, flower.height);
-       name = name_cairo_surface(fd, s);
+       buffer = buffer_create_from_cairo_surface(fd, s);
 
-       wl_surface_attach(flower.surface, name, flower.width, flower.height,
-                         cairo_image_surface_get_stride(s));
+       wl_surface_attach(flower.surface, buffer->name, flower.width, flower.height,
+                         buffer->stride);
 
        g_timeout_add(20, move_flower, &flower);