mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-10 13:29:48 -05:00
Use struct buffer from cairo-util.c in flower.c.
This commit is contained in:
parent
73c305851d
commit
18fb78307b
2 changed files with 6 additions and 56 deletions
2
Makefile
2
Makefile
|
|
@ -43,7 +43,7 @@ glx-compositor.so : $(glx_compositor_objs)
|
||||||
libwayland.so $(compositors) :
|
libwayland.so $(compositors) :
|
||||||
gcc -o $@ $^ $(LDLIBS) -shared
|
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
|
pointer_objs = pointer.o wayland-glib.o cairo-util.o
|
||||||
background_objs = background.o wayland-glib.o
|
background_objs = background.o wayland-glib.o
|
||||||
window_objs = window.o gears.o wayland-glib.o cairo-util.o
|
window_objs = window.o gears.o wayland-glib.o cairo-util.o
|
||||||
|
|
|
||||||
60
flower.c
60
flower.c
|
|
@ -14,61 +14,11 @@
|
||||||
|
|
||||||
#include "wayland-client.h"
|
#include "wayland-client.h"
|
||||||
#include "wayland-glib.h"
|
#include "wayland-glib.h"
|
||||||
|
#include "cairo-util.h"
|
||||||
|
|
||||||
static const char gem_device[] = "/dev/dri/card0";
|
static const char gem_device[] = "/dev/dri/card0";
|
||||||
static const char socket_name[] = "\0wayland";
|
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
|
static void
|
||||||
set_random_color(cairo_t *cr)
|
set_random_color(cairo_t *cr)
|
||||||
{
|
{
|
||||||
|
|
@ -155,12 +105,12 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct wl_display *display;
|
struct wl_display *display;
|
||||||
int fd;
|
int fd;
|
||||||
uint32_t name;
|
|
||||||
cairo_surface_t *s;
|
cairo_surface_t *s;
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
GSource *source;
|
GSource *source;
|
||||||
struct flower flower;
|
struct flower flower;
|
||||||
|
struct buffer *buffer;
|
||||||
|
|
||||||
fd = open(gem_device, O_RDWR);
|
fd = open(gem_device, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
|
|
@ -190,10 +140,10 @@ int main(int argc, char *argv[])
|
||||||
flower.i = ts.tv_nsec;
|
flower.i = ts.tv_nsec;
|
||||||
|
|
||||||
s = draw_stuff(flower.width, flower.height);
|
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,
|
wl_surface_attach(flower.surface, buffer->name, flower.width, flower.height,
|
||||||
cairo_image_surface_get_stride(s));
|
buffer->stride);
|
||||||
|
|
||||||
g_timeout_add(20, move_flower, &flower);
|
g_timeout_add(20, move_flower, &flower);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue