summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/svga/drm/vmw_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/svga/drm/vmw_buffer.c')
-rw-r--r--src/gallium/winsys/svga/drm/vmw_buffer.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_buffer.c b/src/gallium/winsys/svga/drm/vmw_buffer.c
index e2ddf78ed2e..03db92a6481 100644
--- a/src/gallium/winsys/svga/drm/vmw_buffer.c
+++ b/src/gallium/winsys/svga/drm/vmw_buffer.c
@@ -63,6 +63,7 @@ struct vmw_gmr_buffer
struct vmw_region *region;
void *map;
unsigned map_flags;
+ unsigned map_count;
};
@@ -104,8 +105,12 @@ vmw_gmr_buffer_destroy(struct pb_buffer *_buf)
{
struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf);
- vmw_ioctl_region_unmap(buf->region);
-
+ assert(buf->map_count == 0);
+ if (buf->map) {
+ assert(buf->mgr->vws->cache_maps);
+ vmw_ioctl_region_unmap(buf->region);
+ }
+
vmw_ioctl_region_destroy(buf->region);
FREE(buf);
@@ -126,7 +131,6 @@ vmw_gmr_buffer_map(struct pb_buffer *_buf,
if (!buf->map)
return NULL;
-
if ((_buf->usage & VMW_BUFFER_USAGE_SYNC) &&
!(flags & PB_USAGE_UNSYNCHRONIZED)) {
ret = vmw_ioctl_syncforcpu(buf->region,
@@ -137,6 +141,7 @@ vmw_gmr_buffer_map(struct pb_buffer *_buf,
return NULL;
}
+ buf->map_count++;
return buf->map;
}
@@ -153,6 +158,12 @@ vmw_gmr_buffer_unmap(struct pb_buffer *_buf)
!(flags & PB_USAGE_CPU_WRITE),
FALSE);
}
+
+ assert(buf->map_count > 0);
+ if (!--buf->map_count && !buf->mgr->vws->cache_maps) {
+ vmw_ioctl_region_unmap(buf->region);
+ buf->map = NULL;
+ }
}