13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/** 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * @file 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA buffer manager for Guest Memory Regions (GMRs). 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * GMRs are used for pixel and vertex data upload/download to/from the virtual 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA hardware. There is a limited number of GMRs available, and 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * creating/destroying them is also a slow operation so we must suballocate 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * them. 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This file implements a pipebuffer library's buffer manager, so that we can 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * use pipepbuffer's suballocation, fencing, and debugging facilities with GMRs. 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * @author Jose Fonseca <jfonseca@vmware.com> 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 4428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipebuffer/pb_buffer.h" 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipebuffer/pb_bufmgr.h" 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h" 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_screen.h" 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_buffer.h" 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_gmr_bufmgr; 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_gmr_buffer 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_buffer base; 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_bufmgr *mgr; 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_region *region; 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *map; 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzextern const struct pb_vtbl vmw_gmr_buffer_vtbl; 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE struct vmw_gmr_buffer * 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer(struct pb_buffer *buf) 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(buf); 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(buf->vtbl == &vmw_gmr_buffer_vtbl); 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return (struct vmw_gmr_buffer *)buf; 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_gmr_bufmgr 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_manager base; 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_winsys_screen *vws; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE struct vmw_gmr_bufmgr * 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr(struct pb_manager *mgr) 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(mgr); 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return (struct vmw_gmr_bufmgr *)mgr; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_destroy(struct pb_buffer *_buf) 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf); 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_ioctl_region_unmap(buf->region); 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_ioctl_region_destroy(buf->region); 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(buf); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void * 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_map(struct pb_buffer *_buf, 11263c0a504a02baf95d34f06d7d9e9ae3fb8e952d4José Fonseca unsigned flags, 11363c0a504a02baf95d34f06d7d9e9ae3fb8e952d4José Fonseca void *flush_ctx) 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf); 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return buf->map; 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_unmap(struct pb_buffer *_buf) 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Do nothing */ 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (void)_buf; 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_get_base_buffer(struct pb_buffer *buf, 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_buffer **base_buf, 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned *offset) 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *base_buf = buf; 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *offset = 0; 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_validate( struct pb_buffer *_buf, 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_validate *vl, 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned flags ) 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Always pinned */ 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_buffer_fence( struct pb_buffer *_buf, 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle *fence ) 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* We don't need to do anything, as the pipebuffer library 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * will take care of delaying the destruction of fenced buffers */ 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzconst struct pb_vtbl vmw_gmr_buffer_vtbl = { 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_destroy, 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_map, 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_unmap, 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_validate, 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_fence, 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_gmr_buffer_get_base_buffer 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct pb_buffer * 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr_create_buffer(struct pb_manager *_mgr, 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz pb_size size, 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct pb_desc *desc) 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr); 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_winsys_screen *vws = mgr->vws; 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_buffer *buf; 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz buf = CALLOC_STRUCT(vmw_gmr_buffer); 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!buf) 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto error1; 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1804682e706012fe26627a2f827db01b5068cc62814Marek Olšák pipe_reference_init(&buf->base.reference, 1); 1814682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.alignment = desc->alignment; 1824682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.usage = desc->usage; 1834682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.size = size; 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz buf->base.vtbl = &vmw_gmr_buffer_vtbl; 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz buf->mgr = mgr; 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz buf->region = vmw_ioctl_region_create(vws, size); 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!buf->region) 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto error2; 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz buf->map = vmw_ioctl_region_map(buf->region); 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!buf->map) 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto error3; 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &buf->base; 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzerror3: 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz vmw_ioctl_region_destroy(buf->region); 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzerror2: 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(buf); 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzerror1: 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr_flush(struct pb_manager *mgr) 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* No-op */ 2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr_destroy(struct pb_manager *_mgr) 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr); 2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(mgr); 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct pb_manager * 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr_create(struct vmw_winsys_screen *vws) 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_bufmgr *mgr; 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz mgr = CALLOC_STRUCT(vmw_gmr_bufmgr); 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!mgr) 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz mgr->base.destroy = vmw_gmr_bufmgr_destroy; 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz mgr->base.create_buffer = vmw_gmr_bufmgr_create_buffer; 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz mgr->base.flush = vmw_gmr_bufmgr_flush; 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz mgr->vws = vws; 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &mgr->base; 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzboolean 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_gmr_bufmgr_region_ptr(struct pb_buffer *buf, 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct SVGAGuestPtr *ptr) 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_buffer *base_buf; 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned offset = 0; 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_gmr_buffer *gmr_buf; 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz pb_get_base_buffer( buf, &base_buf, &offset ); 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz gmr_buf = vmw_gmr_buffer(base_buf); 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!gmr_buf) 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return FALSE; 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *ptr = vmw_ioctl_region_ptr(gmr_buf->region); 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ptr->offset += offset; 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return TRUE; 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 260