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