dri3_screen.c revision 35c4bbdf
1/* 2 * Copyright © 2013 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that copyright 7 * notice and this permission notice appear in supporting documentation, and 8 * that the name of the copyright holders not be used in advertising or 9 * publicity pertaining to distribution of the software without specific, 10 * written prior permission. The copyright holders make no representations 11 * about the suitability of this software for any purpose. It is provided "as 12 * is" without express or implied warranty. 13 * 14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 * OF THIS SOFTWARE. 21 */ 22 23#ifdef HAVE_XORG_CONFIG_H 24#include <xorg-config.h> 25#endif 26 27#include "dri3_priv.h" 28#include <syncsdk.h> 29#include <misync.h> 30#include <misyncshm.h> 31#include <randrstr.h> 32 33static inline Bool has_open(dri3_screen_info_ptr info) { 34 if (info == NULL) 35 return FALSE; 36 37 return info->open != NULL || 38 (info->version >= 1 && info->open_client != NULL); 39} 40 41int 42dri3_open(ClientPtr client, ScreenPtr screen, RRProviderPtr provider, int *fd) 43{ 44 dri3_screen_priv_ptr ds = dri3_screen_priv(screen); 45 dri3_screen_info_ptr info = ds->info; 46 int rc; 47 48 if (!has_open(info)) 49 return BadMatch; 50 51 if (info->version >= 1 && info->open_client != NULL) 52 rc = (*info->open_client) (client, screen, provider, fd); 53 else 54 rc = (*info->open) (screen, provider, fd); 55 56 if (rc != Success) 57 return rc; 58 59 return Success; 60} 61 62int 63dri3_pixmap_from_fd(PixmapPtr *ppixmap, ScreenPtr screen, int fd, 64 CARD16 width, CARD16 height, CARD16 stride, CARD8 depth, CARD8 bpp) 65{ 66 dri3_screen_priv_ptr ds = dri3_screen_priv(screen); 67 dri3_screen_info_ptr info = ds->info; 68 PixmapPtr pixmap; 69 70 if (!info || !info->pixmap_from_fd) 71 return BadImplementation; 72 73 pixmap = (*info->pixmap_from_fd) (screen, fd, width, height, stride, depth, bpp); 74 if (!pixmap) 75 return BadAlloc; 76 77 *ppixmap = pixmap; 78 return Success; 79} 80 81int 82dri3_fd_from_pixmap(int *pfd, PixmapPtr pixmap, CARD16 *stride, CARD32 *size) 83{ 84 ScreenPtr screen = pixmap->drawable.pScreen; 85 dri3_screen_priv_ptr ds = dri3_screen_priv(screen); 86 dri3_screen_info_ptr info = ds->info; 87 int fd; 88 89 if (!info || !info->fd_from_pixmap) 90 return BadImplementation; 91 92 fd = (*info->fd_from_pixmap)(screen, pixmap, stride, size); 93 if (fd < 0) 94 return BadAlloc; 95 *pfd = fd; 96 return Success; 97} 98 99