static void vmw_svga_winsys_buffer_unmap(struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf) { (void)sws; pb_unmap(vmw_pb_buffer(buf)); }
static void vmw_swc_region_relocation(struct svga_winsys_context *swc, struct SVGAGuestPtr *where, struct svga_winsys_buffer *buffer, uint32 offset, unsigned flags) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_buffer_relocation *reloc; assert(vswc->region.staged < vswc->region.reserved); reloc = &vswc->region.relocs[vswc->region.used + vswc->region.staged]; reloc->region.where = where; /* * pb_validate holds a refcount to the buffer, so no need to * refcount it again in the relocation. */ reloc->buffer = vmw_pb_buffer(buffer); reloc->offset = offset; reloc->is_mob = FALSE; ++vswc->region.staged; if (vmw_swc_add_validate_buffer(vswc, reloc->buffer, flags)) { vswc->seen_regions += reloc->buffer->size; if(vswc->seen_regions >= VMW_GMR_POOL_SIZE/5) vswc->preemptive_flush = TRUE; } #ifdef DEBUG if (!(flags & SVGA_RELOC_INTERNAL)) debug_flush_cb_reference(vswc->fctx, vmw_debug_flush_buf(buffer)); #endif }
static void vmw_svga_winsys_buffer_destroy(struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf) { struct pb_buffer *pbuf = vmw_pb_buffer(buf); (void)sws; pb_reference(&pbuf, NULL); }
static void * vmw_svga_winsys_buffer_map(struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf, unsigned flags) { (void)sws; return pb_map(vmw_pb_buffer(buf), flags, NULL); }
static void vmw_swc_mob_relocation(struct svga_winsys_context *swc, SVGAMobId *id, uint32 *offset_into_mob, struct svga_winsys_buffer *buffer, uint32 offset, unsigned flags) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_buffer_relocation *reloc; struct pb_buffer *pb_buffer = vmw_pb_buffer(buffer); if (id) { assert(vswc->region.staged < vswc->region.reserved); reloc = &vswc->region.relocs[vswc->region.used + vswc->region.staged]; reloc->mob.id = id; reloc->mob.offset_into_mob = offset_into_mob; /* * pb_validate holds a refcount to the buffer, so no need to * refcount it again in the relocation. */ reloc->buffer = pb_buffer; reloc->offset = offset; reloc->is_mob = TRUE; ++vswc->region.staged; } if (vmw_swc_add_validate_buffer(vswc, pb_buffer, flags)) { vswc->seen_mobs += pb_buffer->size; if ((swc->hints & SVGA_HINT_FLAG_CAN_PRE_FLUSH) && vswc->seen_mobs >= vswc->vws->ioctl.max_mob_memory / VMW_MAX_MOB_MEM_FACTOR) vswc->preemptive_flush = TRUE; } #ifdef DEBUG if (!(flags & SVGA_RELOC_INTERNAL)) debug_flush_cb_reference(vswc->fctx, vmw_debug_flush_buf(buffer)); #endif }
static void vmw_swc_mob_relocation(struct svga_winsys_context *swc, SVGAMobId *id, uint32 *offset_into_mob, struct svga_winsys_buffer *buffer, uint32 offset, unsigned flags) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_buffer_relocation *reloc; assert(vswc->region.staged < vswc->region.reserved); reloc = &vswc->region.relocs[vswc->region.used + vswc->region.staged]; reloc->mob.id = id; reloc->mob.offset_into_mob = offset_into_mob; /* * pb_validate holds a refcount to the buffer, so no need to * refcount it again in the relocation. */ reloc->buffer = vmw_pb_buffer(buffer); reloc->offset = offset; reloc->is_mob = TRUE; ++vswc->region.staged; if (vmw_swc_add_validate_buffer(vswc, reloc->buffer, flags)) { vswc->seen_mobs += reloc->buffer->size; /* divide by 5, tested for best performance */ if (vswc->seen_mobs >= vswc->vws->ioctl.max_mob_memory / 5) vswc->preemptive_flush = TRUE; } #ifdef DEBUG if (!(flags & SVGA_RELOC_INTERNAL)) debug_flush_cb_reference(vswc->fctx, vmw_debug_flush_buf(buffer)); #endif }