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