wayland_sw_winsys.c revision aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1
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; 246aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 247aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke return TRUE; 248aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke} 249aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 250aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkestatic void 251aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkewayland_destroy(struct sw_winsys *ws) 252aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke{ 253aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke struct wayland_sw_winsys *wayland = wayland_sw_winsys(ws); 254aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 255aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke FREE(wayland); 256aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke} 257aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 258aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkestruct sw_winsys * 259aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkewayland_create_sw_winsys(struct wl_display *display) 260aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke{ 261aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke struct wayland_sw_winsys *wlws; 262aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 263aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws = CALLOC_STRUCT(wayland_sw_winsys); 264aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke if (!wlws) 265aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke return NULL; 266aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 267aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->display = display; 268aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 269aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.destroy = wayland_destroy; 270aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.is_displaytarget_format_supported = 271aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wayland_is_displaytarget_format_supported; 272aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 273aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_create = wayland_displaytarget_create; 274aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_from_handle = wayland_displaytarget_from_handle; 275aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_get_handle = wayland_displaytarget_get_handle; 276aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_destroy = wayland_displaytarget_destroy; 277aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_map = wayland_displaytarget_map; 278aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_unmap = wayland_displaytarget_unmap; 279aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 280aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke wlws->base.displaytarget_display = wayland_displaytarget_display; 281aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 282aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke return &wlws->base; 283aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke} 284aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke 285aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke/* vim: set sw=3 ts=8 sts=3 expandtab: */ 286