static void vmw_swc_surface_relocation(struct svga_winsys_context *swc, uint32 *where, uint32 *mobid, struct svga_winsys_surface *surface, unsigned flags) { struct vmw_svga_winsys_surface *vsurf; assert(swc->have_gb_objects || mobid == NULL); if(!surface) { *where = SVGA3D_INVALID_ID; if (mobid) *mobid = SVGA3D_INVALID_ID; return; } vsurf = vmw_svga_winsys_surface(surface); vmw_swc_surface_only_relocation(swc, where, vsurf, flags); if (swc->have_gb_objects && vsurf->buf != NULL) { /* * Make sure backup buffer ends up fenced. */ pipe_mutex_lock(vsurf->mutex); assert(vsurf->buf != NULL); vmw_swc_mob_relocation(swc, mobid, NULL, (struct svga_winsys_buffer *) vsurf->buf, 0, flags); pipe_mutex_unlock(vsurf->mutex); } }
static void vmw_swc_query_relocation(struct svga_winsys_context *swc, SVGAMobId *id, struct svga_winsys_gb_query *query) { /* Queries are backed by one big MOB */ vmw_swc_mob_relocation(swc, id, NULL, query->buf, 0, SVGA_RELOC_READ | SVGA_RELOC_WRITE); }
static void vmw_swc_shader_relocation(struct svga_winsys_context *swc, uint32 *shid, uint32 *mobid, uint32 *offset, struct svga_winsys_gb_shader *shader, unsigned flags) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_winsys_screen *vws = vswc->vws; struct vmw_svga_winsys_shader *vshader; struct vmw_ctx_validate_item *ishader; if(!shader) { *shid = SVGA3D_INVALID_ID; return; } vshader = vmw_svga_winsys_shader(shader); if (!vws->base.have_vgpu10) { assert(vswc->shader.staged < vswc->shader.reserved); ishader = util_hash_table_get(vswc->hash, vshader); if (ishader == NULL) { ishader = &vswc->shader.items[vswc->shader.used + vswc->shader.staged]; vmw_svga_winsys_shader_reference(&ishader->vshader, vshader); ishader->referenced = FALSE; /* * Note that a failure here may just fall back to unhashed behavior * and potentially cause unnecessary flushing, so ignore the * return code. */ (void) util_hash_table_set(vswc->hash, vshader, ishader); ++vswc->shader.staged; } if (!ishader->referenced) { ishader->referenced = TRUE; p_atomic_inc(&vshader->validated); } } if (shid) *shid = vshader->shid; if (vshader->buf) vmw_swc_mob_relocation(swc, mobid, offset, vshader->buf, 0, SVGA_RELOC_READ); }