diff options
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_screen.h | 12 | ||||
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_screen_ioctl.c | 15 | ||||
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_screen_svga.c | 26 |
3 files changed, 29 insertions, 24 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_screen.h b/src/gallium/winsys/svga/drm/vmw_screen.h index f9da3693c58..b68bf431e5e 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen.h +++ b/src/gallium/winsys/svga/drm/vmw_screen.h @@ -119,15 +119,17 @@ vmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, uint32 vmw_ioctl_surface_create(struct vmw_winsys_screen *vws, - SVGA3dSurfaceFlags flags, - SVGA3dSurfaceFormat format, - SVGA3dSize size, - uint32 numFaces, - uint32 numMipLevels); + SVGA3dSurfaceFlags flags, + SVGA3dSurfaceFormat format, + unsigned usage, + SVGA3dSize size, + uint32 numFaces, + uint32 numMipLevels); uint32 vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws, SVGA3dSurfaceFlags flags, SVGA3dSurfaceFormat format, + unsigned usage, SVGA3dSize size, uint32 numFaces, uint32 numMipLevels, diff --git a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c index 501c047c32a..b7bedb1c26c 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c @@ -109,10 +109,11 @@ vmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, uint32 cid) uint32 vmw_ioctl_surface_create(struct vmw_winsys_screen *vws, - SVGA3dSurfaceFlags flags, - SVGA3dSurfaceFormat format, - SVGA3dSize size, - uint32_t numFaces, uint32_t numMipLevels) + SVGA3dSurfaceFlags flags, + SVGA3dSurfaceFormat format, + unsigned usage, + SVGA3dSize size, + uint32_t numFaces, uint32_t numMipLevels) { union drm_vmw_surface_create_arg s_arg; struct drm_vmw_surface_create_req *req = &s_arg.req; @@ -139,7 +140,7 @@ vmw_ioctl_surface_create(struct vmw_winsys_screen *vws, req->scanout = false; } req->format = (uint32_t) format; - req->shareable = 1; + req->shareable = !!(usage & SVGA_SURFACE_USAGE_SHARED); assert(numFaces * numMipLevels < DRM_VMW_MAX_SURFACE_FACES* DRM_VMW_MAX_MIP_LEVELS); @@ -180,6 +181,7 @@ uint32 vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws, SVGA3dSurfaceFlags flags, SVGA3dSurfaceFormat format, + unsigned usage, SVGA3dSize size, uint32_t numFaces, uint32_t numMipLevels, @@ -208,7 +210,8 @@ vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws, req->svga3d_flags = (uint32_t) flags; } req->format = (uint32_t) format; - req->drm_surface_flags |= drm_vmw_surface_flag_shareable; + if (usage & SVGA_SURFACE_USAGE_SHARED) + req->drm_surface_flags |= drm_vmw_surface_flag_shareable; req->drm_surface_flags |= drm_vmw_surface_flag_create_buffer; assert(numFaces * numMipLevels < DRM_VMW_MAX_SURFACE_FACES* diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index bfba2038559..6d592f2a957 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -135,6 +135,7 @@ static struct svga_winsys_surface * vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, SVGA3dSurfaceFlags flags, SVGA3dSurfaceFormat format, + unsigned usage, SVGA3dSize size, uint32 numFaces, uint32 numMipLevels) @@ -142,7 +143,7 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); struct vmw_svga_winsys_surface *surface; struct vmw_buffer_desc desc; - struct pb_manager *provider = vws->pools.mob_fenced; + struct pb_manager *provider; uint32_t buffer_size; @@ -155,6 +156,8 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, p_atomic_set(&surface->validated, 0); surface->screen = vws; pipe_mutex_init(surface->mutex); + surface->shared = !!(usage & SVGA_SURFACE_USAGE_SHARED); + provider = (surface->shared) ? vws->pools.gmr : vws->pools.mob_fenced; /* * Used for the backing buffer GB surfaces, and to approximate @@ -169,7 +172,7 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, * buffer out of the buffer cache. Otherwise, let the kernel allocate * a suitable buffer for us. */ - if (buffer_size < VMW_TRY_CACHED_SIZE) { + if (buffer_size < VMW_TRY_CACHED_SIZE && !surface->shared) { struct pb_buffer *pb_buf; surface->size = buffer_size; @@ -181,10 +184,9 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, assert(0); } - surface->sid = vmw_ioctl_gb_surface_create(vws, - flags, format, size, - numFaces, numMipLevels, - ptr.gmrId, + surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, + size, numFaces, + numMipLevels, ptr.gmrId, surface->buf ? NULL : &desc.region); @@ -198,10 +200,9 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, */ vmw_svga_winsys_buffer_destroy(sws, surface->buf); surface->buf = NULL; - surface->sid = vmw_ioctl_gb_surface_create(vws, - flags, format, size, - numFaces, numMipLevels, - 0, + surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, + size, numFaces, + numMipLevels, 0, &desc.region); if (surface->sid == SVGA3D_INVALID_ID) goto no_sid; @@ -227,9 +228,8 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, } } } else { - surface->sid = vmw_ioctl_surface_create(vws, - flags, format, size, - numFaces, numMipLevels); + surface->sid = vmw_ioctl_surface_create(vws, flags, format, usage, + size, numFaces, numMipLevels); if(surface->sid == SVGA3D_INVALID_ID) goto no_sid; |