void vmw_svga_winsys_surface_unmap(struct svga_winsys_context *swc, struct svga_winsys_surface *srf, boolean *rebind) { struct vmw_svga_winsys_surface *vsrf = vmw_svga_winsys_surface(srf); pipe_mutex_lock(vsrf->mutex); if (--vsrf->mapcount == 0) { *rebind = vsrf->rebind; vsrf->rebind = FALSE; vmw_svga_winsys_buffer_unmap(&vsrf->screen->base, vsrf->buf); } pipe_mutex_unlock(vsrf->mutex); }
struct svga_winsys_gb_shader * vmw_svga_winsys_shader_create(struct svga_winsys_screen *sws, SVGA3dShaderType type, const uint32 *bytecode, uint32 bytecodeLen) { struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); struct vmw_svga_winsys_shader *shader; void *code; shader = CALLOC_STRUCT(vmw_svga_winsys_shader); if(!shader) goto out_no_shader; pipe_reference_init(&shader->refcnt, 1); p_atomic_set(&shader->validated, 0); shader->screen = vws; shader->buf = vmw_svga_winsys_buffer_create(sws, 64, SVGA_BUFFER_USAGE_SHADER, bytecodeLen); if (!shader->buf) goto out_no_buf; code = vmw_svga_winsys_buffer_map(sws, shader->buf, PIPE_TRANSFER_WRITE); if (!code) goto out_no_buf; memcpy(code, bytecode, bytecodeLen); vmw_svga_winsys_buffer_unmap(sws, shader->buf); if (!sws->have_vgpu10) { shader->shid = vmw_ioctl_shader_create(vws, type, bytecodeLen); if (shader->shid == SVGA3D_INVALID_ID) goto out_no_shid; } return svga_winsys_shader(shader); out_no_shid: vmw_svga_winsys_buffer_destroy(sws, shader->buf); out_no_buf: FREE(shader); out_no_shader: return NULL; }