1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.11
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2011 Benjamin Franzke <benjaminfranzke@googlemail.com>
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h>
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/mman.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/sw_winsys.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <wayland-client.h>
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "wayland_sw_winsys.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct wayland_sw_displaytarget
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int fd;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned size;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned width;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned height;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned stride;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *map;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned map_count;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct wayland_sw_winsys
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct sw_winsys base;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wl_display *display;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct wayland_sw_displaytarget *
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_sw_displaytarget(struct sw_displaytarget *dt)
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct wayland_sw_displaytarget *) dt;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct wayland_sw_winsys *
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_sw_winsys(struct sw_winsys *ws)
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct wayland_sw_winsys *) ws;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_display(struct sw_winsys *ws,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct sw_displaytarget *dt,
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              void *context_private)
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_unmap(struct sw_winsys *ws,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct sw_displaytarget *dt)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt = wayland_sw_displaytarget(dt);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map_count--;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (wldt->map_count > 0)
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   munmap(wldt->map, wldt->size);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map = NULL;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_map(struct sw_winsys *ws,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct sw_displaytarget *dt,
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned flags)
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt = wayland_sw_displaytarget(dt);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint mmap_flags = 0;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (wldt->map) {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wldt->map_count++;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return wldt->map;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flags & PIPE_TRANSFER_READ)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mmap_flags |= PROT_READ;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flags & PIPE_TRANSFER_WRITE)
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mmap_flags |= PROT_WRITE;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map = mmap(NULL, wldt->size, mmap_flags,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    MAP_SHARED, wldt->fd, 0);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (wldt->map == MAP_FAILED)
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map_count = 1;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return wldt->map;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_destroy(struct sw_winsys *ws,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct sw_displaytarget *dt)
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt = wayland_sw_displaytarget(dt);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (wldt->map)
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wayland_displaytarget_unmap(ws, dt);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(wldt);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_is_displaytarget_format_supported(struct sw_winsys *ws,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          unsigned tex_usage,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          enum pipe_format format)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8X8_UNORM:
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8A8_UNORM:
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct sw_displaytarget *
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_create(struct sw_winsys *ws,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned tex_usage,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             enum pipe_format format,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned width, unsigned height,
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned alignment,
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned *stride)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nblocksy, format_stride;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char filename[] = "/tmp/wayland-shm-XXXXXX";
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wayland_is_displaytarget_format_supported(ws, tex_usage, format))
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt = CALLOC_STRUCT(wayland_sw_displaytarget);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wldt)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map = NULL;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->format = format;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->width = width;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->height = height;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_stride = util_format_get_stride(format, width);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->stride = align(format_stride, alignment);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nblocksy = util_format_get_nblocksy(format, height);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->size = wldt->stride * nblocksy;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->fd = mkstemp(filename);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (wldt->fd < 0) {
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(wldt);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ftruncate(wldt->fd, wldt->size) < 0) {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unlink(filename);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      close(wldt->fd);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(wldt);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unlink(filename);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *stride = wldt->stride;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct sw_displaytarget *) wldt;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct sw_displaytarget *
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_from_handle(struct sw_winsys *ws,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const struct pipe_resource *templet,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  struct winsys_handle *whandle,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned *stride)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nblocksy;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wayland_is_displaytarget_format_supported(ws, 0, templet->format))
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt = CALLOC_STRUCT(wayland_sw_displaytarget);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wldt)
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->fd = whandle->fd;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->stride = whandle->stride;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->width = templet->width0;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->height = templet->height0;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->format = templet->format;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nblocksy = util_format_get_nblocksy(wldt->format, wldt->height);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->size = wldt->stride * nblocksy;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wldt->map = NULL;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *stride = wldt->stride;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct sw_displaytarget *) wldt;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_displaytarget_get_handle(struct sw_winsys *ws,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct sw_displaytarget *dt,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct winsys_handle *whandle)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_displaytarget *wldt = wayland_sw_displaytarget(dt);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   whandle->fd = wldt->fd;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   whandle->stride = wldt->stride;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   whandle->size = wldt->size;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_destroy(struct sw_winsys *ws)
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_winsys *wayland = wayland_sw_winsys(ws);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(wayland);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct sw_winsys *
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_create_sw_winsys(struct wl_display *display)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_sw_winsys *wlws;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws = CALLOC_STRUCT(wayland_sw_winsys);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wlws)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->display = display;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.destroy = wayland_destroy;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.is_displaytarget_format_supported =
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wayland_is_displaytarget_format_supported;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_create = wayland_displaytarget_create;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_from_handle = wayland_displaytarget_from_handle;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_get_handle = wayland_displaytarget_get_handle;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_destroy = wayland_displaytarget_destroy;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_map = wayland_displaytarget_map;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_unmap = wayland_displaytarget_unmap;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wlws->base.displaytarget_display = wayland_displaytarget_display;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &wlws->base;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=3 ts=8 sts=3 expandtab: */
287