X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fgallium%2Fwinsys%2Fsvga%2Fdrm%2Fvmw_surface.c;fp=src%2Fgallium%2Fwinsys%2Fsvga%2Fdrm%2Fvmw_surface.c;h=25c6d320c7408447ce687afe5265aa071098079f;hp=f6f40fcdf209abf108dc394c8f217e65445ef736;hb=f41848a9df3c6eb81059edfd63347584790e0a3a;hpb=090239ea6b7fee79643960cbc361e4ec577c7be9 diff --git a/src/gallium/winsys/svga/drm/vmw_surface.c b/src/gallium/winsys/svga/drm/vmw_surface.c index f6f40fcdf20..25c6d320c74 100644 --- a/src/gallium/winsys/svga/drm/vmw_surface.c +++ b/src/gallium/winsys/svga/drm/vmw_surface.c @@ -44,15 +44,15 @@ vmw_svga_winsys_surface_init(struct svga_winsys_screen *sws, struct pb_buffer *pb_buf; uint32_t pb_flags; struct vmw_winsys_screen *vws = vsrf->screen; - pb_flags = PIPE_TRANSFER_READ_WRITE | PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; + pb_flags = PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; struct pb_manager *provider; struct pb_desc desc; - data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf, - PIPE_TRANSFER_DONTBLOCK | pb_flags); + mtx_lock(&vsrf->mutex); + data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf, pb_flags); if (data) - goto out_unlock; + goto out_mapped; provider = vws->pools.mob_fenced; memset(&desc, 0, sizeof(desc)); @@ -64,24 +64,25 @@ vmw_svga_winsys_surface_init(struct svga_winsys_screen *sws, data = vmw_svga_winsys_buffer_map(&vws->base, vbuf, pb_flags); if (data) { - if (vsrf->buf) { + vsrf->rebind = TRUE; + if (vsrf->buf) vmw_svga_winsys_buffer_destroy(&vws->base, vsrf->buf); - vsrf->buf = vbuf; - goto out_unlock; - } else - vmw_svga_winsys_buffer_destroy(&vws->base, vbuf); + vsrf->buf = vbuf; + goto out_mapped; + } else { + vmw_svga_winsys_buffer_destroy(&vws->base, vbuf); + goto out_unlock; } } - - data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf, pb_flags); - if (data == NULL) + else { + /* Cannot create a buffer, just unlock */ goto out_unlock; + } -out_unlock: +out_mapped: mtx_unlock(&vsrf->mutex); - if (data) - { + if (data) { if (flags & SVGA3D_SURFACE_BIND_STREAM_OUTPUT) { memset(data, 0, surf_size + sizeof(SVGA3dDXSOState)); } @@ -89,8 +90,10 @@ out_unlock: memset(data, 0, surf_size); } } + mtx_lock(&vsrf->mutex); vmw_svga_winsys_buffer_unmap(&vsrf->screen->base, vsrf->buf); +out_unlock: mtx_unlock(&vsrf->mutex); }