summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/svga/drm/vmw_screen.h12
-rw-r--r--src/gallium/winsys/svga/drm/vmw_screen_ioctl.c15
-rw-r--r--src/gallium/winsys/svga/drm/vmw_screen_svga.c26
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;