blob: 3356fc4acb274a93f668bcdb53682fba7dd11c9e [file] [log] [blame]
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -04001#include <stdint.h>
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -04002#include <stdio.h>
Kristian Høgsberga67a71a2008-10-07 10:10:36 -04003#include <stdlib.h>
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -04004#include <string.h>
Kristian Høgsberga67a71a2008-10-07 10:10:36 -04005#include <i915_drm.h>
6#include <sys/ioctl.h>
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -05007#include <time.h>
Kristian Høgsberga67a71a2008-10-07 10:10:36 -04008#include <fcntl.h>
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -04009#include <unistd.h>
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040010#include <math.h>
Kristian Høgsberga234e702008-10-11 22:13:51 -040011#include <time.h>
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040012#include <cairo.h>
Kristian Høgsbergfb590842008-11-07 14:27:23 -050013#include <glib.h>
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -040014
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040015#include "wayland-client.h"
Kristian Høgsbergfb590842008-11-07 14:27:23 -050016#include "wayland-glib.h"
Kristian Høgsberg18fb7832008-11-25 22:53:28 -050017#include "cairo-util.h"
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040018
19static const char gem_device[] = "/dev/dri/card0";
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -040020static const char socket_name[] = "\0wayland";
21
Kristian Høgsberga234e702008-10-11 22:13:51 -040022static void
23set_random_color(cairo_t *cr)
24{
25 cairo_set_source_rgba(cr,
Kristian Høgsbergd311e8a2008-10-12 22:58:40 -040026 0.5 + (random() % 50) / 49.0,
27 0.5 + (random() % 50) / 49.0,
28 0.5 + (random() % 50) / 49.0,
29 0.5 + (random() % 100) / 99.0);
Kristian Høgsberga234e702008-10-11 22:13:51 -040030}
31
32
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040033static void *
34draw_stuff(int width, int height)
35{
Kristian Høgsberga234e702008-10-11 22:13:51 -040036 const int petal_count = 3 + random() % 5;
37 const double r1 = 60 + random() % 35;
38 const double r2 = 20 + random() % 40;
39 const double u = (10 + random() % 90) / 100.0;
40 const double v = (random() % 90) / 100.0;
41
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040042 cairo_surface_t *surface;
43 cairo_t *cr;
Kristian Høgsberga234e702008-10-11 22:13:51 -040044 int i;
45 double t, dt = 2 * M_PI / (petal_count * 2);
46 double x1, y1, x2, y2, x3, y3;
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040047
48 surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
49 width, height);
50
51 cr = cairo_create(surface);
Kristian Høgsberga234e702008-10-11 22:13:51 -040052 cairo_translate(cr, width / 2, height / 2);
53 cairo_move_to(cr, cos(t) * r1, sin(t) * r1);
54 for (t = 0, i = 0; i < petal_count; i++, t += dt * 2) {
55 x1 = cos(t) * r1;
56 y1 = sin(t) * r1;
57 x2 = cos(t + dt) * r2;
58 y2 = sin(t + dt) * r2;
59 x3 = cos(t + 2 * dt) * r1;
60 y3 = sin(t + 2 * dt) * r1;
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040061
Kristian Høgsberga234e702008-10-11 22:13:51 -040062 cairo_curve_to(cr,
63 x1 - y1 * u, y1 + x1 * u,
64 x2 + y2 * v, y2 - x2 * v,
65 x2, y2);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040066
Kristian Høgsberga234e702008-10-11 22:13:51 -040067 cairo_curve_to(cr,
68 x2 - y2 * v, y2 + x2 * v,
69 x3 + y3 * u, y3 - x3 * u,
70 x3, y3);
71 }
72
73 cairo_close_path(cr);
74 set_random_color(cr);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040075 cairo_fill_preserve(cr);
Kristian Høgsberga234e702008-10-11 22:13:51 -040076 set_random_color(cr);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -040077 cairo_stroke(cr);
78
79 cairo_destroy(cr);
80
81 return surface;
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -040082}
83
Kristian Høgsbergfb590842008-11-07 14:27:23 -050084struct flower {
Kristian Høgsberg44f36e32008-11-26 12:57:31 -050085 struct wl_display *display;
Kristian Høgsbergfb590842008-11-07 14:27:23 -050086 struct wl_surface *surface;
87 int i;
88 int x, y, width, height;
89};
90
Kristian Høgsberg44f36e32008-11-26 12:57:31 -050091static void
92move_flower(struct flower *flower)
Kristian Høgsberg427524a2008-10-08 13:32:07 -040093{
Kristian Høgsbergfb590842008-11-07 14:27:23 -050094 wl_surface_map(flower->surface,
95 flower->x + cos(flower->i / 31.0) * 400 - flower->width / 2,
96 flower->y + sin(flower->i / 27.0) * 300 - flower->height / 2,
97 flower->width, flower->height);
98 flower->i++;
Kristian Høgsberg44f36e32008-11-26 12:57:31 -050099 wl_display_commit(flower->display, 0);
100}
Kristian Høgsberg427524a2008-10-08 13:32:07 -0400101
Kristian Høgsberg44f36e32008-11-26 12:57:31 -0500102static void
103event_handler(struct wl_display *display,
104 uint32_t object, uint32_t opcode,
105 uint32_t size, uint32_t *p, void *data)
106{
107 if (object == 1)
108 move_flower(data);
Kristian Høgsberg427524a2008-10-08 13:32:07 -0400109}
110
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -0400111int main(int argc, char *argv[])
112{
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400113 struct wl_display *display;
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500114 int fd;
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400115 cairo_surface_t *s;
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -0500116 struct timespec ts;
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500117 GMainLoop *loop;
118 GSource *source;
119 struct flower flower;
Kristian Høgsberg18fb7832008-11-25 22:53:28 -0500120 struct buffer *buffer;
Kristian Høgsberga234e702008-10-11 22:13:51 -0400121
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400122 fd = open(gem_device, O_RDWR);
123 if (fd < 0) {
124 fprintf(stderr, "drm open failed: %m\n");
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -0400125 return -1;
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400126 }
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -0400127
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500128 loop = g_main_loop_new(NULL, FALSE);
129
130 display = wl_display_create(socket_name);
Kristian Høgsberg427524a2008-10-08 13:32:07 -0400131 if (display == NULL) {
132 fprintf(stderr, "failed to create display: %m\n");
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -0400133 return -1;
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400134 }
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400135
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500136 source = wayland_source_new(display);
137 g_source_attach(source, NULL);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400138
Kristian Høgsberg44f36e32008-11-26 12:57:31 -0500139 flower.display = display;
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500140 flower.x = 512;
141 flower.y = 384;
142 flower.width = 200;
143 flower.height = 200;
144 flower.surface = wl_display_create_surface(display);
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -0500145
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -0500146 clock_gettime(CLOCK_MONOTONIC, &ts);
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -0500147 srandom(ts.tv_nsec);
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500148 flower.i = ts.tv_nsec;
Kristian Høgsbergd3fa34c2008-11-02 15:28:22 -0500149
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500150 s = draw_stuff(flower.width, flower.height);
Kristian Høgsberg18fb7832008-11-25 22:53:28 -0500151 buffer = buffer_create_from_cairo_surface(fd, s);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400152
Kristian Høgsberg18fb7832008-11-25 22:53:28 -0500153 wl_surface_attach(flower.surface, buffer->name, flower.width, flower.height,
154 buffer->stride);
Kristian Høgsberg44f36e32008-11-26 12:57:31 -0500155 wl_display_set_event_handler(display, event_handler, &flower);
156 move_flower(&flower);
Kristian Høgsberga67a71a2008-10-07 10:10:36 -0400157
Kristian Høgsbergfb590842008-11-07 14:27:23 -0500158 g_main_loop_run(loop);
Kristian Høgsberg97f1ebe2008-09-30 09:46:10 -0400159
160 return 0;
161}