summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/svga/svga_screen_cache.c2
-rw-r--r--src/gallium/drivers/svga/svga_winsys.h15
-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
5 files changed, 44 insertions, 26 deletions
diff --git a/src/gallium/drivers/svga/svga_screen_cache.c b/src/gallium/drivers/svga/svga_screen_cache.c
index 71dc72e7b8a..307af1b6bf2 100644
--- a/src/gallium/drivers/svga/svga_screen_cache.c
+++ b/src/gallium/drivers/svga/svga_screen_cache.c
@@ -449,6 +449,8 @@ svga_screen_surface_create(struct svga_screen *svgascreen,
handle = sws->surface_create(sws,
key->flags,
key->format,
+ key->cachable ?
+ 0 : SVGA_SURFACE_USAGE_SHARED,
key->size,
key->numFaces,
key->numMipLevels);
diff --git a/src/gallium/drivers/svga/svga_winsys.h b/src/gallium/drivers/svga/svga_winsys.h
index f1f92376108..879321f745c 100644
--- a/src/gallium/drivers/svga/svga_winsys.h
+++ b/src/gallium/drivers/svga/svga_winsys.h
@@ -79,6 +79,7 @@ struct winsys_handle;
#define SVGA_FENCE_FLAG_EXEC (1 << 0)
#define SVGA_FENCE_FLAG_QUERY (1 << 1)
+#define SVGA_SURFACE_USAGE_SHARED (1 << 0)
/** Opaque surface handle */
struct svga_winsys_surface;
@@ -252,8 +253,17 @@ struct svga_winsys_screen
/**
- * This creates a "surface" object in the SVGA3D device,
- * and returns the surface ID (sid). Surfaces are generic
+ * This creates a "surface" object in the SVGA3D device.
+ *
+ * \param sws Pointer to an svga_winsys_context
+ * \param flags Device surface create flags
+ * \param format Format Device surface format
+ * \param usage Winsys usage: bitmask of SVGA_SURFACE_USAGE_x flags
+ * \param size Surface size given in device format
+ * \param numFaces Number of faces of the surface (1 or 6)
+ * \param numMipLevels Number of mipmap levels for each face
+ *
+ * Returns the surface ID (sid). Surfaces are generic
* containers for host VRAM objects like textures, vertex
* buffers, and depth/stencil buffers.
*
@@ -284,6 +294,7 @@ struct svga_winsys_screen
(*surface_create)(struct svga_winsys_screen *sws,
SVGA3dSurfaceFlags flags,
SVGA3dSurfaceFormat format,
+ unsigned usage,
SVGA3dSize size,
uint32 numFaces,
uint32 numMipLevels);
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;