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