1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.  All rights reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SVGA buffer manager for Guest Memory Regions (GMRs).
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GMRs are used for pixel and vertex data upload/download to/from the virtual
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SVGA hardware. There is a limited number of GMRs available, and
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * creating/destroying them is also a slow operation so we must suballocate
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * them.
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This file implements a pipebuffer library's buffer manager, so that we can
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use pipepbuffer's suballocation, fencing, and debugging facilities with GMRs.
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jfonseca@vmware.com>
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_cmd.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipebuffer/pb_buffer.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipebuffer/pb_bufmgr.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_winsys.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vmw_screen.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vmw_buffer.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vmw_gmr_bufmgr;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vmw_gmr_buffer
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pb_buffer base;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_bufmgr *mgr;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_region *region;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *map;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern const struct pb_vtbl vmw_gmr_buffer_vtbl;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct vmw_gmr_buffer *
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer(struct pb_buffer *buf)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(buf);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(buf->vtbl == &vmw_gmr_buffer_vtbl);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct vmw_gmr_buffer *)buf;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vmw_gmr_bufmgr
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pb_manager base;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_winsys_screen *vws;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct vmw_gmr_bufmgr *
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr(struct pb_manager *mgr)
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mgr);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct vmw_gmr_bufmgr *)mgr;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_destroy(struct pb_buffer *_buf)
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_ioctl_region_unmap(buf->region);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_ioctl_region_destroy(buf->region);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(buf);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_map(struct pb_buffer *_buf,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   unsigned flags,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   void *flush_ctx)
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return buf->map;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_unmap(struct pb_buffer *_buf)
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do nothing */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void)_buf;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_get_base_buffer(struct pb_buffer *buf,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct pb_buffer **base_buf,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned *offset)
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *base_buf = buf;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *offset = 0;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_error
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_validate( struct pb_buffer *_buf,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct pb_validate *vl,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned flags )
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Always pinned */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return PIPE_OK;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_buffer_fence( struct pb_buffer *_buf,
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      struct pipe_fence_handle *fence )
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We don't need to do anything, as the pipebuffer library
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * will take care of delaying the destruction of fenced buffers */
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct pb_vtbl vmw_gmr_buffer_vtbl = {
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_destroy,
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_map,
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_unmap,
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_validate,
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_fence,
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_gmr_buffer_get_base_buffer
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pb_buffer *
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr_create_buffer(struct pb_manager *_mgr,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         pb_size size,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const struct pb_desc *desc)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_winsys_screen *vws = mgr->vws;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_buffer *buf;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf = CALLOC_STRUCT(vmw_gmr_buffer);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!buf)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error1;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_reference_init(&buf->base.reference, 1);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->base.alignment = desc->alignment;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->base.usage = desc->usage;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->base.size = size;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->base.vtbl = &vmw_gmr_buffer_vtbl;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->mgr = mgr;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->region = vmw_ioctl_region_create(vws, size);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!buf->region)
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error2;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf->map = vmw_ioctl_region_map(buf->region);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!buf->map)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error3;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &buf->base;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror3:
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vmw_ioctl_region_destroy(buf->region);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror2:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(buf);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror1:
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr_flush(struct pb_manager *mgr)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* No-op */
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr_destroy(struct pb_manager *_mgr)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(mgr);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pb_manager *
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr_create(struct vmw_winsys_screen *vws)
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_bufmgr *mgr;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mgr = CALLOC_STRUCT(vmw_gmr_bufmgr);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!mgr)
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mgr->base.destroy = vmw_gmr_bufmgr_destroy;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mgr->base.create_buffer = vmw_gmr_bufmgr_create_buffer;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mgr->base.flush = vmw_gmr_bufmgr_flush;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mgr->vws = vws;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &mgr->base;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvmw_gmr_bufmgr_region_ptr(struct pb_buffer *buf,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct SVGAGuestPtr *ptr)
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pb_buffer *base_buf;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned offset = 0;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vmw_gmr_buffer *gmr_buf;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pb_get_base_buffer( buf, &base_buf, &offset );
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gmr_buf = vmw_gmr_buffer(base_buf);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!gmr_buf)
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *ptr = vmw_ioctl_region_ptr(gmr_buf->region);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ptr->offset += offset;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
260